主要内容

利用单目摄像机和语义分割创建占用网格

这个例子展示了如何评估车辆周围的空闲空间,并使用语义分割和深度学习创建一个占用网格。然后,您可以使用这个占用网格来创建一个车辆成本地图,它可以用于规划路径。

关于自由空间估计

自由空间估计确定环境中ego车辆可以行驶而不撞上任何障碍物(如行人、路缘或其他车辆)的区域。车辆可以使用各种传感器来估计自由空间,如雷达、激光雷达或摄像头。本示例重点介绍使用语义segm从图像传感器估计自由空间内倾。

在这个例子中,您将学习如何:

  • 使用语义图像分割估计空闲空间。

  • 使用估算的空闲空间创建一个占用网格。

  • 在鸟瞰图上想象占用网格。

  • 使用占用网格创建一个车辆成本地图。

  • 检查世界上的地点是否被占用或空闲。

下载预训练网络

本例使用一个预先训练的语义分割网络,该网络可以将像素划分为11个不同的类别,包括,行人,,天空.通过定义图像像素的分类,可以估计出图像中的空闲空间自由空间。所有其他类都被定义为非自由空间或障碍。

训练这个网络的完整过程如图所示基于深度学习的语义分割的例子。下载预先训练的网络。

%下载预训练的网络。预训练='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/vision/data/segnetVGG16CamVid.mat';pretrainedFolder=fullfile(tempdir,“pretrainedSegNet”);pretrainedSegNet = fullfile (pretrainedFolder,“segnetVGG16CamVid.mat”);如果~存在(pretrainedFolder“dir”mkdir (pretrainedFolder);disp (“下载预训练的SegNet (107 MB)……”); websave(pretrainedSegNet、pretrainedURL);disp(“下载完成了。”);结束% %加载网络。data =负载(pretrainedSegNet);网= data.net;

注意:资料下载时间视乎阁下的互联网连接情况而定。上面使用的命令块MATLAB®直到下载完成。或者,您可以使用web浏览器先将数据集下载到本地磁盘。在这种情况下,要使用从网上下载的文件,请更改pretrainedFolder变量设置为下载文件的位置。

估计自由空间

利用下载的语义分割网络对图像进行处理,估计空闲空间。该网络为图像中的每个图像像素返回分类。空闲空间被识别为已分类为

本例中使用的图像是CamVid数据集[1]中的图像序列中的一帧。本例中所示的程序可应用于一系列的帧,以估计车辆行驶时的自由空间。然而,由于本例中使用了非常深入的卷积神经网络架构(带有VGG-16编码器的SegNet),因此处理每一帧大约需要1秒。因此,为方便起见,加工单一帧。

%读取镜像。我= imread (‘seq05vd_snap_shot.jpg’);%分割图像。[C分数allScores] = semanticseg(我,净);%覆盖空闲空间到图像上。B=labeloverlay(I,C,“IncludedLabels”,“路”);%显示可用空间和图像。图imshow (B)

要理解空闲空间估计的置信度,请显示类的每个像素。置信度可以用来告知下游算法估计的有效性。例如,即使网络将一个像素分类为在美国,可信度评分可能低到出于安全原因而忽略这一分类。

%使用网络对Road的输出分数作为自由空间的置信度。roadClassIdx = 4;freeSpaceConfidence = allScores (:,:, roadClassIdx);显示空闲空间置信度。figure imagesc(自由空间)标题(“自由空间信心评分”) colorbar

虽然最初的分割结果为显示在道路上的大多数像素都被正确地分类了,可视化的分数提供了关于分类器对这些分类的置信度的更丰富的细节。例如,当你接近汽车的边界时,自信心会下降。

创建鸟瞰图像

自由空间估算在图像空间中生成。为了便于生成对导航有用的占用网格,需要将自由空间估算转换为车辆坐标系。这可以通过将自由空间估算转换为鸟瞰图像来实现。

要创建鸟瞰图,首先定义相机传感器配置。本例最后万博1manbetx列出的支持函数,camvidMonoCameraSensor,返回一个monoCamera对象表示用于收集CamVid[1]数据的单目摄像机。配置monoCamera需要相机的内在和外在,这是使用CamVid数据集提供的数据估计。为了估计相机的内在特性,该功能使用CamVid棋盘格标定图像和摄像机校准器相机的外部特征,如高度和俯仰,是由CamVid数据集的作者估计的外部数据得出的。

为CamVid数据创建moncamera。传感器= camvidMonoCameraSensor ();

在摄像机设置的情况下birdsEyeView对象将原始图像转换为鸟瞰视图。通过此对象,可以指定要使用车辆坐标变换的区域。请注意,车辆坐标单位是由monoCamera对象时,相机安装高度指定为米。例如,如果高度以毫米为单位指定,则模拟的其余部分将使用毫米。

%定义鸟瞰视图变换参数。distAheadOfSensor = 20;%以米为单位,如前所述在相机高度输入中指定的spaceToOneSide = 3;向左向右看3米bottomOffset = 0;outView = [bottomOffset, distAheadOfSensor, -spaceToOneSide, spaceToOneSide]; / /查看全局outImageSize = [NaN, 256];%以像素为单位输出图像宽度;自动选择高度以保持单位/像素比率birdsEyeConfig = birdsEyeView(传感器、官样文章、outImageSize);

生成鸟瞰图像,对图像和自由空间有信心。

%调整CamVid传感器大小的图像和空闲空间估计。图象尺寸= sensor.Intrinsics.ImageSize;我= imresize(我、图象尺寸);freeSpaceConfidence = imresize (freeSpaceConfidence、图象尺寸);%转换图像和自由空间信心分数到鸟瞰图。imageBEV = transformImage (birdsEyeConfig,我);freeSpaceBEV = transformImage (birdsEyeConfig freeSpaceConfidence);%在鸟瞰视图中显示图像帧。图imshow (imageBEV)

将图像转换为鸟瞰视图,生成自由空间的信心。

图显示亮度图像(freeSpaceBEV)标题(“自由空间的信心”

离传感器越远的区域越模糊,因为像素越少,因此需要更多的插值。

基于自由空间估计创建占用网格

占用网格用于在车辆坐标中将车辆周围表示为离散网格,并用于路径规划。占用网格中的每个单元都有一个表示该单元占用概率的值。估计的可用空间可用于填充占用网格的值。

利用空闲空间估计填充占用网格的过程如下:

  1. 在车辆坐标中定义占用栅格的尺寸。

  2. 为每个网格单元生成一组(X,Y)点。这些点位于车辆坐标系中。

  3. 将车辆坐标空间(X,Y)中的点转换为鸟瞰图坐标空间(X,Y)使用vehicleToImage变换。

  4. 使用下面的方法对(x,y)位置的自由空间置信值进行采样griddedInterpolant插值不完全位于图像像素中心的自由空间置信值。

  5. 用该网格单元格对应的所有(x,y)点的平均自由空间置信值填充占用网格单元格。

为简洁起见,在支持函数中实现了上面所示的过程,万博1manbetxcreateOccupancyGridFromFreeSpaceEstimate,在本例的最后列出。根据鸟瞰图的配置定义占用网格的尺寸,并通过调用创建占用网格createOccupancyGridFromFreeSpaceEstimate

定义占用网格的尺寸和分辨率。gridX = distAheadOfSensor;gridY = 2 * spaceToOneSide;cellSize = 0.25;%米匹配CamVid传感器使用的单位%根据空闲空间估算创建占用网格。occupancyGrid = createOccupancyGridFromFreeSpaceEstimate (...freeSpaceBEV、birdseyconfig、gridX、gridY、cellSize);

设想入住率网格使用birdsEyePlot.创建一个birdsEyePlot并在上面添加使用网格pcolor

创建鸟瞰图。cep = birdsEyePlot (“XLimits”[0 distAheadOfSensor],“YLimits”5 [5]);%在鸟瞰图中添加占用网格。持有[numCellsY,numCellsX]=大小(职业网格);X=linspace(0,gridX,numCellsX);Y=linspace(-gridY/2,gridY/2,numCellsY);h=pcolor(X,Y,职业网格);title(“占用率网格(概率)”) colorbar删除(传奇)%使占用栅格可视化透明并删除栅格线。h.FaceAlpha = 0.5;h.LineStyle =“没有”

鸟瞰图还可以显示来自多个传感器的数据。例如,添加雷达覆盖区域使用coverageAreaPlotter

%在plot中添加覆盖区域。caPlotter=Coverage GeareaPlotter(bep,“显示名称”,“覆盖范围”);更新视野35度,射程60米mountPosition=[0];范围=15;方向=0;视野=35;绘图仪A(卡普洛特、安装位置、范围、方向、视野);持有

显示来自多个传感器的数据对自动驾驶汽车的诊断和调试决策非常有用。

使用占用率网格创建车辆成本图

vehicleCostmap提供功能,以检查位置,在车辆或世界坐标,是否被占用或空闲。此检查对于任何路径规划或决策算法都是必需的。创建vehicleCostmap使用生成的职业网格

%创建成本图。costmap = vehicleCostmap (flipud (occupancyGrid),...“CellSize”cellSize,...“MapLocation”,[0,-spaceToOneSide]);costmap.CollisionChecker.InflationRadius=0;%显示成本图。图绘制(costmap,“通货膨胀”,“关闭”)彩色地图(parula)彩色条标题(“车辆Costmap”%定位成本地图,使其与车辆坐标一致%系统,其中x轴指向自我车辆和%Y轴指向左侧。视图(gca、-90、90)

来说明如何使用vehicleCostmap,在世界坐标中创建一组位置。这些位置表示车辆可以穿过的路径。

在车辆坐标中创建一组位置。candidatlocations = [8 0.375 10 0.375 12 2 14 0.375];

使用checkOccupied检查每个位置是否被占用或空闲。根据结果,一条潜在的路径可能是不可能遵循的,因为它与定义在成本图

%检查位置是否被占用。等占用=检查占用(成本图、候选位置);分区位置分为空闲位置和已占用位置,以便显示。occupiedLocations = candidateLocations (isOccupied:);freeLocations = candidateLocations (~ isOccupied:);%在成本地图顶部显示免费和占用点数。持有markerSize = 100;散射(freeLocations (: 1) freeLocations (:, 2), markerSize,‘g’,“填充”)散射(occupiedLocations (: 1) occupiedLocations (:, 2), markerSize,“r”,“填充”);传奇([“免费”“占用”)举行

的使用职业网格,vehicleCostmap,checkOccupied上面展示了路径规划者使用的基本操作,例如pathPlannerRRT.有关路径规划的更多信息,请参见自动停车员的例子。

参考文献

Brostow, Gabriel J., Julien Fauqueur和Roberto Cipolla。《视频中的语义对象类:一个高清地面真实数据库》模式识别的字母.2009年第30卷第2期88-97页。

万博1manbetx辅助功能

函数传感器= camvidMonoCameraSensor ()%根据来自CamVid的数据返回单摄像机摄像机配置%数据集[1]。%cameraCalibrator应用程序用于使用CamVid提供的%校准图像:% http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/CalibrationSeq_and_Files_0010YU.zip%校准图案网格尺寸为28毫米。相机俯仰百分比由存储在这里的相机姿态矩阵[R t]计算:% http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/EgoBoost_trax_matFiles.zip%的引用% ----------布罗斯托、加布里埃尔·J、朱利安·福克尔和罗伯托·希波拉。“语义对象%类在视频:一个高清地面真相数据库。_Pattern识别% Letters_。2009年第30卷第2期88-97页。calibrationData =负载(“摄像头参数摄像头垫”);描述相机配置。focalLength = calibrationData.cameraParams.FocalLength;principalPoint = calibrationData.cameraParams.PrincipalPoint;图象尺寸= calibrationData.cameraParams.ImageSize;%相机高度估计基于相机设置在[1]。高度=0.5;%高度,以米为单位%使用数据集中提供的相机外部信息计算相机间距。距= 0;相机朝向地面的百分比,以度数表示camIntrinsics = cameraIntrinsics (focalLength principalPoint图象尺寸);传感器= monoCamera (camIntrinsics、身高、“投球”、沥青);结束
函数occupancyGrid = createOccupancyGridFromFreeSpaceEstimate (...格子,freeSpaceBEV、birdsEyeConfig gridX cellSize)返回一个包含占用概率的占用网格一个统一的二维网格。%占用网格中的单元数。numCellsX = cellSize (gridX / cellSize);numCellsY = cellSize (gridY / cellSize);%为每个网格单元生成一组(X,Y)点。这些点在%车辆的坐标系。首先定义每个网格的边缘%牢房。%在车辆坐标中定义每个栅格单元的边。XEdges=linspace(0,gridX,numCellsX);YEdges=linspace(-gridY/2,gridY/2,numCellsY);%接下来,指定沿着每个点生成的样本点的数量网格单元格中的%维度。的步长X和Y方向。步长将用于移动的边缘值%来生成点,这些点覆盖网格单元的整个区域%期望的分辨率。%采样20点从每个网格单元格。抽样更多的点可能产生%以额外计算为代价进行更平滑的估计。numSamplePoints = 20;%所需步长为所需点的样本数。XStep = (XEdges(2)-XEdges(1)) / (numSamplePoints-1);YStep = (YEdges(2)-YEdges(1)) / (numSamplePoints-1);%最后,在栅格的两个维度上滑动点集%单元格。使用% griddedInterpolant。%为抽样占用概率创建griddedInterpolant。使用1%减去自由空间置信度表示占用概率。occupancyProb = 1 - free espacebev;深圳=大小(occupancyProb);(y、x) = ndgrid(1:深圳(1),1:深圳(2));F = griddedInterpolant (y, x, occupancyProb);%将占用网格初始化为零。occupancyGrid = 0 (numCellsY * numCellsX, 1);%滑动点集XEdges和YEdges在两个维度%网格单元。j = 1: numSamplePoints采样点在x方向上的增量X = XEdges + (j-1)*XStep;我= 1:numSamplePoints%在Y方向上增加采样点Y = YEdges + (i-1)*YStep;在鸟瞰图车辆坐标中生成一个样本点网格[XGrid, YGrid] = meshgrid (X, Y);将采样点网格转换为图像坐标xy = vehicleToImage(birdsEyeConfig,[XGrid(:) YGrid(:))]);%剪裁采样点以使其位于图像边界内xy=max(xy,1);xq=min(xy(:,1),sz(2));yq=min(xy(:,2),sz(1));%使用griddedInterpolant和keep的样本占用概率%一笔经常性的款项。占据网格+ F(yq,xq);结束结束%确定平均入住率。occupancyGrid = occupancyGrid / numSamplePoints^2;occupancyGrid =重塑(occupancyGrid numCellsY numCellsX);结束

另请参阅

应用程序

功能

对象

相关的话题