В этом примере показано, как обнаруживать транспортные средства в лидаре с помощью данных этикеток с совместно расположенной камеры с известными параметрами калибровки «лидар-камера». Этот рабочий процесс в MATLAB ® используется для оценки 3-D ориентированных ограничивающих рамок в лидаре на основе 2-D ограничивающих рамок в соответствующем изображении. Также будет показано, как автоматически генерировать истину земли как расстояние для 2-D ограничивающих прямоугольников на изображении камеры с использованием данных лидара. На этом рисунке представлен обзор процесса.

Эти данные о лидаре использования в качестве примера, собранные по шоссе от Изгнания датчик лидара OS1 и данные изображения из фронтальной камеры, повысились на транспортном средстве эго. Данные лидара и камеры приблизительно синхронизируются по времени и калибруются для оценки их собственных и внешних параметров. Дополнительные сведения о калибровке лидарной камеры см. в разделе Калибровка лидарной камеры и камеры.
Примечание.Время загрузки данных зависит от скорости подключения к Интернету. Во время выполнения этого блока кода MATLAB временно не отвечает.
lidarTarFileUrl = 'https://www.mathworks.com/supportfiles/lidar/data/WPI_LidarData.tar.gz'; imageTarFileUrl = 'https://www.mathworks.com/supportfiles/lidar/data/WPI_ImageData.tar.gz'; outputFolder = fullfile(tempdir,'WPI'); lidarDataTarFile = fullfile(outputFolder,'WPI_LidarData.tar.gz'); imageDataTarFile = fullfile(outputFolder,'WPI_ImageData.tar.gz'); if ~exist(outputFolder,'dir') mkdir(outputFolder) end if ~exist(lidarDataTarFile,'file') disp('Downloading WPI Lidar driving data (760 MB)...') websave(lidarDataTarFile,lidarTarFileUrl) untar(lidarDataTarFile,outputFolder) end % Check if lidar tar.gz file is downloaded, but not uncompressed. if ~exist(fullfile(outputFolder,'WPI_LidarData.mat'),'file') untar(lidarDataTarFile,outputFolder) end if ~exist(imageDataTarFile,'file') disp('Downloading WPI Image driving data (225 MB)...') websave(imageDataTarFile,imageTarFileUrl) untar(imageDataTarFile,outputFolder) end % Check if image tar.gz file is downloaded, but not uncompressed. if ~exist(fullfile(outputFolder,'imageData'),'dir') untar(imageDataTarFile,outputFolder) end imageDataLocation = fullfile(outputFolder,'imageData'); images = imageSet(imageDataLocation); imageFileNames = images.ImageLocation; % Load downloaded lidar data into the workspace lidarData = fullfile(outputFolder,'WPI_LidarData.mat'); load(lidarData); % Load calibration data if ~exist('calib','var') load('calib.mat') end % Define camera to lidar transformation matrix camToLidar = calib.extrinsics; intrinsics = calib.intrinsics;
Кроме того, с помощью веб-браузера можно сначала загрузить наборы данных на локальный диск, а затем распаковать файлы.
В этом примере предварительно помеченные данные используются в качестве основы для обнаружения 2-D из изображений с камеры. Эти 2-D обнаружения могут генерироваться с использованием детекторов объектов на основе глубокого обучения, таких как vehicleDetectorYOLOv2, vehicleDetectorFasterRCNN, и vehicleDetectorACF. Для этого примера 2-D обнаружения были сгенерированы с помощью приложения Image Labeler. Эти 2-D ограничивающие рамки являются векторами вида: [где x представляют координаты xy верхнего левого угла, и w представляют ширину и высоту ограничивающей рамки соответственно.
Считывание кадра изображения в рабочее пространство и отображение его с наложенными ограничивающими прямоугольниками.
load imageGTruth.mat im = imread(imageFileNames{50}); imBbox = imageGTruth{50}; figure imshow(im) showShape('rectangle',imBbox)

Для формирования кубоидных ограничивающих рамок в лидаре из 2-D прямоугольных ограничивающих рамок в данных изображения предлагается область 3-D для уменьшения пространства поиска для оценки ограничивающих рамок. Углы каждой 2-D прямоугольной ограничивающей рамки на изображении преобразуются в 3-D линии с использованием собственных параметров камеры и внешних параметров «камера-лидар». Эти 3-D линии образуют усеченные частицы, выпирающие из соответствующей 2-D ограничивающей рамки в противоположном направлении эго-транспортного средства. Лидарные точки, попадающие внутри этой области, сегментированы на различные кластеры на основе евклидова расстояния. Кластеры оснащены 3-D ориентированными ограничивающими коробками, и лучший кластер оценивается на основе размера этих кластеров. Оцените 3-D ориентированные ограничивающие рамки в облаке точек лидара на основе 2-D ограничивающих рамок в изображении камеры с помощью команды bboxCameraToLidar функция. На этом рисунке показано, как 2-D и 3-D ограничивающие рамки связаны друг с другом.

3-D кубоиды представлены в виде векторов: ], где zcen представляют координаты центроида кубоида. dimz представляют длину кубоида вдоль осей x, y и z, rotz представляют поворот кубоида вдоль осей x, y и z в градусах.
Для оценки 3-D ограничивающей рамки в облаке точек лидара используется истинность изображения.
pc = lidarData{50};
% Crop point cloud to process only front region
roi = [0 70 -15 15 -3 8];
ind = findPointsInROI(pc,roi);
pc = select(pc,ind);
lidarBbox = bboxCameraToLidar(imBbox,pc,intrinsics, ...
camToLidar,'ClusterThreshold',2,'MaxDetectionRange',[1,70]);
figure
pcshow(pc.Location,pc.Location(:,3))
showShape('Cuboid',lidarBbox)
view([-2.90 71.59])
Чтобы улучшить обнаруженные ограничивающие рамки, предварительно обработайте облако точек путем удаления нулевой плоскости.
Используйте helperLidarCameraObjectsDisplay для визуализации данных лидара и изображения. Эта визуализация обеспечивает способность рассмотреть облако пункта, изображение, 3D ограничивающие прямоугольники на облаке пункта и 2-е ограничивающие прямоугольники на изображении одновременно. Макет визуализации состоит из следующих окон:
Изображение - визуализация изображения и связанных 2-D ним ограничивающих рамок
Перспективный вид - визуализация облака точек и связанных 3-D ограничивающих рамок на перспективном виде
Вид сверху - визуализация облака точек и связанных 3-D ограничивающих рамок с вида сверху
% Initialize display display = helperLidarCameraObjectsDisplay; initializeDisplay(display) % Update display with point cloud and image updateDisplay(display, im, pc)

Для создания кубоидов 2-D выполните baseCamureToLidar на метках 3-D на первых 200 кадрах
for i = 1:200 % Load point cloud and image im = imread(imageFileNames{i}); pc = lidarData{i}; % Load image ground truth imBbox = imageGTruth{i}; % Remove ground plane groundPtsIndex = segmentGroundFromLidarData(pc,'ElevationAngleDelta',15, ... 'InitialElevationAngle',10); nonGroundPts = select(pc,~groundPtsIndex); if imBbox [lidarBbox,~,boxUsed] = bboxCameraToLidar(imBbox,nonGroundPts,intrinsics, ... camToLidar,'ClusterThreshold',2,'MaxDetectionRange',[1, 70]); % Display image with bounding boxes im = updateImage(display,im,imBbox); end % Display point cloud with bounding box updateDisplay(display,im,pc); updateLidarBbox(display,lidarBbox,boxUsed) drawnow end

Обнаруженные ограничивающие рамки с помощью отслеживания ограничивающих рамок, например, joint probabilistic data association (JPDA). Дополнительные сведения см. в разделе Отслеживание транспортных средств с помощью Lidar: из облака точек в список дорожек.
Для таких функций безопасности транспортного средства, как предупреждение о столкновении в прямом направлении, решающее значение имеет точное измерение расстояния между эго-транспортным средством и другими объектами. Лидарный датчик обеспечивает точное расстояние между объектами и эго-транспортным средством в 3-D, а также может использоваться для автоматического создания истинного состояния земли из 2-D ограничивающих изображение рамок. Чтобы создать истинность основания для 2-D ограничивающих рамок, используйте projectLidarPointsOnImage для проецирования точек внутри 3-D ограничивающих рамок на изображение. Спроецированные точки связаны с 2-D ограничивающими рамками путем нахождения ограничивающей рамки с минимальным евклидовым расстоянием от спроецированных точек 3-D. Так как проецируемые точки находятся от лидара к камере, используйте обратные внешние параметры камеры к лидару. На этом рисунке показано преобразование из лидара в камеру.

% Initialize display display = helperLidarCameraObjectsDisplay; initializeDisplay(display) % Get lidar to camera matrix lidarToCam = invert(camToLidar); % Loop first 200 frames. To loop all frames, replace 200 with numel(imageGTruth) for i = 1:200 im = imread(imageFileNames{i}); pc = lidarData{i}; imBbox = imageGTruth{i}; % Remove ground plane groundPtsIndex = segmentGroundFromLidarData(pc,'ElevationAngleDelta',15, ... 'InitialElevationAngle',10); nonGroundPts = select(pc,~groundPtsIndex); if imBbox [lidarBbox,~,boxUsed] = bboxCameraToLidar(imBbox,nonGroundPts,intrinsics, ... camToLidar,'ClusterThreshold',2,'MaxDetectionRange',[1, 70]); [distance,nearestRect,idx] = helperComputeDistance(imBbox,nonGroundPts,lidarBbox, ... intrinsics,lidarToCam); % Update image with bounding boxes im = updateImage(display,im,nearestRect,distance); updateLidarBbox(display,lidarBbox) end % Update display updateDisplay(display,im,pc) drawnow end

function [distance, nearestRect, index] = helperComputeDistance(imBbox, pc, lidarBbox, intrinsic, lidarToCam) % helperComputeDistance estimates the distance of 2-D bounding box in a given % image using 3-D bounding boxes from lidar. It also calculates % association between 2-D and 3-D bounding boxes % Copyright 2020 MathWorks, Inc. numLidarDetections = size(lidarBbox,1); nearestRect = zeros(0,4); distance = zeros(1,numLidarDetections); index = zeros(0,1); for i = 1:numLidarDetections bboxCuboid = lidarBbox(i,:); % Create cuboidModel model = cuboidModel(bboxCuboid); % Find points inside cuboid ind = findPointsInsideCuboid(model,pc); pts = select(pc,ind); % Project cuboid points to image imPts = projectLidarPointsOnImage(pts,intrinsic,lidarToCam); % Find 2-D rectangle corresponding to 3-D bounding box [nearestRect(i,:),idx] = findNearestRectangle(imPts,imBbox); index(end+1) = idx; % Find the distance of the 2-D rectangle distance(i) = min(pts.Location(:,1)); end end function [nearestRect,idx] = findNearestRectangle(imPts,imBbox) numBbox = size(imBbox,1); ratio = zeros(numBbox,1); % Iterate over all the rectangles for i = 1:numBbox bbox = imBbox(i,:); corners = getCornersFromBbox(bbox); % Find overlapping ratio of the projected points and the rectangle idx = (imPts(:,1) > corners(1,1)) & (imPts(:,1) < corners(2,1)) & ... (imPts(:,2) > corners(1,2)) & (imPts(:,2) < corners(3,1)); ratio(i) = sum(idx); end % Get nearest rectangle [~,idx] = max(ratio); nearestRect = imBbox(idx,:); end function cornersCamera = getCornersFromBbox(bbox) cornersCamera = zeros(4,2); cornersCamera(1,1:2) = bbox(1:2); cornersCamera(2,1:2) = bbox(1:2) + [bbox(3),0]; cornersCamera(3,1:2) = bbox(1:2) + bbox(3:4); cornersCamera(4,1:2) = bbox(1:2) + [0,bbox(4)]; end