主要内容

estimateAnchorBoxes

估计深度学习对象检测器的锚框

描述

例子

anchorBoxes= estimateAnchorBoxes (trainingDatanumAnchors使用训练数据估计指定数量的锚盒。

anchorBoxesmeanIoU= estimateAnchorBoxes(trainingDatanumAnchors额外返回每个集群中锚框的平均交叉-联合(IoU)值。

例子

全部折叠

这个例子展示了如何使用包含训练数据的表来估计锚框。第一列包含训练图像,其余列包含标记的包围框。

数据=负载(“vehicleTrainingData.mat”);trainingData = data.vehicleTrainingData;

创建一个boxLabelDatastore对象使用来自训练数据的标记包围框。

blds = boxLabelDatastore(trainingData(:,2:end));

估计锚框使用boxLabelDatastore对象。

numAnchors = 5;锚定箱= estimateAnchorBoxes(blds,numAnchors);

指定图像大小。

inputImageSize = [128,228,3];

指定要检测的类的数量。

numClasses = 1;

使用预训练的ResNet-50网络作为YOLO v2网络的基础网络。

网络= resnet50();

指定用于特征提取的网络层。您可以使用analyzeNetwork函数查看网络中的所有层名。

featureLayer =“activation_49_relu”

创建YOLO v2对象检测网络。

lgraph = yolov2Layers(inputImageSize,numClasses,anchorBoxes,network, featureLayer)
lgraph = LayerGraph with properties: Layers: [182×1 nnet.cnn.layer.Layer] Connections: [197×2 table] InputNames: {'input_1'} OutputNames: {'yolov2OutputLayer'}

使用网络分析器可视化网络。

analyzeNetwork (lgraph)

锚盒是快速R-CNN和YOLO v2等深度学习对象检测器的重要参数。锚盒的形状、尺寸和数量影响探测器的效率和精度。

有关更多信息,请参见用于对象检测的锚框

负荷训练数据

加载车辆数据集,其中包含295张图像和相关的框标签。

数据=负载(“vehicleTrainingData.mat”);vehicleDataset = data.vehicleTrainingData;

将完整路径添加到本地车辆数据文件夹。

dataDir = fullfile(toolboxdir(“愿景”),“visiondata”);vehicleDataset。imageFilename = fullfile(dataDir,vehicleDataset.imageFilename);

显示数据集摘要。

总结(vehicleDataset)
变量:imageFilename: 295×1 cell字符向量数组vehicle: 295×1 cell

可视化地面真理盒分布

可视化标记的框,以更好地理解数据集中对象大小的范围。

将所有ground truth方框合并到一个数组中。

allBoxes = vertcat(vehicleDataset.vehicle{:});

绘制框面积与框宽高比。

aspectRatio = allBoxes(:,3) ./ allBoxes(:,4);area = prod(allBoxes(:,3:4),2);图散射(面积,aspectRatio) xlabel(“箱区”) ylabel (纵横比(宽/高));标题(“方框面积与纵横比”

该图显示了几组大小和形状相似的物体,但是,由于这些组是分散的,手动选择锚框是困难的。估计锚盒的更好方法是使用聚类算法,该算法可以使用有意义的度量将相似的盒子分组在一起。

估算锚箱

估计锚盒从训练数据使用estimateAnchorBoxes函数,它使用交叉-联合(IoU)距离度量。

基于IoU的距离度量不受盒子大小的影响,这与欧几里得距离度量不同,后者会随着盒子大小的增加而产生更大的误差[1]。此外,使用IoU距离度量将导致具有相似宽高比和大小的盒子聚集在一起,从而产生适合数据的锚盒估计。

创建一个boxLabelDatastore使用车辆数据集中的地面真值框。如果训练对象检测器的预处理步骤涉及调整图像的大小,请使用变换而且bboxresize控件中的包围框大小boxLabelDatastore在估算锚盒之前。

trainingData = boxLabelDatastore(vehicleDataset(:,2:end));

选择锚的数量,并估计使用的锚盒estimateAnchorBoxes函数。

numAnchors =5;[anchorBoxes,meanIoU] = estimateAnchorBoxes(trainingData,numAnchors);anchorBoxes
anchorBoxes =5×221 27 87 116 67 92 43 61 86 105

选择锚的数量是另一个训练超参数,需要使用实证分析仔细选择。判断估计锚盒的质量指标之一是每个集群中盒子的平均IoU。的estimateAnchorBoxes函数使用k-means聚类算法与IoU距离度量,用公式计算重叠,1 -bboxOverlapRatio(allBoxes boxInCluster)

meanIoU
meanIoU = 0.8411

平均IoU值大于0.5,可以保证锚框与训练数据中的框有很好的重叠。增加主播的数量可以改善平均欠条测量。然而,在目标检测器中使用更多的锚盒也会增加计算成本并导致过拟合,从而导致探测器性能较差。

扫描一个范围的值,并绘制平均IoU与锚箱数量的关系,以衡量锚箱数量与平均IoU之间的权衡。

maxNumAnchors = 15;meanIoU = 0 ([maxNumAnchors,1]);anchorBoxes = cell(maxNumAnchors, 1);k = 1:maxNumAnchors估计锚点和平均欠条。[anchorBoxes{k},meanIoU(k)] = estimateAnchorBoxes(trainingData,k);结束图的阴谋(1:maxNumAnchors meanIoU,“o”) ylabel (“意思是借据”)包含(“锚数”)标题(“主播数量vs平均欠条”

使用2个锚箱时,平均欠条值大于0.65,使用7个以上锚箱时,平均欠条值仅略有改善。根据这些结果,下一步是使用2到6之间的值来训练和评估多个对象检测器。这种实证分析有助于确定满足应用程序性能需求(如检测速度或准确性)所需的锚盒数量。

输入参数

全部折叠

训练数据,指定为返回具有两列或多列的单元格数组或表的数据存储。的单元格数组中必须包含边界框-by-4矩阵,格式为[xy宽度高度].

数据存储必须是以下类型之一:

  • 一个boxLabelDatastore格式为[盒子标签

  • 图片盒子标签} -一个组合的数据存储。例如,使用结合洛桑国际管理发展学院建筑物).

函数要返回的锚框数,以整数形式指定。

输出参数

全部折叠

锚框,返回为N-by-2矩阵N是锚框的数量,每个条目的格式为[高度宽度].使用numAnchors指定锚框的数量。

距离度量,作为标量值返回。距离度量提供了每个集群中锚框的平均交叉-联合(IoU)值。为确保锚框与训练数据中的框重叠良好,使用meanIoU值必须大于0.5。的k-means聚类算法使用IoU距离度量,用公式计算重叠1-bboxOverlapRatiobox1, box2).

版本历史

R2019b引入