自动化地面真理标签语义分割
这个例子展示了如何使用一个pretrained语义分割算法部分天空,道路在一个图像,并使用该算法自动化地面真理的标签地面实况贴标签机应用程序。
地面真理贴标签机应用
良好的地面实况数据是至关重要的为开发自动驾驶算法和评估他们的表现。但是,创建和维护一套多样化和高质量的带注释的驾驶数据需要大量的努力。的地面实况贴标签机应用程序使这个过程变得方便高效。这个程序包括功能注释对象作为矩形,线,或像素标签。像素标签是一个过程,每个像素在图像分配一个类或类别,可以用来训练进行像素级分割算法。虽然您可以使用应用程序手动标签所有数据,这个过程需要大量的时间和资源,特别是对像素标签。作为一种替代方法,软件还提供了一个框架,将算法扩展和自动标记的过程。您可以使用您创建的算法自动标签整个数据集,然后结尾更高效,更短的手动验证步骤。你也可以编辑的结果占具有挑战性的情况,该算法自动化一步可能会错过。
在本例中,您将:
使用pretrained分割算法部分像素属于类别“路”和“天空”。
创建一个自动化算法可用于地面真理贴标签机应用自动标签路和天空像素。
这地面实况数据可以用于一个新的语义分割网络训练,或再培训现有的一个。
创建一个道路和天空检测算法
首先,创建一个语义分割算法部分道路和天空像素在一个图像。的语义分割使用深度学习例子描述了如何训练深度学习网络语义分割。这个网络已经训练预测11类语义标签包括“路”和“天空”。这些网络的性能取决于可概括的。应用网络的情况下他们没有遇到在训练会导致欠佳的结果。迭代引入自定义训练数据来学习过程能使网络更好的表现类似的数据集。
下载一个网络,这是pretrainedCamVid数据集[1][2]剑桥大学的。
pretrainedURL =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/vision/data/segnetVGG16CamVid.mat”;pretrainedFolder = fullfile (tempdir,“pretrainedSegNet”);pretrainedSegNet = fullfile (pretrainedFolder,“segnetVGG16CamVid.mat”);如果~存在(pretrainedSegNet“文件”)如果~存在(pretrainedFolder“dir”mkdir (pretrainedFolder);结束disp (“下载pretrained SegNet (107 MB)……”);websave (pretrainedSegNet pretrainedURL);结束
下载pretrained SegNet (107 MB)…
段图像并显示它。
%负载的语义分割网络data =负载(pretrainedSegNet);%从drivingdata加载测试图像roadSequenceData = fullfile (toolboxdir (“开车”),“drivingdata”,“roadSequence”);我= imread (fullfile (roadSequenceData,“f00000.png”));%在形象上运行网络automatedLabels = semanticseg(我,data.net);%显示标签覆盖在图像,选择相关类别图中,imshow (labeloverlay (automatedLabels,我“IncludedLabels”,(“天空”,“路”)));
网络的输出MATLAB®中表示为一个分类矩阵。列出的类别包括所有那些语义分割网络一直在训练,不仅出现在输出的类别。这些信息也可以从网络对象本身。
data.net.Layers .ClassNames(结束)
%类别的像素标记列表类别(automatedLabels)
ans =11×1细胞{‘天空’}{“建筑”}{“极点”}{‘路’}{“路面”}{‘树’}{‘SignSymbol}{“栅栏”}{‘汽车’}{“行人”}{“骑自行车”}
%的蓝色覆盖表示“天空”类别,和绿色的覆盖%表示“道路”。
像素分割算法集成到地面真理贴标签机
把这个语义分割算法集成到自动化的工作流应用程序通过创建一个类继承自抽象基类vision.labeler.AutomationAlgorithm
。这个基类定义的API应用程序使用的配置和运行算法。地面真理贴标签机应用程序提供了一种方便的方法来获得一个初始自动化类模板。有关详细信息,请参见为标签创建自动化算法。的RoadAndSkySegmentation
类是基于这个模板和提供了一个现成的自动化类像素标签分割。
第一组的属性RoadAndSkySegmentation
类指定名称的算法,提供一个简要的描述,并给出方向使用它。
属性(常数)
%的名字%特征向量算法指定名称。Name = ' RoadAndSkySegmentation '
% %字符描述向量指定简短描述的算法。描述= '这个算法使用semanticseg pretrained网络注释道路和天空的
% UserDirections %单元阵列特征向量指定方向为%算法用户为了使用算法。UserDirections = {…['手动标记算法是一种自动化自动化”……的任务。这AutomationAlgorithm自动创建像素”,…对道路和天空的标签。'],……['审查和修改:审查自动标签间隔的,…“使用播放控制。修改/删除/添加roi,没有……”满意地自动在这个阶段。 If the results are ' ... 'satisfactory, click Accept to accept the automated labels.'], ... ['Accept/Cancel: If results of automation are satisfactory, ' ... 'click Accept to accept all automated labels and return to ' ... 'manual labeling. If results of automation are not ' ... 'satisfactory, click Cancel to return to manual labeling ' ... 'without saving automated labels.']}; end
下一节的RoadAndSkySegmentation
类指定自定义属性所需的核心算法。的PretrainedNetwork
财产持有pretrained网络。的AllCategories
财产持有的所有类别的名称。
属性% PretrainedNetwork节省SeriesNetwork对象语义%分割。PretrainedNetwork
%类别拥有默认的“背景”,“路”,和“天空”%分类类型。AllCategories ={‘背景’};
%的商店名称“路”和“天空”。RoadName SkyName结束
checkLabelDefinition
第一个方法中定义RoadAndSkySegmentation
,检查,只有标签的类型PixelLabel
支持自动化。PixelLabel
是唯一类型所需的语义分割。
函数= checkLabelDefinition特遣部队(~,labelDef) isValid = false;
如果(strcmpi (labelDef。名字,“道路”)& & labelDef。类型= = labelType.PixelLabel) isValid = true;algObj。路Name = labelDef.Name; algObj.AllCategories{end+1} = labelDef.Name; elseif (strcmpi(labelDef.Name, 'sky') && labelDef.Type == labelType.PixelLabel) isValid = true; algObj.SkyName = labelDef.Name; algObj.AllCategories{end+1} = labelDef.Name; elseif(labelDef.Type == labelType.PixelLabel) isValid = true; end end
下一组函数控制算法的执行。的vision.labeler.AutomationAlgorithm
类包含一个接口包含方法“初始化”
,“运行”
,“终止”
轻松设置和运行的自动化。的初始化
基于现有的填充函数算法的初始状态标签的应用。RoadAndSkySegmentation
类,初始化
函数定义加载pretrained语义分割网络tempdir
并保存它PretrainedNetwork
财产。
函数初始化(algObj, ~ ~)
% tempdir pretrainedSegNet在哪里下载。pretrainedFolder = fullfile (tempdir pretrainedSegNet);pretrainedSegNet = fullfile (pretrainedFolder segnetVGG16CamVid.mat);data =负载(pretrainedSegNet);%将网络存储在“PretrainedNetwork”这个对象的属性。algObj。PretrainedNetwork = data.net;结束
接下来,运行
函数定义了这个自动化类的核心语义分割算法。运行
呼吁每个视频帧,预计自动化类返回一组标签。的运行
函数RoadAndSkySegmentation
包含逻辑引入之前创建分类矩阵对应像素标签的“路”和“天空”。这可以扩展到任何类别网络训练,并仅仅局限于这两个用来展示。
函数autoLabels =运行(algObj,我)%设置分类矩阵与类别包括道路和%天空autoLabels =分类(0(大小(我,1),大小(我,2)),0:2,algObj.AllCategories,“顺序”,真正的);
pixelCat = semanticseg(我algObj.PretrainedNetwork);如果~ isempty (pixelCat) %在边界框的位置添加选中的标签(s) autoLabels (pixelCat = =“道路”)= algObj.RoadName;autoLabels (pixelCat = = "天空")= algObj.SkyName;结束结束
该算法不需要任何清理,所以终止
函数是空的。
使用像素分割自动化类的应用
在前一节中描述的属性和方法已经实现RoadAndSkySegmentation
自动化算法类文件。使用这个类的应用程序:
创建一个文件夹结构
+视觉/ +贴标签机
需要在当前文件夹,并自动化类复制到它。
mkdir(“+视觉/ +贴标签机”);拷贝文件(“RoadAndSkySegmentation.m”、“+视觉/ +贴标签机”);
打开
groundTruthLabeler
应用定制数据标签。出于演示目的,打开caltech_cordova1.avi
视频。
groundTruthLabeler caltech_cordova1.avi
在左边窗格中,单击定义新的ROI标签按钮和定义两个ROI标签的名字
路
和天空
类型的,像素标签
如图所示。
点击算法> >刷新列表选择算法。
点击算法> RoadAndSkySegmentation。如果您没有看到这个选项,确保当前工作目录中有一个文件夹
+视觉/ +贴标签机
,文件命名RoadAndSkySegmentation.m
在里面。点击自动化。一个新的面板打开,显示方向使用算法。
点击运行。创建算法执行的每一帧视频分段“路”和“天空”类别。运行完成后,使用滑块或箭头键滚动视频和验证自动化算法的结果。
很明显,区域外的摄像机的视野被错误地贴上“天空”,和部分自我车辆本身被标记为“道路”。这些结果表明,网络没有以前训练等数据。这个工作流允许进行手动修正这些结果,这样一个迭代过程的训练和标签(有时称为主动学习或人类的循环)可用于进一步完善网络自定义数据集的准确性。您可以手动调整使用画笔工具的结果标签像素选项卡,并添加或删除像素注释。其他工具,如洪水填充和智能多边形也是可用的标签像素选项卡,可以在适当的时候使用。
一旦你感到满意的像素标签类别为整个视频,点击接受。
自动化视频像素标记为完成。您现在可以进行标签感兴趣的其他对象,保存会话,或出口标识运行的结果。
结论
这个例子展示了如何使用一个pretrained语义分割网络加速道路和天空像素标签在地面真理贴标签机应用程序使用AutomationAlgorithm
接口。
引用
加布里埃尔·Brostow J。,Jamie Shotton, Julien Fauqueur, and Roberto Cipolla. "Segmentation and Recognition Using Structure from Motion Point Clouds."大会。2008年。
加布里埃尔·Brostow J。,Julien Fauqueur, and Roberto Cipolla. "Semantic Object Classes in Video: A High-Definition Ground Truth Database."模式识别的字母。2008年。