exponenta event banner

Создание сетки занятости с помощью монокулярной камеры и семантической сегментации

В этом примере показано, как оценить свободное пространство вокруг транспортного средства и создать сетку занятости с использованием семантической сегментации и глубокого обучения. Затем эта сетка заполняемости используется для создания карты затрат на транспортное средство, которая может использоваться для планирования пути.

Сведения об оценке свободного пространства

Оценка свободного пространства определяет области в окружающей среде, где эго-транспортное средство может ездить без каких-либо препятствий, таких как пешеходы, бордюры или другие транспортные средства. Транспортное средство может использовать различные датчики для оценки свободного пространства, такие как радар, лидар или камеры. Этот пример фокусируется на оценке свободного пространства от датчика изображения с помощью семантической сегментации.

В этом примере показано, как:

  • Используйте сегментацию семантического изображения для оценки свободного пространства.

  • Создайте сетку занятости с использованием оценки свободного пространства.

  • Визуализация сетки заполняемости на графике птичьего глаза.

  • Создайте карту затрат на транспортное средство с использованием сетки заполняемости.

  • Проверьте, являются ли места в мире оккупированными или свободными.

Загрузить предварительно обученную сеть

В этом примере используется предварительно обученная сеть семантической сегментации, которая может классифицировать пикселы на 11 различных классов, включая Road, Pedestrian, Car, и Sky. Свободное пространство в изображении может быть оценено путем определения пикселей изображения, классифицированных как Road как свободное пространство. Все остальные классы определяются как несвободное пространство или препятствия.

Полная процедура обучения этой сети показана в примере семантической сегментации с использованием глубокого обучения. Загрузите предварительно обученную сеть.

% Download the pretrained network.
pretrainedURL = 'https://www.mathworks.com/supportfiles/vision/data/segnetVGG16CamVid.mat';
pretrainedFolder = fullfile(tempdir,'pretrainedSegNet');
pretrainedSegNet = fullfile(pretrainedFolder,'segnetVGG16CamVid.mat');
if ~exist(pretrainedFolder,'dir')
    mkdir(pretrainedFolder);
    disp('Downloading pretrained SegNet (107 MB)...');
    websave(pretrainedSegNet,pretrainedURL);
    disp('Download complete.');
end

% % Load the network.
data = load(pretrainedSegNet);
net = data.net;

Примечание.Время загрузки данных зависит от вашего подключения к Интернету. Команды, использованные выше, блокируют MATLAB до завершения загрузки. Кроме того, для загрузки набора данных на локальный диск можно использовать веб-браузер. В этом случае для использования файла, загруженного из Интернета, измените pretrainedFolder переменная, указанная выше, в соответствии с расположением загруженного файла.

Оценить свободное пространство

Оценка свободного пространства путем обработки изображения с использованием загруженной сети семантической сегментации. Сеть возвращает классификации для каждого пикселя изображения в изображении. Свободное пространство идентифицируется как пиксели изображения, которые были классифицированы как Road.

Изображение, используемое в этом примере, представляет собой один кадр из последовательности изображений в наборе данных CamVid [1]. Процедура, показанная в этом примере, может быть применена к последовательности кадров для оценки свободного пространства при движении транспортного средства. Однако, поскольку в этом примере используется очень глубокая архитектура сверточной нейронной сети (SegNet с кодером VGG-16), обработка каждого кадра занимает около 1 секунды. Поэтому для целесообразности обработайте один кадр.

% Read the image.
I = imread('seq05vd_snap_shot.jpg');

% Segment the image.
[C,scores,allScores] = semanticseg(I,net);

% Overlay free space onto the image.
B = labeloverlay(I,C,'IncludedLabels',"Road");

% Display free space and image.
figure
imshow(B)

Чтобы понять уверенность в оценке свободного пространства, просмотрите выходной балл для Road класс для каждого пикселя. Доверительные значения могут использоваться для информирования нисходящих алгоритмов о достоверности оценки. Например, даже если сеть классифицирует пиксель как Road, оценка достоверности может быть достаточно низкой, чтобы игнорировать эту классификацию по соображениям безопасности.

% Use the network's output score for Road as the free space confidence.
roadClassIdx = 4;
freeSpaceConfidence = allScores(:,:,roadClassIdx);
    
% Display the free space confidence.
figure
imagesc(freeSpaceConfidence)
title('Free Space Confidence Scores')
colorbar

Хотя начальный результат сегментации для Road пиксели показали, что большинство пикселей на дороге были классифицированы правильно, визуализация баллов обеспечивает более подробную информацию о уверенности классификатора в этих классификациях. Например, доверие уменьшается по мере приближения к границе автомобиля.

Создание изображения птичьего вида

Оценка свободного пространства генерируется в пространстве изображения. Для облегчения формирования сетки занятости, которая пригодна для навигации, оценка свободного пространства должна быть преобразована в систему координат транспортного средства. Это можно сделать путем преобразования оценки свободного пространства в изображение с высоты птичьего полета.

Чтобы создать изображение с высоты птичьего полета, сначала определите конфигурацию датчика камеры. Вспомогательная функция, указанная в конце этого примера: camvidMonoCameraSensor, возвращает monoCamera объект, представляющий монокулярную камеру, используемую для сбора данных CamVid [1]. Конфигурирование monoCamera требуются внутренние и внешние характеристики камеры, которые были оценены с использованием данных, представленных в наборе данных CamVid. Чтобы оценить особенности камеры, функция использовала изображения калибровки шашечной платы CamVid и приложение Калибратор камеры. Оценки внешних характеристик камеры, таких как высота и шаг, были получены из внешних данных, оцененных авторами набора данных CamVid.

% Create monoCamera for CamVid data.
sensor = camvidMonoCameraSensor();

Учитывая настройку камеры, birdsEyeView объект преобразует исходное изображение в вид с высоты птичьего полета. Этот объект позволяет указать область, которую требуется преобразовать с помощью координат транспортного средства. Обратите внимание, что блоки координат транспортного средства были установлены monoCamera объект, когда высота установки камеры была указана в метрах. Например, если высота была задана в миллиметрах, в остальной части моделирования будут использоваться миллиметры.

% Define bird's-eye-view transformation parameters.
distAheadOfSensor = 20; % in meters, as previously specified in monoCamera height input
spaceToOneSide    = 3;  % look 3 meters to the right and left
bottomOffset      = 0;  
outView = [bottomOffset, distAheadOfSensor, -spaceToOneSide, spaceToOneSide];

outImageSize = [NaN, 256]; % output image width in pixels; height is chosen automatically to preserve units per pixel ratio

birdsEyeConfig = birdsEyeView(sensor,outView,outImageSize);

Создание изображения с видом на птицу для изображения и уверенности в свободном пространстве.

% Resize image and free space estimate to size of CamVid sensor. 
imageSize = sensor.Intrinsics.ImageSize;
I = imresize(I,imageSize);
freeSpaceConfidence = imresize(freeSpaceConfidence,imageSize);

% Transform image and free space confidence scores into bird's-eye view.
imageBEV = transformImage(birdsEyeConfig,I);
freeSpaceBEV = transformImage(birdsEyeConfig,freeSpaceConfidence); 

% Display image frame in bird's-eye view.
figure
imshow(imageBEV)

Преобразуйте изображение в вид с высоты птичьего полета и создавайте уверенность в свободном пространстве.

figure
imagesc(freeSpaceBEV)
title('Free Space Confidence')

Области, расположенные дальше от датчика, являются более размытыми из-за меньшего количества пикселей и, таким образом, требуют большей степени интерполяции.

Создание сетки занятости на основе оценки свободного пространства

Сетки занятости используются для представления окружения транспортного средства в виде дискретной сетки в координатах транспортного средства и используются для планирования траектории. Каждая ячейка в сетке занятости имеет значение, представляющее вероятность занятости этой ячейки. Расчетное свободное пространство может использоваться для заполнения значений сетки занятости.

Процедура заполнения сетки занятости с использованием оценки свободного пространства состоит в следующем:

  1. Определите размеры сетки занятости в координатах транспортного средства.

  2. Создайте набор точек (X, Y) для каждой ячейки сетки. Эти точки находятся в системе координат транспортного средства.

  3. Преобразуйте точки из координатного пространства транспортного средства (X, Y) в координатное пространство изображения с высоты птичьего полета (x, y) с помощью vehicleToImage преобразование.

  4. Выборка доверительных значений свободного пространства в местоположениях (x, y) с использованиемgriddedInterpolant для интерполяции доверительных значений свободного пространства, которые не находятся точно в центрах пикселей на изображении.

  5. Заполните ячейку сетки занятости средним значением достоверности свободного пространства для всех (x, y) точек, которые соответствуют этой ячейке сетки.

Для краткости процедура, показанная выше, реализована в функции поддержки, createOccupancyGridFromFreeSpaceEstimate, который приведен в конце этого примера. Определите размеры сетки занятости с точки зрения конфигурации птичьего вида и создайте сетку занятости путем вызова createOccupancyGridFromFreeSpaceEstimate.

% Define dimensions and resolution of the occupancy grid.
gridX = distAheadOfSensor;
gridY = 2 * spaceToOneSide;
cellSize = 0.25; % in meters to match units used by CamVid sensor

% Create the occupancy grid from the free space estimate.
occupancyGrid = createOccupancyGridFromFreeSpaceEstimate(...
    freeSpaceBEV, birdsEyeConfig, gridX, gridY, cellSize);

Визуализация сетки занятости с помощью birdsEyePlot. Создать birdsEyePlot и добавьте сетку заполняемости сверху, используя pcolor.

% Create bird's-eye plot.
bep = birdsEyePlot('XLimits',[0 distAheadOfSensor],'YLimits', [-5 5]);

% Add occupancy grid to bird's-eye plot.
hold on
[numCellsY,numCellsX] = size(occupancyGrid);
X = linspace(0, gridX, numCellsX);
Y = linspace(-gridY/2, gridY/2, numCellsY);
h = pcolor(X,Y,occupancyGrid);
title('Occupancy Grid (probability)')
colorbar
delete(legend)

% Make the occupancy grid visualization transparent and remove grid lines.
h.FaceAlpha = 0.5;
h.LineStyle = 'none';

График птичьего глаза также может отображать данные от нескольких датчиков. Например, добавьте зону покрытия радара с помощью coverageAreaPlotter.

% Add coverage area to plot.
caPlotter = coverageAreaPlotter(bep, 'DisplayName', 'Coverage Area');

% Update it with a field of view of 35 degrees and a range of 60 meters
mountPosition = [0 0];
range = 15;
orientation = 0;
fieldOfView = 35;
plotCoverageArea(caPlotter, mountPosition, range, orientation, fieldOfView);
hold off

Отображение данных с нескольких датчиков полезно для диагностики и отладки решений, принимаемых автономными транспортными средствами.

Создание карты затрат на транспортное средство с использованием сетки занятости

vehicleCostmap предоставляет функциональные возможности для проверки, являются ли местоположения в координатах транспортного средства или мира занятыми или свободными. Эта проверка необходима для любого алгоритма планирования путей или принятия решений. Создать vehicleCostmap с использованием сгенерированного occupancyGrid.

% Create the costmap.
costmap = vehicleCostmap(flipud(occupancyGrid), ...
    'CellSize',cellSize, ...
    'MapLocation',[0,-spaceToOneSide]);
costmap.CollisionChecker.InflationRadius = 0;

% Display the costmap.
figure
plot(costmap,'Inflation','off')
colormap(parula)
colorbar
title('Vehicle Costmap')

% Orient the costmap so that it lines up with the vehicle coordinate
% system, where the X-axis points in front of the ego vehicle and the
% Y-axis points to the left.
view(gca,-90,90)

Для иллюстрации использования vehicleCostmap, создайте набор местоположений в мировых координатах. Эти местоположения представляют траекторию, которую может пройти транспортное средство.

% Create a set of locations in vehicle coordinates.
candidateLocations = [
    8 0.375
    10 0.375
    12 2
    14 0.375   
    ];

Использовать checkOccupied чтобы проверить, занято ли или свободно ли каждое место. Исходя из результатов, потенциальный путь может быть невозможен, поскольку он сталкивается с препятствиями, определенными в costmap.

% Check if locations are occupied.
isOccupied = checkOccupied(costmap,candidateLocations);

% Partition locations into free and occupied for visualization purposes.
occupiedLocations = candidateLocations(isOccupied,:);
freeLocations = candidateLocations(~isOccupied,:);

% Display free and occupied points on top of costmap.
hold on
markerSize = 100;
scatter(freeLocations(:,1),freeLocations(:,2),markerSize,'g','filled')
scatter(occupiedLocations(:,1),occupiedLocations(:,2),markerSize,'r','filled');
legend(["Free" "Occupied"])
hold off

Использование occupancyGrid, vehicleCostmap, и checkOccupied показаны выше основные операции, используемые планировщиками путей, такие как pathPlannerRRT. Дополнительные сведения о планировании пути см. в примере автоматической парковки.

Ссылки

[1] Бростоу, Габриэль Дж., Жюльен Фокер и Роберто Чиполла. «Классы семантических объектов в видео: база данных истинности земли высокой четкости». Буквы распознавания образов. Том 30, выпуск 2, 2009, стр. 88-97.

Вспомогательные функции

function sensor = camvidMonoCameraSensor()
% Return a monoCamera camera configuration based on data from the CamVid 
% data set[1].
%
% The cameraCalibrator app was used to calibrate the camera using the
% calibration images provided in CamVid:
%
% http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/CalibrationSeq_and_Files_0010YU.zip
%
% Calibration pattern grid size is 28 mm. 
%
% Camera pitch is computed from camera pose matrices [R t] stored here:
%
% http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/EgoBoost_trax_matFiles.zip

% References
% ----------
% [1] Brostow, Gabriel J., Julien Fauqueur, and Roberto Cipolla. "Semantic Object 
% Classes in Video: A high-definition ground truth database." _Pattern Recognition 
% Letters_. Vol. 30, Issue 2, 2009, pp. 88-97.

calibrationData = load('camera_params_camvid.mat');

% Describe camera configuration.
focalLength    = calibrationData.cameraParams.FocalLength;
principalPoint = calibrationData.cameraParams.PrincipalPoint;
imageSize      = calibrationData.cameraParams.ImageSize;

% Camera height estimated based on camera setup pictured in [1].
height = 0.5;  % height in meters from the ground

% Camera pitch was computed using camera extrinsics provided in data set.
pitch = 0;  % pitch of the camera, towards the ground, in degrees

camIntrinsics = cameraIntrinsics(focalLength,principalPoint,imageSize);
sensor = monoCamera(camIntrinsics,height,'Pitch',pitch);
end
function occupancyGrid = createOccupancyGridFromFreeSpaceEstimate(...
    freeSpaceBEV,birdsEyeConfig,gridX,gridY,cellSize)
% Return an occupancy grid that contains the occupancy probability over
% a uniform 2-D grid.

% Number of cells in occupancy grid.
numCellsX = ceil(gridX / cellSize);
numCellsY = ceil(gridY / cellSize);

% Generate a set of (X,Y) points for each grid cell. These points are in
% the vehicle's coordinate system. Start by defining the edges of each grid
% cell.

% Define the edges of each grid cell in vehicle coordinates.
XEdges = linspace(0,gridX,numCellsX);
YEdges = linspace(-gridY/2,gridY/2,numCellsY);

% Next, specify the number of sample points to generate along each
% dimension within a grid cell. Use these to compute the step size in the
% X and Y direction. The step size will be used to shift the edge values of
% each grid to produce points that cover the entire area of a grid cell at
% the desired resolution.

% Sample 20 points from each grid cell. Sampling more points may produce
% smoother estimates at the cost of additional computation.
numSamplePoints = 20;

% Step size needed to sample number of desired points.
XStep = (XEdges(2)-XEdges(1)) / (numSamplePoints-1);
YStep = (YEdges(2)-YEdges(1)) / (numSamplePoints-1);

% Finally, slide the set of points across both dimensions of the grid
% cells. Sample the occupancy probability along the way using
% griddedInterpolant.

% Create griddedInterpolant for sampling occupancy probability. Use 1
% minus the free space confidence to represent the probability of occupancy.
occupancyProb = 1 - freeSpaceBEV;
sz = size(occupancyProb);
[y,x] = ndgrid(1:sz(1),1:sz(2));
F = griddedInterpolant(y,x,occupancyProb);

% Initialize the occupancy grid to zero.
occupancyGrid = zeros(numCellsY*numCellsX,1);

% Slide the set of points XEdges and YEdges across both dimensions of the
% grid cell. 
for j = 1:numSamplePoints
    
    % Increment sample points in the X-direction
    X = XEdges + (j-1)*XStep;
   
    for i = 1:numSamplePoints
        
        % Increment sample points in the Y-direction
        Y = YEdges + (i-1)*YStep;
        
        % Generate a grid of sample points in bird's-eye-view vehicle coordinates
        [XGrid,YGrid] = meshgrid(X,Y);
        
        % Transform grid of sample points to image coordinates
        xy = vehicleToImage(birdsEyeConfig,[XGrid(:) YGrid(:)]);
        
        % Clip sample points to lie within image boundaries
        xy = max(xy,1);
        xq = min(xy(:,1),sz(2));        
        yq = min(xy(:,2),sz(1));
        
        % Sample occupancy probabilities using griddedInterpolant and keep
        % a running sum.
        occupancyGrid = occupancyGrid + F(yq,xq);  
    end
    
end

% Determine mean occupancy probability.
occupancyGrid = occupancyGrid / numSamplePoints^2;
occupancyGrid = reshape(occupancyGrid,numCellsY,numCellsX);
end

См. также

Приложения

Функции

Объекты

Связанные темы