主要内容

自动标记对象的属性

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

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

  • 使用AutomationAlgorithmAPI来创建自动化算法。看到创建自动标记算法获取详细信息。创建的自动化算法可以与Ground Truth Labeler应用程序一起使用,自动标记车辆,以及存储估计距离的属性。

Ground Truth Labeler应用

良好的地面真实数据对于开发驾驶算法和评估其性能至关重要。然而,创建一组丰富多样的带注释的驾驶数据需要付出巨大的努力。的地面真相标签App使这个过程更加高效。你可以使用这个应用程序作为一个完全手动的标记工具,为自动驾驶系统标记车辆边界框、车道边界和其他感兴趣的对象。您还可以手动指定标记对象的属性。然而,手工标注需要大量的时间和资源。作为替代方案,该应用程序提供了一个框架,用于创建算法来扩展和自动化标签过程。您可以使用所创建的算法快速标记整个数据集,自动用属性注释标签,然后执行更高效、更短的手动验证步骤。您还可以编辑自动化步骤的结果,以解释自动化算法可能遗漏的具有挑战性的场景。

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

从单目摄像机探测车辆

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

从视频中读出感兴趣的一帧。vidObj =视频阅读器(“05 _highway_lanechange_25s.mp4”);vidObj。CurrentTime = 0.1;I = readFrame(vidObj);加载monoCamera对象。数据=负载(“FCWDemoMonoCameraSensor.mat”“传感器”);Sensor = data.sensor;为车辆装载预先训练好的检测器。。探测器= vehicleDetectorACF();普通车辆的宽度在1.5 - 2.5米之间。vehicleWidth = [1.5, 2.5];配置探测器,以考虑摄像头的配置%和预期车辆宽度探测器= configureDetectorMonoCamera(探测器,传感器,车辆宽度);检测车辆并显示边界框。[bboxes, ~] = detect(检测器,I);Iout = insertShape(I,“矩形”, bboxes);图;imshow (Iout)标题(检测到车辆的

图中包含一个轴对象。标题为Detected Vehicles的axes对象包含一个image类型的对象。

估计到被探测车辆的距离

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

找到图像坐标中每个包围框的中点。midPtsImg = [bboxes (: 1) + bboxes (:, 3) / 2 bboxes (:, 2) + bboxes (:, 4)];midPtsWorld = imageToVehicle(传感器,midPtsImg);x = midPtsWorld(:,1);y = midPtsWorld(:,2);距离=根号x。²+ y.²);显示车辆包围框,并以米为单位标注距离。distancer = cellstr([num2str(距离)repmat(“米”,长度(距离)1)]);Iout = insertObjectAnnotation(I,“矩形”, bboxes, distancestry);imshow (Iout)标题(“车辆与摄影机的距离”

图中包含一个轴对象。标题为“距离of Vehicles from Camera”的axis对象包含一个image类型的对象。

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

将车辆检测和距离估计自动化类合并到应用程序的自动化工作流程中创建自动标记算法欲知详情。从现有的ACF车辆检测自动化算法使用校准的单目摄像机进行车辆检测。然后修改算法以执行属性自动化。在本例中,使用车辆到摄像机的距离作为检测到的车辆的属性。本节描述更改现有ACF车辆检测自动化算法类的步骤。

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

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

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

%-------------------------------------------------------------------- % 车辆检测器性能  %-------------------------------------------------------------------- 属性% SelectedLabelName选中的标签名称%选择标签的名称。算法检测到的车辆将%被分配这个变量名。SelectedLabelName
预训练的车辆检测器,类% acfObjectDetector的对象。探测器
%VehicleModelName车辆检测器模型名称%预训练的车辆检测器模型名称。VehicleModelName = 'full-view';
%OverlapThreshold重叠阈值%消除参考包围框周围重叠包围框的阈值%,取值范围在0 ~ 1之间。边界框重叠率分母,'RatioType'设置为% 'Min'重叠阈值= 0.65;
%ScoreThreshold分类评分阈值%拒绝检测百分比分数低的检测的阈值。ScoreThreshold = 30;
%ConfigureDetector布尔值决定是否配置检测器%布尔值决定是否使用% monoCamera传感器配置检测器。ConfigureDetector = true;
%SensorObj monocamersensor % Monocular Camera用于配置探测器的传感器对象。配置的检测器将运行得更快,并可能导致更好的检测。SensorObj = [];
%SensorStr monoCamera传感器变量名% Monocular Camera用于配置%检测器的传感器对象变量名。SensorStr = ";
%VehicleWidth车辆宽度%用于配置探测器的车辆宽度,指定为% [minWidth, maxWidth],以世界单位描述%对象的大致宽度。VehicleWidth = [1.5 2.5];
% vehiclelth车辆长度%用于配置探测器的车辆长度,指定为% [minLength, maxLength],以世界单位描述%对象的大致长度。VehicleLength = [];结束
%-------------------------------------------------------------------- % 属性自动化属性  %-------------------------------------------------------------------- 属性(常数,访问=私人)
%标志,启用距离属性估计自动化AutomateDistanceAttribute = true;
支持金宝app的距离属性名称。标签必须具有指定名称的属性。金宝appSupportedDistanceAttribName = '距离';结束
属性(Access = private)
距离的实际属性名;
检查指定的属性是否为有效距离的标志结束

步骤3初始化属性。

%-------------------------------------------------------------------- % 初始化传感器、探测器和其他相关属性。函数初始化(algObj)
存储所选标签定义的名称。使用% name标记检测到的车辆。algObj。选择edLabelName = algObj.SelectedLabelDefinitions.Name;
使用预训练的模型初始化车辆检测器。。algObj。检测器= vehicleDetectorACF(algObj.VehicleModelName);
如果algObj. %初始化参数计算车辆距离。AutomateDistanceAttribute initializeAttributeParams (algObj);结束结束
初始化与属性自动化相关的属性。
标签必须有一个属性,名称为距离,类型为数值。hasAttribute = isfield(algObj. isfield)ValidLabelDefinitions, 'Attributes') &&…isstruct (algObj.ValidLabelDefinitions.Attributes);if hasAttribute attributeNames = fieldnames(algObj.ValidLabelDefinitions.Attributes);idx = find(contains(attributeNames, algObj.金宝appSupportedDistanceAttribName));if ~isempty(idx) algObj。距离属性Name = attributeNames{idx}; algObj.HasValidDistanceAttribute = validateDistanceType(algObj); end end end
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 = [];
%配置检测器。如果algObj。ConfigureDetector && ~isa(algObj.Detector,'acfObjectDetectorMonoCamera') vehicleSize = [algObj.VehicleWidth;algObj.VehicleLength];algObj。检测器= configureDetectorMonoCamera(algObj.)探测器,algObj。SensorObj vehicleSize);结束
使用初始化的车辆检测器检测车辆。[bboxes, scores] = detect(algObj.)探测器,我,…“SelectStrongest”,假);
[selectdbbox, selectedScore] = selectstronggestbbox (bboxes, scores,…'RatioType', 'Min', 'OverlapThreshold', algObj.OverlapThreshold);
%拒绝检测分数低于% ScoreThreshold的检测。detectionsToKeepIdx = (selectedScore > algObj.ScoreThreshold);seltedbbox = seltedbbox (detectionsToKeepIdx,:);
如果~isempty(seltedbbox) %在车辆检测器检测到的包围框位置添加自动标签,类型为矩形,名称为所选标签%。autoLabels。Name = algObj.SelectedLabelName;autoLabels。Type = labelType.Rectangle;autoLabels。位置= seltedbbox;
如果(algObj。自动化距离属性&& algObj.HasValidDistanceAttribute) attribName = algObj.DistanceAttributeName; % Attribute value is of type 'Numeric Value' autoLabels.Attributes = computeVehicleDistances(algObj, selectedBbox, attribName); end else autoLabels = []; end end
function midPts = helperFindBottomMidpoint(bboxes) %查找包围框的底边中点。
xBL = bboxes(:,1);yBL = bboxes(:,2);
xM = xBL + bboxes(:,3)/2;yM = yBL + + bboxes(:,4);midPts = [xM yM];
结束
函数距离= computedistance (algObj, bboxes) %计算车辆距离的辅助函数。
midPts = helpfindbottom midpoint (bboxes);xy = algObj.SensorObj.imageToVehicle(midPts);距离=根号(xy(:,1)。²+ xy(:,2).²);
结束
function attribS = computevehicledistance (algObj, bboxes, attribName) %计算车辆距离。
numCars = size(bboxes, 1);attribS = repmat(struct(attribName, 0), [numCars, 1]);
for i=1:numCars distanceVal = computedistance (algObj, bboxes(i,:));attribS(i).(attribName) = distanceVal;结束结束

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

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

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

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

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

groundTruthLabeler 05 _highway_lanechange_25s.mp4
  • ROI标签定义窗格中,单击标签.定义一个带有name的标签车辆和类型矩形.可选地,添加标签描述。然后单击好吧

  • ROI标签定义窗格中,单击属性.用name定义一个属性距离、类型数值,和默认值0.可选地,添加属性描述。然后单击好吧

  • 选择Algorithm >选择“Algorithm >刷新列表”

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

  • 点击自动化.打开一个新选项卡,显示使用算法的方向。

  • 点击设置,在弹出的对话框中输入传感器在第一个文本框中。单击前,可修改其他参数好吧

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

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

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

  • 一旦你对整个视频的车辆包围框和它们的距离感到满意,单击接受

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

结论

该示例展示了将车辆检测和距离属性估计自动化算法合并到的步骤地面真相标签您可以将此概念扩展到其他自定义算法,以扩展应用程序的功能。

另请参阅

应用程序

对象

相关的话题