创建占用电网使用单眼相机和语义分割

这个例子显示了如何估计的自由空间周围车辆,并使用语义分割和深度学习占用电网。然后用这个占用网格创建车辆costmap,它可以用于规划的路径。

关于免费空间估计

自由空间估计是指车辆在行驶过程中不会碰到行人、路缘或其他车辆等障碍物的区域。车辆可以使用各种传感器来估计空闲空间,如雷达、激光雷达或照相机。这个例子着重于使用语义分割从一个图像传感器估计空闲空间。

在本例中,您将学习如何:

  • 使用语义图像分割估计的自由空间。

  • 创建使用免费的空间估计入住的网格。

  • 在鸟瞰图上想象居住网格。

  • 使用入住率网格创建车辆成本地图。

  • 检查在世界中的位置是否被占用或免费。

下载Pretrained网络

这个例子使用了一个预先训练的语义分割网络,它可以将像素分成11个不同的类,包括行人汽车,天空。图像中的自由空间可以通过定义分类为图像像素来估计自由空间。所有其他类被定义为非自由空间或障碍。

训练这个网络的完整过程中所示语义分割使用Deep学习(计算机视觉工具箱)的例子。下载预训练网络。

%下载预训练网络。pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/segnetVGG16CamVid.mat”;pretrainedFolder = fullfile (tempdir,'pretrainedSegNet');pretrainedSegNet = fullfile (pretrainedFolder,“segnetVGG16CamVid.mat”);如果〜存在(pretrainedFolder,“目录”)MKDIR(pretrainedFolder);DISP(下载预先训练过的赛格特(107mb)…);websave (pretrainedSegNet pretrainedURL);DISP(“下载完成了。”);结束%负载网络。数据=负载(pretrainedSegNet);净= data.net;

注:下载时间视乎阁下的互联网连线而定。上面使用的命令会阻塞MATLAB,直到下载完成。或者,您可以使用web浏览器首先将数据集下载到本地磁盘。在本例中,要使用从web下载的文件,请更改pretrainedFolder以上变量指定下载文件的位置。

估计可用空间

通过处理使用下载的语义分割网络的图像估计的自由空间。网络返回分类为图像中的每个图像像素。自由空间被鉴定为已被列为图像像素

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

%读取图像。我= imread (“seq05vd_snap_shot.jpg”);%的区段的图像。[C,分数,allScores] = semanticseg(I,净);%重叠的自由空间到图像。我= labeloverlay (C“IncludedLabels”“路”);显示空闲空间和图像。图imshow (B)

要了解在自由空间估计的信心,显示输出比分为类的每一个像素。置信值可以用来告知估计的有效性下游算法。例如,即使在网络分类的像素作为,置信度可能较低,足以忽略出于安全考虑,该分类。

%使用网络的输出分数作为道路的自由空间置信度。roadClassIdx = 4;freeSpaceConfidence = allScores (:,:, roadClassIdx);显示自由空间的置信度。图显示亮度图像(freeSpaceConfidence)标题(“自由空间的置信度”)colorbar

虽然初始分割结果像素显示的道路上最像素被正确分类,可视化的分数在这些分类分级的信心提供了更丰富的细节。例如,当你接近的车界的信心降低。

创建鸟瞰图图像

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

要创建鸟瞰图像,首先定义相机传感器配置。本例末尾金宝app列出的支持函数,camvidMonoCameraSensor,返回monoCamera表示用来收集CamVid [1]数据单眼照相机对象。配置monoCamera需要摄像机的内建和外建,它们是使用CamVid数据集中提供的数据进行估计的。为了估计摄像机的内建,该函数使用了CamVid的棋盘格校准图像和相机校准器app.对摄像机外推特性的估计,如高度和俯仰,是由CamVid数据集的作者根据外部数据估计得到的。

为摄像机数据创建单摄像机。传感器= camvidMonoCameraSensor();

给定摄像机设置,birdsEyeView物体将原来的图像转换成鸟瞰图。此对象允许您指定使用车辆坐标转换的区域。注意,车辆坐标单位是由monoCamera对象,当以米为单位指定摄像头的安装高度。例如,如果以毫米为单位指定高度,模拟的其余部分将使用毫米。

定义鸟瞰图转换参数。distAheadOfSensor = 20;%以米,如先前在monoCamera高度输入指定spaceToOneSide = 3;%看3米到左,右bottomOffset = 0;outView = [bottomOffset, distAheadOfSensor, -spaceToOneSide, spaceToOneSide];outImageSize = [NaN, 256];输出图像宽度(以像素为单位)%;高度是自动选择,以保持单位每像素的比例birdsEyeConfig = birdsEyeView(传感器,outView,outImageSize);

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

根据CamVid传感器的大小调整图像和空闲空间的大小。IMAGESIZE = sensor.Intrinsics.ImageSize;I = imresize(I,IMAGESIZE);freeSpaceConfidence = imresize(freeSpaceConfidence,IMAGESIZE);%将图像和自由空间信心得分转换为鸟瞰图。imageBEV = transformImage(birdsEyeConfig,I);freeSpaceBEV = transformImage(birdsEyeConfig,freeSpaceConfidence);在鸟瞰图中显示图像框。图imshow(imageBEV)

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

图于imagesc(freeSpaceBEV)标题(“自由空间的信心”

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

在自由空间估计创建入住基于网格

入住网格用于表示车辆周围的车辆坐标的离散网格和用于路径规划。在占用网格中的每个单元具有表示该小区的占用的可能性的值。估计的可用空间可以用来填补占用网格的值。

该程序使用免费的空间估计是如下填写入住格:

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

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

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

  4. 用样品在(X,Y)的位置的自由空间置信度值griddedInterpolant插值图像中不完全位于像素中心的自由空间置信值。

  5. 装满所有的(X,Y)的平均自由空间的信心值占用网格单元格点对应于该网格单元。

为简单起见,上述过程在支持函数中实现,金宝appcreateOccupancyGridFromFreeSpaceEstimate,它列在本例的末尾。根据鸟瞰配置定义占用网格的大小,并通过调用创建占用网格createOccupancyGridFromFreeSpaceEstimate

定义占用网格的尺寸和分辨率。为gridx = distAheadOfSensor;gridY = 2 * spaceToOneSide;CELLSIZE = 0.25;%的米以匹配CamVid传感器使用的单位%创建一个从自由空间估计占用电网。occupancyGrid = createOccupancyGridFromFreeSpaceEstimate (...freeSpaceBEV, birdsEyeConfig, gridX, gridY, cellSize);

使用可视化入住电网birdsEyePlot。创建一个birdsEyePlot并在上面添加占用网格使用令pColor

绘制鸟瞰图。BEP = birdsEyePlot(“XLimits”,[0 distAheadOfSensor]'YLimits'[-5 5]);在鸟瞰图中添加居住网格。保持[numCellsY, numCellsX] =大小(occupancyGrid);X = linspace(0, gridX, numCellsX);Y = linspace(-gridY/2, gridY/2, numCellsY);h = pcolor (X, Y, occupancyGrid);标题(“占用网格(概率)”)colorbar删除(传奇)使占用网格可视化透明并移除网格线。h.FaceAlpha = 0.5;h.LineStyle ='没有';

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

将覆盖区域添加到绘图中。caPlotter = coverageAreaPlotter (cep),“DisplayName的”“覆盖范围”);用的视图的35度的字段和范围60米%更新它mountPosition = [0 0];范围= 15;取向= 0;fieldOfView = 35;plotCoverageArea(caPlotter, mountPosition, range, orientation, fieldOfView);保持

来自多个传感器的显示数据是用于诊断和调试通过自主车的决策非常有用。

使用入住率网格创建车辆成本地图

vehicleCostmap提供的功能来检查地点,车辆或世界坐标,被占用或免费。此检查是必需的任何路径规划或决策算法。创建vehicleCostmap使用所生成的occupancyGrid

创建成本地图。costmap = vehicleCostmap (flipud (occupancyGrid),...'CELLSIZE',CELLSIZE,...'MapLocation'[0,-spaceToOneSide]);costmap.CollisionChecker。InflationRadius = 0;显示成本地图。图绘制(costmap,“通货膨胀”“关”) colormap(parula)“车辆Costmap”调整成本地图的方向,使其与车辆坐标一致%系统,其中x轴指向前面的自我车辆和y轴指向左边。视图(GCA,-90,90)

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

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

使用checkOccupied检查每个位置是否被占用或免费。根据研究结果,一个潜在的路径可能是无法跟随,因为它与定义的障碍碰撞costmap

%检查的地点都被占用。isOccupied = checkOccupied (costmap candidateLocations);%分区的位置分成免费和占用可视化的目的。occupiedLocations = candidateLocations(isOccupied,:);freeLocations = candidateLocations(〜isOccupied,:);在成本地图的顶部显示空闲和占用的点。保持markerSize = 100;散射(freeLocations(:,1),freeLocations(:,2),markerSize,‘g’'填充')散射(occupiedLocations (: 1) occupiedLocations (:, 2), markerSize,'R''填充');传说([“免费”“占领”])保持

的使用occupancyGridvehicleCostmap,checkOccupied如上所示示出了由路径规划者例如所用的基本操作pathPlannerRRT了解更多关于在路径规划自动代客泊车例。

参考

[1] Brostow,加布里埃尔J.,于连Fauqueur,和Roberto泊拉。“在视频语义对象类:一种是高清晰度地面真实的数据库。”模式识别的字母。卷。30,第2期,2009年,第88-97。

金宝app支持功能

函数传感器= camvidMonoCameraSensor()根据来自摄像机的数据返回单摄像机配置%数据集[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%的引用% - - - - - - - - - - -Brostow, Gabriel J., Julien Fauqueur, and Roberto Cipolla。“语义对象视频课程:高清地面真相数据库。_Pattern Recognition%Letters_。卷。30,第2期,2009年,第88-97。calibrationData =负载(“camera_params_camvid.mat”);描述相机配置。长焦点= calibrationData.cameraParams.FocalLength;principalPoint = calibrationData.cameraParams.PrincipalPoint;IMAGESIZE = calibrationData.cameraParams.ImageSize;%摄像机高度估计基于在描绘相机设定[1]:% http://mi.eng.cam.ac.uk/ gjb47 / tmp / prl08.pdf身高= 0.5;离地高度(米)使用数据集中提供的摄像机挤出物计算摄像机俯仰%。节距= 0;相机的俯仰,朝向地面,角度camIntrinsics = cameraIntrinsics (focalLength principalPoint图象尺寸);传感器= monoCamera (camIntrinsics、身高、“节”,沥青);结束
函数occupancyGrid = createOccupancyGridFromFreeSpaceEstimate (...freeSpaceBEV,birdsEyeConfig,为gridx,gridY,CELLSIZE)%返回包含占据概率上的占有率网格%均匀的2-d的网格。占用网格中的单元数%。numCellsX =小区(为gridx / CELLSIZE);numCellsY =小区(gridY / CELLSIZE);%生成一组(X,Y)点,每个网格单元。这些点是车辆的坐标系统。首先定义每个网格的边缘%的细胞。在车辆坐标中定义每个网格单元的边缘。XEdges = linspace (0 gridX numCellsX);YEdges = linspace(格子/ 2,格子/ 2,numCellsY);接下来,指定要沿着每个生成的样本点的数目一个网格单元内%尺寸。使用这些计算在步长%的X和Y方向。步长将被用于移位的边缘值%每个网格来覆盖网格单元中的整个区域产生的点期望的分辨率。%的样品从每个网格单元20分。采样更多的积分可能会产生以额外计算为代价的平滑估计。numSamplePoints = 20;步长百分比需要采样所需的点数。XStep = (XEdges(2)-XEdges(1)) / (numSamplePoints-1);YStep = (YEdges(2)-YEdges(1)) / (numSamplePoints-1);最后,在网格的两个维度上滑动点集%的细胞。在使用过程中采样占用概率%griddedInterpolant。%取样占据概率创建griddedInterpolant。使用1%减去自由空间的信心来表示占用的概率。1 - freeSpaceBEV;深圳=大小(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;对于I = 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),深圳(2));yq = min (xy(:, 2),深圳(1));使用griddedant和keep采样占用概率流动资金。occupancyGrid = occupancyGrid + F(YQ,XQ);结束结束确定平均占用概率。occupancyGrid = occupancyGrid / numSamplePoints ^ 2;occupancyGrid =重塑(occupancyGrid,numCellsY,numCellsX);结束

也可以看看

应用程序

职能

对象

相关的话题