Bu yazıda, sadece RAiV kullanarak nesneleri tespit edeceğiz, sahnenin derinlik haritasını tahmin edeceğiz ve ardından derinlik haritası ve kamera parametrelerini kullanarak tespit edilen nesnelerin 3 boyutlu konumunu belirleyeceğiz.

Şimdiye Kadar Ne Yaptık

Önceki yazılarda şunları nasıl yapacağımızı gösterdik:

Şimdi, tespit edilen nesnelerin 3 boyutlu konumunu elde etmek için önceki kodları birleştirme ve genişletme zamanı.

Zorluk: Görüntü Düzeltme

Önceki derinlik tahmini yazısında, derinlik haritasını yakından incelediyseniz, derinlik haritasının, stereo görüntü çiftlerinden hiçbiriyle mükemmel bir şekilde hizalanmadığını fark etmişsinizdir. Bunun nedeni, derinlik tahmini yapılmadan önce stereo görüntü çiftinin yatay olarak mükemmel bir şekilde hizalanması için düzeltilmiş olmasıdır.

Görüntü düzeltme nedir?

Görüntü düzeltme, iki görüntüyü (sol ve sağ kameralardan) geometrik olarak dönüştürerek, sanki mükemmel bir şekilde yatay olarak hizalanmış iki kamera tarafından çekilmiş gibi görünmelerini sağlama işlemidir.

Stereodan derinlik hesaplamasında yatay olarak hizalanmış kameralara sahip olmak önemlidir. Çünkü, görüntüler yatay olarak hizalanmışsa, yalnızca yatay bir eşitsizlik araması yaparız ve bu da derinlik haritası tahmin sürecini hızlandırır.

Ancak, gerçek dünyada kameraların mükemmel bir şekilde yatay olarak hizalanması zordur. Bu hizalama sorununu aşmak için görüntü düzeltme yöntemi geliştirilmiştir. Stereo kamera çiftinin kalibrasyonu sırasında, her kamera için düzeltme matrisleri tahmin edilir. Bu matrisler kullanılarak, stereo görüntüler mükemmel bir şekilde yatay olarak hizalanır.

Peki, ne olmuş yani?

Yani, stereo görüntü çiftinden tespit edilen nesne koordinatlarını tahmini derinlik haritasında kullanamazsınız. Nesne koordinatlarını düzeltilmiş koordinatlara dönüştürmeniz gerekmektedir.

Kodu Hazırlayın ve Yükleyin

Aşağıdaki kodda, önceki nesne tespiti ve derinlik haritası tahmin kodlarını birleştireceğiz, ardından bu kodların çıktısını ve kamera parametrelerini kullanarak nesneyi 3 boyutlu olarak konumlandıracağız.

Bu örneği, gerekli tüm modüllerle birlikte Github Depomuzda bulabilirsiniz. Lütfen örnek kodu github deposundan indirin ve web arayüzü aracılığıyla RAiV'e yükleyin.

# For accessing data pipeline
from qCU_Data import qCUData

# For Yolo Helper Functions
from YOLOv8ObjectDetector import YOLOv8ObjectDetector

# For Depth Estimation
from StereoDepthEstimator import StereoDepthEstimator
import depthUtils



def main():
    # Create interface
    theQCUData = qCUData()

    # Initialize shared memory
    if not theQCUData.init():
        print("Failed to initialize shared memory")
        return

    # Initialize COCO classes
    COCO_CLASSES = [
        "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train",
        "truck", "boat", "traffic light", "fire hydrant", "stop sign",
        "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep",
        "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella",
        "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard",
        "sports ball", "kite", "baseball bat", "baseball glove", "skateboard",
        "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork",
        "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange",
        "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair",
        "couch", "potted plant", "bed", "dining table", "toilet", "tv",
        "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave",
        "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase",
        "scissors", "teddy bear", "hair drier", "toothbrush"
    ]

    # Initialize Yolo detector post processor
    objDetector = YOLOv8ObjectDetector(ai_classes=COCO_CLASSES, confidence_threshold=0.5, iou_threshold=0.45)

    # Initialize OpenCV's depth estimation algorithms
    depthScale = 0.5
    depthMinMM = 250 #50.0
    depthMaxMM = 650 #5500.0
    depthEstimator = StereoDepthEstimator(
        scale_factor=depthScale,
        # The depth values are in milimeters ("mm")
        min_depth=depthMinMM,
        max_depth=depthMaxMM,
    )

    # Enter processing loop
    try:
        while True:
            # Get Ai data
            ai_data = theQCUData.getDataAi()
            if ai_data:
                if 'error' in ai_data:
                    print(f"Error occurred: {ai_data['error']}")
                else:
                    # Postprocess the ai_data
                    detected_objects = objDetector.detect_objects(ai_data)

                    # NOTE: 1. We are processing AI output images. Stereo camera output can also be processed
                    #       2. Due to the stereo camera setup the output depth map size is 726x585

                    # Process Ai processor output images
                    depthMap = depthUtils.getDepthFromStereo(ai_data, memConfig, depthEstimator)

                    # Get the image ai preprocessing parameters
                    aiHeader = ai_data['header']
                    aiPrepro = aiHeader.imPreproPrms

                    detected_objsNDepth_image = []
                    for obj in detected_objects:

                        # Convert yolo coordinates to image coordinates
                        bbox_img_float = objDetector.yolo_to_coords_float(aiPrepro, obj['bbox'])
                        bbox_img_int = [int(coord) for coord in bbox_img_float]

                        # For lens EFL 2.8mm
                        lensHFov = 81.20; # degrees
                        lensVFov = 69.71; # degrees
                        ctrDirectionDegrees = objDetector.get_center_degree(aiPrepro, bbox_img_float, lensHFov, lensVFov)

                        # Get depth of the object
                        obj_depth_min, obj_depth_max, obj_depth_median = depthEstimator.get_depth_of_rect(depthMap, bbox_img_int)
                        detected_objsNDepth_image.append({
                            'class_id': obj['class_id'],
                            'class_name': obj['class_name'],
                            'confidence': obj['confidence'],
                            'bbox': bbox_img_int,
                            'depth_min': float(obj_depth_min),
                            'depth_max': float(obj_depth_max),
                            'depth_med': float(obj_depth_median),
                            'ctrDirectDeg': ctrDirectionDegrees
                        })

                    # Print the 3D localization results
                    print(detected_objsNDepth_image)
            else:
                # Wait to avoid high CPU utilization
                time.sleep(0.1)
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        print("Cleanup completed")


if __name__ == "__main__":
    main()

Canlı Sunum: Veri Hattını Besleyin

Veri işlem hattını başlatmak için lütfen "Snapshot" düğmesine basın. Görüntü web arayüzünde görüntülenir görüntülenmez, bilgisayar tarafında nesneler 3 boyutlu koordinatlarıyla birlikte gösterilecektir.

RAiV ile 3B Nesne Konumlandırma

Sırada Ne Var?

Python SDK'mızı inceleyin:

RAiV Python SDK

Örnek Kodlar İçin Github Depomuzu İnceleyin:

Github Depomuz