主要内容

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

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

对自由空间估计

自由空间估计识别领域的环境中自我车辆可以不触及任何障碍,如行人、限制或其他车辆。汽车可以使用各种传感器估计自由空间,如雷达、激光雷达、相机。这个例子着重估计自由空间从一个使用语义分割的图像传感器。

在这个例子中,您将了解如何:

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

  • 创建一个使用自由空间估计占用网格。

  • 可视化占用网格上鸟瞰的阴谋。

  • 创建一个使用占用车辆costmap网格。

  • 检查位置是否在世界上占领或免费。

下载Pretrained网络

这个示例使用pretrained语义分割网络,可以将像素划分为11个不同的分类,包括,行人,,天空。自由空间的图像估计可以通过定义图像像素分类为自由空间。所有其他类被定义为非自由空间或障碍。

完整的程序训练该网络所示语义分割使用深度学习的例子。下载pretrained网络。

% pretrained网络下载。pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/segnetVGG16CamVid.mat”;pretrainedFolder = fullfile (tempdir,“pretrainedSegNet”);pretrainedSegNet = fullfile (pretrainedFolder,“segnetVGG16CamVid.mat”);如果~存在(pretrainedFolder“dir”mkdir (pretrainedFolder);disp (“下载pretrained SegNet (107 MB)……”);websave (pretrainedSegNet pretrainedURL);disp (“下载完成了。”);结束% %加载网络。data =负载(pretrainedSegNet);网= data.net;

注意:下载数据的时间取决于您的网络连接。上面的命令使用MATLAB直到下载完成。或者,您可以使用web浏览器的第一个数据集下载到您的本地磁盘。在这种情况下,使用你从网上下载的文件,更改pretrainedFolder变量上面下载的文件的位置。

估计自由空间

估计自由空间处理的图像使用语义分割网络下载。网络返回为每个图像像素在图像分类。自由空间被确定为图像像素被归类为

在本例中使用的图像是一个单帧的图像序列的CamVid数据集[1]。这个示例中所示的程序可以应用于一个帧序列来估计车辆行驶中自由空间。然而,由于一个很深的卷积神经网络架构是本例中使用(SegNet VGG-16编码器),大约需要1秒来处理每一帧。因此,对于权宜之计,过程一个框架。

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

理解的信心自由空间估计,显示的输出分数类为每个像素。信心值可以用来通知下游估计算法的有效性。例如,即使网络将一个像素,信心得分可能足够低的漠视,分类由于安全原因。

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

虽然初始分割结果像素显示大多数像素在路上被正确分类,可视化的分数提供了丰富的细节这些分类的分类器的信心。例如,信心减少当你走近汽车的边界。

创建鸟瞰图图像

自由空间估计图像中生成空间。促进代的入住率网格用于导航、自由空间估计需要转化为车辆坐标系。可以通过将自由空间估计转换为一个鸟瞰图的形象。

创建鸟瞰图形象,首先定义相机传感器配置。支持函数金宝app列出在这个例子中,camvidMonoCameraSensor,返回一个monoCamera对象代表单眼相机用于收集CamVid[1]的数据。配置monoCamera需要相机intrinsic和外在,估计使用数据提供的CamVid数据集。估计相机intrinsic, CamVid棋盘图像校准和使用的功能相机校准器应用。估计相机外,如高度和间距,来自外在的数据估计的作者CamVid数据集。

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

考虑到相机设置,birdsEyeView对象转换原始图像的鸟瞰图。该对象允许您指定您想要的区域,使用车辆坐标转换。注意车辆坐标单位建立的monoCamera中指定的对象,当摄像机安装高度是米。例如,如果指定的高度是毫米,其余的模拟会使用毫米。

%定义鸟瞰图变换参数。distAheadOfSensor = 20;%的米,正如前面monoCamera高度中指定的输入spaceToOneSide = 3;% 3米左右bottomOffset = 0;官样文章= [bottomOffset distAheadOfSensor、-spaceToOneSide spaceToOneSide);outImageSize =(南,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)点信心值对应于网格单元。

为简便起见,上面所示的程序实现的支持功能,金宝appcreateOccupancyGridFromFreeSpaceEstimate年底上市这个例子。定义占用网格的尺寸的鸟瞰图配置和创建占用网格通过调用createOccupancyGridFromFreeSpaceEstimate

%定义占用网格的尺寸和分辨率。gridX = distAheadOfSensor;格子= 2 * spaceToOneSide;cellSize = 0.25;%在米比赛CamVid传感器使用的单位%创建自由空间的占用网格估计。occupancyGrid = createOccupancyGridFromFreeSpaceEstimate (格子,freeSpaceBEV、birdsEyeConfig gridX cellSize);

可视化占用网格使用birdsEyePlot。创建一个birdsEyePlot并添加占用网格上使用pcolor

%创建鸟瞰的阴谋。cep = birdsEyePlot (“XLimits”[0 distAheadOfSensor],“YLimits”5 [5]);%增加占用网格鸟瞰的阴谋。持有[numCellsY, numCellsX] =大小(occupancyGrid);X = linspace (0 gridX numCellsX);Y = linspace(格子/ 2,格子/ 2,numCellsY);h = pcolor (X, Y, occupancyGrid);标题(“占用网格(概率)”)colorbar删除(传奇)%的入住率网格可视化透明和删除网格线。h。FaceAlpha = 0.5;h。线型=“没有”;

鸟瞰的情节也可以显示来自多个传感器的数据。例如,增加雷达覆盖区使用coverageAreaPlotter

%增加覆盖范围。caPlotter = coverageAreaPlotter (cep),“DisplayName的”,“覆盖范围”);%更新它的视野35度和一系列60米mountPosition = [0 0];范围= 15;取向= 0;fieldOfView = 35;plotCoverageArea (caPlotter mountPosition、范围、定位、fieldOfView);持有

显示来自多个传感器的数据是有用的诊断和调试自动车辆所做的决定。

使用占用网格创建车辆Costmap

vehicleCostmap提供了功能检查地点,在车辆或世界坐标,或免费。这张支票需要任何路径或决策算法。创建vehicleCostmap使用生成的occupancyGrid

%创建costmap。costmap = vehicleCostmap (flipud (occupancyGrid),“CellSize”cellSize,“MapLocation”[0,-spaceToOneSide]);costmap.CollisionChecker。InflationRadius = 0;%显示costmap。图绘制(costmap,“通货膨胀”,“关闭”)colormap (parula) colorbar标题(“车辆Costmap”)%东方costmap和车辆坐标%系统,轴点自我车辆和前面%轴指向左边。视图(gca、-90、90)

说明如何使用vehicleCostmap在世界坐标,创建一组位置。这些位置代表车辆可以遍历的路径。

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

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

%检查位置是否占据。isOccupied = checkOccupied (costmap candidateLocations);%位置分割成免费并占领了可视化的目的。occupiedLocations = candidateLocations (isOccupied:);freeLocations = candidateLocations (~ isOccupied:);%显示自由和占领点costmap之上。持有markerSize = 100;散射(freeLocations (: 1) freeLocations (:, 2), markerSize,‘g’,“填充”)散射(occupiedLocations (: 1) occupiedLocations (:, 2), markerSize,“r”,“填充”);传奇([“免费”“占领”)举行

的使用occupancyGrid,vehicleCostmap,checkOccupied上图说明所使用的基本操作路径规划等pathPlannerRRT。了解更多关于路径规划自动停车员的例子。

引用

加布里埃尔·[1]Brostow J。,Julien Fauqueur, and Roberto Cipolla. "Semantic Object Classes in Video: A high-definition ground truth database."模式识别的字母。问题2卷。30日,2009年,页88 - 97。

金宝app支持功能

函数传感器= camvidMonoCameraSensor ()%返回一个从CamVid monoCamera相机配置基于数据%数据集[1]。%% cameraCalibrator应用程序被用来校准相机使用%在CamVid校准图片提供:%% http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/CalibrationSeq_and_Files_0010YU.zip%%校准模式网格大小是28毫米。%%计算相机间距从相机姿态矩阵(rt)存储在这里:%% http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/EgoBoost_trax_matFiles.zip%的引用% - - - - - - - - - - -加布里埃尔·% [1]Brostow J。,Julien Fauqueur, and Roberto Cipolla. "Semantic Object%的课程视频:高清地面实况数据库。”_Pattern Recognition% Letters_。问题2卷。30日,2009年,页88 - 97。calibrationData =负载(“camera_params_camvid.mat”);%描述相机的配置。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 =装天花板(gridX / cellSize);numCellsY =装天花板(格子/ 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% -自由空间信心代表入住率的概率。occupancyProb = 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;我= 1:numSamplePoints在y方向上的%增加采样点Y = YEdges +(张)* 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));%样本入住率概率使用griddedInterpolant和保持%一个正在运行的总和。occupancyGrid = occupancyGrid + F (yq xq);结束结束%确定平均入住率概率。occupancyGrid = occupancyGrid / numSamplePoints ^ 2;occupancyGrid =重塑(occupancyGrid numCellsY numCellsX);结束

另请参阅

应用程序

功能

对象

相关的话题