Обнаружение 3D-объектов: придание глубины YOLO на краю
В этом посте, просто используя RAiV, мы обнаружим объекты, оценим карту глубины сцены, а затем, используя карту глубины и параметры камеры, локализуем обнаруженные объекты в 3D.
Пройденный путь
В предыдущих постах мы показали, как:
Теперь пришло время объединить и расширить предыдущие коды, чтобы добиться 3D-локализации обнаруженных объектов
Задача: исправление изображения
В предыдущем посте оценка глубины если бы вы внимательно изучили карту глубин, то заметили бы, что карта глубин не совпадает идеально ни с одной из пар стереоизображений. Это связано с тем, что пара стереоизображений была исправлена перед оценкой глубины, чтобы они были идеально выровнены по горизонтали.
Что такое коррекция изображения?
Исправление изображения - это процесс геометрического преобразования двух изображений (с левой и правой камер) таким образом, чтобы они выглядели так, как будто они были сделаны двумя идеально выровненными по горизонтали камерами. камеры.
При съемке в стереосистеме важно, чтобы камеры были выровнены по горизонтали. Потому что, если изображения выровнены по горизонтали, мы выполняем поиск несоответствий только по горизонтали, что ускоряет процесс оценки карты глубины.
Однако в реальном мире трудно добиться идеального выравнивания камер по горизонтали. Чтобы решить эту проблему, было введено исправление изображения. Во время калибровки пары стереокамер для каждой камеры вычисляются матрицы исправления. Благодаря использованию этих матриц стереоизображения идеально выравниваются по горизонтали.
Хорошо, и что с того?
Итак, вы не можете использовать координаты обнаруженного объекта из пары стереоизображений на карте предполагаемой глубины. Вы должны преобразовать координаты объекта в выпрямленные координаты.
Подготовьте и загрузите код
В приведенном ниже коде мы объединим предыдущие коды обнаружения объекта и оценки глубины на карте, а затем используем выходные данные этих кодов и параметры камеры для локализации объекта в 3D.
Вы можете вы можете найти этот пример в нашем репозитории на Github со всеми необходимыми модулями. Пожалуйста, скачайте пример кода из репозитория github и загрузите его в RAiV через веб-интерфейс.
# 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()
Живое действие: передача данных по конвейеру
Теперь, чтобы запустить конвейер передачи данных, пожалуйста, нажмите кнопку "Snapshot". Как только изображение отображается в веб-интерфейсе, на стороне ПК отображаются объекты с 3D-координатами.
Что дальше?
Проверьте наш Python SDK
RAiV Python SDKПроверьте наш Репозиторий На Github Для Получения Примеров Кодов
Наш Репозиторий на Github