Обнаружение транспортных средств в лидаре с использованием меток изображений

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

Загрузка данных

Этот пример использует данные лидара, собранные на шоссе с датчика Ouster OS1 lidar, и данные изображения с фронтальной камеры, установленной на автомобиль , оборудованный датчиком. Данные лидара и камеры примерно синхронизированы по времени и калиброваны, чтобы оценить их собственные и внешние параметры. Для получения дополнительной информации о калибровке камеры лидара см. «Лидар» и «Калибровка камеры».

Примечание: Время загрузки данных зависит от скорости вашего подключения к Интернету. Во время выполнения этого блока кода 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 ограничивающие рамки являются векторами формы: [xywh], где xandy представление координат xy левого верхнего угла, и wandh представление ширины и высоты ограничивающего прямоугольника соответственно.

Считайте систему координат изображения в рабочую область и отобразите ее с наложенными ограничивающими рамками.

load imageGTruth.mat
im = imread(imageFileNames{50});
imBbox = imageGTruth{50};

figure
imshow(im)
showShape('rectangle',imBbox)

3-D предложения по областям

Чтобы сгенерировать кубоидные ограничивающие рамки в лидаре из 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 представлены как векторы вида:[xcenycenzcendimxdimydimzrotxrotyrotz], где xcen,ycen,andzcen представляют центроидные координаты кубоида. dimx,dimy,anddimz представляют длину кубоида вдоль осей x -, y - и z, и rotx,roty,androtz представление поворота, в степенях, кубоида вдоль осей 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 класс, чтобы визуализировать данные лидара и изображения. Эта визуализация предоставляет возможность одновременно просматривать облако точек, изображение 3-D ограничительные рамки в облаке точек и 2-D ограничительные рамки на изображении. Размещение визуализации состоит из следующих окон:

  • Изображение - Визуализация изображения и связанных 2-D ограничивающих рамок

  • Перспективный вид - визуализация облака точек и связанных 3-D ограничивающих рамок в перспективном виде

  • Вид сверху - визуализация облака точек и связанных 3-D ограничивающих рамок с вида сверху

% Initialize display
display = helperLidarCameraObjectsDisplay;
initializeDisplay(display)

% Update display with point cloud and image
updateDisplay(display, im, pc)

Цикл через данные

Запустите bboxCameraToLidar на 2-D метках в первых 200 системах координат, чтобы сгенерировать 3-D кубоидов

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

Обнаруженные ограничительные рамки при помощи отслеживания ограничивающих прямоугольников, таких как совместная вероятностная ассоциация данных (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

Вспомогательные файлы

helperComputeDistance

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