KhnhTrungTrn

  • Mar 18, 2024
  • Joined Dec 30, 2023
  • 0 best answers
  • I have tried this code to deploy my blob file but it did not work, the camera frame froze. Though, my custom model worked perfectly when I deployed it with the depthai_demo.py code.

    import cv2
    import depthai as dai
    import time
    import blobconverter
    
    
    FRAME_SIZE = (640, 360)
    DET_INPUT_SIZE = (320, 320)
    
    blob_path = "/home/trungtran/catkin_ws/src/task_exe/src/best.blob"
    
    pipeline = dai.Pipeline()
    
    # Define a source - color camera
    cam = pipeline.createColorCamera()
    cam.setPreviewSize(FRAME_SIZE[0], FRAME_SIZE[1])
    cam.setInterleaved(False)
    cam.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P)
    cam.setBoardSocket(dai.CameraBoardSocket.RGB)
    
    mono_left = pipeline.createMonoCamera()
    mono_left.setResolution(dai.MonoCameraProperties.SensorResolution.THE_400_P)
    mono_left.setBoardSocket(dai.CameraBoardSocket.LEFT)
    mono_right = pipeline.createMonoCamera()
    mono_right.setResolution(dai.MonoCameraProperties.SensorResolution.THE_400_P)
    mono_right.setBoardSocket(dai.CameraBoardSocket.RIGHT)
    
    	
    stereo = pipeline.createStereoDepth()
    mono_left.out.link(stereo.left)
    mono_right.out.link(stereo.right)
    
    
    # Define a neural network model
    tomato_spac_det_nn = pipeline.createYoloSpatialDetectionNetwork()
    tomato_spac_det_nn.setConfidenceThreshold(0.5)
    tomato_spac_det_nn.setBlobPath(blob_path)
    tomato_spac_det_nn.setDepthLowerThreshold(100)
    tomato_spac_det_nn.setDepthUpperThreshold(5000)
    
    tomato_det_manip = pipeline.createImageManip()
    tomato_det_manip.initialConfig.setResize(DET_INPUT_SIZE[0], DET_INPUT_SIZE[1])
    tomato_det_manip.setMaxOutputFrameSize(1244160)
    tomato_det_manip.setWaitForConfigInput(True)
    tomato_det_manip.initialConfig.setKeepAspectRatio(False)
    
    cam.preview.link(face_det_manip.inputImage)
    tomato_det_manip.out.link(tomato_spac_det_nn.input)
    stereo.depth.link(tomato_spac_det_nn.inputDepth)
    # Define the link between the color camera and the neural network
    x_preview_out = pipeline.createXLinkOut()
    x_preview_out.setStreamName("preview")
    cam.preview.link(x_preview_out.input)
    # rgb.preview.link(rgb_out.input)
    
    # Create an output for the object detection results
    det_out = pipeline.createXLinkOut()
    det_out.setStreamName('det_out')
    face_spac_det_nn.out.link(det_out.input)
    
    def display_info(frame, bbox, coordinates, status, status_color, fps):
        # Display bounding box
        cv2.rectangle(frame, bbox, status_color[status], 2)
     
        # Display coordinates
        if coordinates is not None:
            coord_x, coord_y, coord_z = coordinates
            cv2.putText(frame, f"X: {int(coord_x)} mm", (bbox[0] + 10, bbox[1] + 20), cv2.FONT_HERSHEY_TRIPLEX, 0.5, 255)
            cv2.putText(frame, f"Y: {int(coord_y)} mm", (bbox[0] + 10, bbox[1] + 35), cv2.FONT_HERSHEY_TRIPLEX, 0.5, 255)
            cv2.putText(frame, f"Z: {int(coord_z)} mm", (bbox[0] + 10, bbox[1] + 50), cv2.FONT_HERSHEY_TRIPLEX, 0.5, 255)
     
        # Create background for showing details
        cv2.rectangle(frame, (5, 5, 175, 100), (50, 0, 0), -1)
     
        # Display authentication status on the frame
        cv2.putText(frame, status, (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.5, status_color[status])
     
        # Display instructions on the frame
        cv2.putText(frame, f'FPS: {fps:.2f}', (20, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255))
    # Frame count
    frame_count = 0
     
    # Placeholder fps value
    fps = 0
     
    # Used to record the time when we processed last frames
    prev_frame_time = 0
     
    # Used to record the time at which we processed current frames
    new_frame_time = 0
     
    # Set status colors
    status_color = {
        'Tomato Detected': (0, 255, 0),
        'No Tomato Detected': (0, 0, 255)
    }
    # Create a DepthAI device and start the pipeline
    with dai.Device(pipeline) as device:
     
        # Output queue will be used to get the right camera frames from the outputs defined above
        q_cam = device.getOutputQueue(name="preview", maxSize=4, blocking=False)
     
        # Output queue will be used to get nn data from the video frames.
        q_det = device.getOutputQueue(name="det_out")
     
        # # Output queue will be used to get nn data from the video frames.
        # q_bbox_depth_mapping = device.getOutputQueue(name="bbox_depth_mapping_out", maxSize=4, blocking=False)
     
        while True:
            # Get right camera frame
            in_cam = q_cam.get()
            frame = in_cam.getCvFrame()
     
            bbox = None
            coordinates = None
     
            inDet = q_det.tryGet()
     
            if inDet is not None:
                detections = inDet.detections
     
                # if face detected
                if len(detections) != 0:
                    detection = detections[0]
     
                    # Correct bounding box
                    xmin = max(0, detection.xmin)
                    ymin = max(0, detection.ymin)
                    xmax = min(detection.xmax, 1)
                    ymax = min(detection.ymax, 1)
     
                    # Calculate coordinates
                    x = int(xmin*FRAME_SIZE[0])
                    y = int(ymin*FRAME_SIZE[1])
                    w = int(xmax*FRAME_SIZE[0]-xmin*FRAME_SIZE[0])
                    h = int(ymax*FRAME_SIZE[1]-ymin*FRAME_SIZE[1])
     
                    bbox = (x, y, w, h)
     
                    # Get spacial coordinates
                    coord_x = detection.spatialCoordinates.x
                    coord_y = detection.spatialCoordinates.y
                    coord_z = detection.spatialCoordinates.z
     
                    coordinates = (coord_x, coord_y, coord_z)
     
           
            if bbox:
                # Tomato detected
                status = 'Tomato Detected'
            else:
                # No tomato detected
                status = 'No Tomato Detected'
     
            # Display info on frame
            display_info(frame, bbox, coordinates, status, status_color, fps)
     
            # Calculate average fps
            if frame_count % 10 == 0:
                # Time when we finish processing last 100 frames
                new_frame_time = time.time()
     
                # Fps will be number of frame processed in one second
                fps = 1 / ((new_frame_time - prev_frame_time)/10)
                prev_frame_time = new_frame_time
     
            # Capture the key pressed
            key_pressed = cv2.waitKey(1) & 0xff
     
            # Stop the program if Esc key was pressed
            if key_pressed == 27:
                break
     
            # Display the final frame
            cv2.imshow("Face Cam", frame)
     
            # Increment frame count
            # frame_count += 1
     
    cv2.destroyAllWindows()
    • If I have already had a blob file for my own custom model ( I convert from yolov8 .pt file), then how can I simply deploy it with depth measurement ? Is there any example ?

      • I trained an object detection model on Roboflow

        Model Type: Roboflow 3.0 Object Detection (Fast)

        Checkpoint: COCOn

        I also tried to use the "blobconverter.from_zoo()" to deploy the pt "face-detection-retail-0004" model from depthai zoo and it's kind of showing the similar error

        Model face-detection-retail-0004 not found in model zoo

        Conversion failed due to 400 Client Error: BAD REQUEST for url: https://blobconverter.luxonis.com/compile?version=2022.1&no_cache=False

        Trying to find backup... (model="face-detection-retail-0004", shaves="6", version="2022.1")

        Unable to fetch model from backup server due to: 404 Client Error: Not Found for url: https://artifacts.luxonis.com/artifactory/blobconverter-backup/blobs/face-detection-retail-0004_openvino_2022.1_6shave.blob

      • Hi,

        I'm using this demo here to deploy a model trained from Roboflow but an error show up like this

        {

        "exit_code": 1,
        
        "message": "Command failed with exit code 1, command: /opt/intel/openvino2021_4/deployment_tools/inference_engine/lib/intel64/myriad_compile -m /tmp/blobconverter/3ff28ee84d3c414bac9cfbd7531346d9/ripetomatodetection_1/FP16/ripetomatodetection_1.xml -o /tmp/blobconverter/3ff28ee84d3c414bac9cfbd7531346d9/ripetomatodetection_1/FP16/ripetomatodetection_1.blob -c /tmp/blobconverter/3ff28ee84d3c414bac9cfbd7531346d9/myriad_compile_config.txt -ip U8",
        
        "stderr": "Unknown model format! Cannot find reader for model format: xml and read the model: /tmp/blobconverter/3ff28ee84d3c414bac9cfbd7531346d9/ripetomatodetection_1/FP16/ripetomatodetection_1.xml. Please check that reader library exists in your PATH.\\n",
        
        "stdout": "Inference Engine: \\n\\tIE version ......... 2021.4.2\\n\\tBuild ........... 2021.4.2-3974-e2a469a3450-releases/2021/4\\n"

        }

        Raise HTTPError(http_error_msg, response=self)

        requests.exceptions.HTTPError: 400 Client Error: BAD REQUEST for url: https://blobconverter.luxonis.com/compile?version=2021.4&no_cache=False

        How to fix it? Thank you very much!

      • Hi everyone,

        I'm currently working on a project to detect various color pastes using OAK-D. I have been able to detect colors and get their centroid of contour. Right now, I'm trying to use stereo depth to get the distance from the camera to the color's bottle, but quite didn't get the concept. Could someone help me with some instruction ? Thank you a lot!