自动标记对象的属性

这个例子展示了如何开发一个车辆检测和距离估计算法,并使用它来自动标记使用地面真理贴标机在这个例子中,你将学习如何:

  • 开发一种计算机视觉算法来检测视频中的车辆,并使用单目摄像机配置来估计到被检测车辆的距离。

  • 使用AutomationAlgorithmAPI来创建一个自动化算法。看创建标签自动化算法(计算机视觉工具箱)的详细信息。创建的自动化算法可以与Ground Truth Labeler应用程序一起使用,以自动标记车辆,以及存储估计距离的属性。

地面真相贴标程序应用程序

良好的地面真理数据对于开发驾驶算法并评估其性能至关重要。然而,创建丰富和多样化的注释驾驶数据需要大量努力。这地面真理贴标机应用程序使此过程有效。您可以将此应用程序用作完全手动标记工具,以标记自动驱动系统的车辆边界框,车道边界和其他景点对象。您还可以手动指定标记对象的属性。但是,手动标签需要大量的时间和资源。作为替代方案,此应用程序提供了一个框架,用于创建算法以扩展和自动化标记过程。您可以使用您创建的算法快速标记整个数据集,自动将标签与属性注释,然后按照更高的更高效,更短的手动验证步骤进行缩写。您还可以编辑自动化步骤的结果,以考虑自动化算法可能错过的具体场景。

这个示例描述了如何将车辆检测和距离估计自动化算法插入到应用程序的自动化工作流程中ACF车辆检测自动化算法首先检测车辆,然后自动估计被检测车辆与安装在自我车辆上的摄像头的距离。然后,该算法为每一辆检测到的车辆创建一个标签,并用一个属性指定到该车辆的距离。

从单眼相机检测车辆

首先,创建一个车辆检测算法。这单目相机的视觉感知示例描述如何创建一个预先训练的车辆检测器,并使用校准的单目摄像机配置将其配置为检测车辆包围盒。要检测车辆,请在单个视频帧上尝试该算法。

从视频中读一段有趣的内容。vidObj = VideoReader (“05 _highway_lanechange_25s.mp4”);vidObj。CurrentTime = 0.1;I = readFrame (vidObj);加载moncamera对象。data = load(“FCWDemoMonoCameraSensor.mat”'传感器');传感器= data.sensor;装载预先训练过的车辆检测器。探测器= vehicleDetectorACF ();%普通车辆的宽度在1.5 - 2.5米之间。车辆宽度= [1.5,2.5];%配置检测器以考虑摄像机的配置%和预期车辆宽度检测器= configuredetectormoncamera(检测器,传感器,车辆宽度);侦测车辆并显示包围框。[bboxes, ~] = detect(检测器,I);Iout = insertShape(我“矩形”, bboxes);图;imshow (Iout)标题(检测到车辆的

估计检测到的车辆的距离

现在车辆已经被检测到,估计距离被检测车辆从摄像机的世界坐标。monoCamera提供了一个Imagetovehicle.方法将点从图像坐标转换为车辆坐标。这可以用来估计沿地面从相机到探测车辆的距离。该示例指定距离作为被检测车辆的中心点,沿着其正下方的地面。

在图像坐标中找到每个边界框的中点。midptsimg = [bboxes(:,1)+ bboxes(:,3)/ 2 bboxes(:,2)+ bboxes(:,4)./ 2];Midptstrworld = ImageTovehicle(传感器,Midptsimg);x = midptstworld(:,1);y = midptstworld(:,2);距离= sqrt(x。^ 2 + y。^ 2);%显示车辆边框,并以米为单位标注距离。distancr = cellstr([num2str(distance)] repmat(“米”,[长度(距离)1])]);iout = InsertObjectAnnotation(I,“矩形”、bboxes distanceStr);imshow (Iout)标题('来自相机的车辆距离'

准备车辆检测和距离估计自动化类

将车辆检测和距离估计自动化类包含到应用程序的自动化工作流程中。看创建标签自动化算法(计算机视觉工具箱)获取更多细节。从现有的开始ACF车辆检测自动化算法用校准过的单目摄像机进行车辆检测。然后修改算法以执行属性自动化。在本例中,使用车辆到摄像机的距离作为被检测车辆的属性。本节描述更改现有ACF车辆检测自动化算法类的步骤。

步骤1包含定义算法的名称和描述的属性,以及使用算法的方向。

%-------------------------------------------------------------------- % 定义算法名称、描述和UserDirections。属性(常数)
%Name:算法名%指定算法名的字符向量。Name = '车辆检测与距离估计';
% Description:为算法提供一行描述。描述= '使用预先训练的ACF车辆检测器检测车辆,并计算被检测车辆与摄像头的距离';
% UserDirections:提供在调用此算法时显示的一组方向。方向%将作为字符%向量的单元数组提供,单元数组%中的每个元素表示方向列表中的一个步骤。UserDirections ={…“定义一个矩形ROI标签来标记车辆”,…“对于创建的标签定义,定义一个名称为距离、类型为数值、默认值为0的属性。”,……“运行算法”,…'手动检查和修改结果,如果需要'};结束

步骤2包含支持车辆检测和距离估计自动化所需的自定义属性金宝app

%-------------------------------------------------------------------- % 车辆检测器性能  %-------------------------------------------------------------------- 属性% SelectedLabelName选中的标签名称%选择标签的名称。算法检测到的车辆将被赋给这个变量名。SelectedLabelName
%检测器%预训练车辆检测器,类别为% acfObjectDetector的对象。探测器
%vehiclemodelname车辆探测器型号名称%净化车辆探测器模型的名称。vehiclemodelname ='全视图';
%重叠的重叠阈值%阈值用于消除参考边界框周围的重叠边界框,在0和1之间。%边界框重叠比率分母,'ratiotype'被设置为%'min'重叠= 0.65;
%ScoreThreshold分类评分阈值%用于拒绝检测分数低的检测的阈值。ScoreThreshold = 30;
%ConfigureDetector布尔值决定是否配置检测器使用% moncamera传感器。ConfigureDetector = true;
%SensorObj moncamera sensor % Monocular Camera sensor对象用于配置检测器。已配置的检测器将运行得更快,并可能导致更好的检测。SensorObj = [];
%SensorStr单目摄像机传感器变量名称%单目摄像机传感器对象变量名称用于配置%检测器。SensorStr = ";
用于配置检测器的车辆宽度,指定为% [minWidth, maxWidth],以世界单位描述%对象的近似宽度。车辆宽度= [1.5 - 2.5];
%车辆长长的车辆长度%车辆长度用于配置探测器,指定为描述世界单位中%对象的近似长度的%[minlength,maxlength]。车辆力量= [];结束
%-------------------------------------------------------------------- % 属性自动化属性  %-------------------------------------------------------------------- 属性(常数,访问=私人)
%启用距离属性估计的标志automatedistanceattribute = true;
%支金宝app持距离属性名。%标签必须具有指定名称的属性。金宝appSupportedDistanceAttribName =“距离”;结束
属性(Access = private)
%距离的实际属性名DistanceAttributeName;
%标志要检查指定的属性是否有效距离%属性hasvaliddistanceattribute = false;结束

步骤3初始化属性。

%-------------------------------------------------------------------- % 初始化传感器、探测器和其他相关属性。函数初始化(algObj ~)
%存储所选标签定义的名称。使用这个%名称来标记检测到的车辆。algObj。选择edLabelName = algObj.SelectedLabelDefinitions.Name;
用预先训练好的模型初始化车辆检测器。algObj。探测器= vehicleDetectorACF (algObj.VehicleModelName);
%初始化参数来计算车辆距离,如果algoj。AutomateDistanceAttriibute initializeAttributeParams (algObj);结束
初始化与属性自动化相关的属性。
%标签必须具有名称距离和类型%数值的属性。hasattribute = isfield(algobj.validlabeldefinitions,'属性')&& ... isstruct(allobj.validlabeldefefinitions.attributes);如果hasattribute attributenames = fieldnames(algobj.validleabeldefefinitions.Attributes);idx = find(包含(attributenames,algobj.support金宝appeddistanceattribname));如果〜isempty(idx)algobj.distanceattributename = attributenames {idx};algobj.hasvaliddistanceattribute = validatedistancetype(allobj);结束结束
function tf = validateDistanceType(algObj) %验证属性类型。
tf = isfield (algObj.ValidLabelDefinitions。属性s, algObj.DistanceAttributeName) && ... isfield(algObj.ValidLabelDefinitions.Attributes.(algObj.DistanceAttributeName), 'DefaultValue') && ... isnumeric(algObj.ValidLabelDefinitions.Attributes.(algObj.DistanceAttributeName).DefaultValue); end

步骤4包含更新后的文件运行方法计算被检测车辆的距离,并将标签和属性信息写入输出标签。

%-------------------------------------------------------------------- 函数autoLabels =运行(algObj,我)
autoLabels = [];
%配置探测器。如果allobj.configuredetector &&〜isa(allobj.detector,'acfobjectdetectormonocamera')vehiclesize = [allobj.vehiclewidth; allobj.vehiclelength];Algobj.detector = CodentEreteCtormOnoCamera(Algobj.detector,Algobj.sensorobj,Vehicleize);结束
使用初始化的车辆检测器检测车辆。[bboxes, scores] = detect(algoj . txt);探测器,我,…“SelectStrongest”,假);
[selectedBbox, selectedScore] = selectStrongestBbox(bboxes, scores,…'RatioType', 'Min', 'OverlapThreshold', algObj.OverlapThreshold);
%拒绝检测分数低于% ScoreThreshold的检测。detectionsToKeepIdx = (selectedScore > algObj.ScoreThreshold);selectedBbox = selectedBbox (detectionsToKeepIdx:);
如果~为空(selecteddbbox) %在车辆检测器检测到的包围盒位置添加自动标签,类型为矩形,名称为%所选标签。autoLabels。= algObj.SelectedLabelName名称;autoLabels。类型= labelType.Rectangle;autoLabels。位置= selectedBbox;
如果(algObj。自动化距离Attriibute && algObj.HasValidDistanceAttribute) attribName = algObj.DistanceAttributeName; % Attribute value is of type 'Numeric Value' autoLabels.Attributes = computeVehicleDistances(algObj, selectedBbox, attribName); end else autoLabels = []; end end
函数midPts = helperFindBottomMidpoint(bboxes) %查找边界框下边缘的中点。
xBL = bboxes (: 1);yBL = bboxes (:, 2);
xM = xBL + bboxes(:,3)/2;y = yBL + + bboxes(:,4)./2;midPts = [xM yM];
结束
函数distance = computedistance (algObj, bboxes) %计算车辆距离的辅助函数。
Midpts = HelperfindbottommidPoint(Bboxes);xy = allobj.sensorobj.imagetovehicle(米特);距离= sqrt(xy(:,1)。^ 2 + xy(:,2)。^ 2);
结束
function attribS = computevehicledistance (algObj, bboxes, attrbname) %计算车辆距离。
numCars = size(bboxes, 1);= repmat(struct(attribName, 0), [numCars, 1]);
对于i = 1:numcars utithtval = computedistances(allobj,bboxes(i,:));attribs(i)。(attribname)=距离;结束

使用App中的车辆检测和距离估计自动化类

车辆距离计算算法的包装版本可在VehicleDetectionAndDistanceEstimation类。要在应用程序中使用这个类:

  • 在当前文件夹下创建所需的文件夹结构,并将自动化类复制到其中。

mkdir(“+视觉/ +贴标签机”);拷贝文件(fullfile (matlabroot“例子”,“驾驶”,“主要”,“VehicleDetectionAndDistanceEstimation.m”),“+视觉/ +贴标签机”);
  • 加载monoCamera信息进入工作区。此摄像机传感器信息适用于本例视频中使用的摄像机,05年_highway_lanechange_25s.mp4.如果加载不同的视频,请使用适合该视频的传感器信息。

负载(“FCWDemoMonoCameraSensor。席”、“传感器”)
  • 打开地下标签应用程序。

groundTruthLabeler 05 _highway_lanechange_25s.mp4
  • ROI标签定义窗格中,单击标签.定义一个带有名称的标签车辆和类型长方形.(可选)添加标签描述。然后点击好吧

  • ROI标签定义窗格中,单击属性.定义一个带有名称的属性距离、类型数值,默认值为0.(可选)添加属性描述。然后点击好吧

  • 选择算法>选择算法>刷新列表

  • 选择>算法车辆检测和距离估计.如果没有看到此选项,请确保当前工作文件夹中有一个名为+视觉/ +贴标签机,文件名为VehicleDetectionAndDistanceEstimation.m在里面。

  • 点击自动化.一个新标签页打开,显示使用算法的方向。

  • 点击设置,并在打开的对话框中输入传感器在第一个文本框中。如果需要修改其他参数,请单击好吧

  • 点击运行.车辆检测和距离计算算法通过视频进行。请注意,在一些框架中,结果并不令人满意。

  • 运行完成后,使用滑块或方向键在视频中滚动,以定位算法失败的帧。

  • 手动调整结果,要么移动车辆包围框或改变距离值。您还可以删除边界框和相关的距离值。

  • 在您对整个视频的距离和它们的距离感到满意后,请单击接受

完成了车辆自动检测和距离属性标注。您现在可以标记其他感兴趣的对象并设置它们的属性、保存会话或导出此标记运行的结果。

结论

这个例子展示了将车辆检测和距离属性估计自动化算法合并到地面真理贴标机你可以将这个概念扩展到其他自定义算法,以扩展应用程序的功能。

也可以看看

应用程序

对象

相关的话题