1. 磐创AI首页
  2. Medium

基于每个…多个锚定盒的单次拍摄目标检测器的货架图像产品检测

摘要

引言

上述问题陈述是计算机视觉的任务之一,称为目标检测。有各种算法来执行目标检测任务,如R_CNN、快速R-CNN、更快的R-CNN、YOLO、SSD。固态硬盘具有速度快、精度高的特点。这就是我们使用固态硬盘的原因。

VGG16之后,使用了6个Conv图层:Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2和Conv11_2

随着CNN空间维数的逐渐降低,特征地图的分辨率也随之降低。SSD使用较低分辨率的图层来检测较大比例的对象。SSD在VGG16之后增加了6个辅助卷积层。其中五个将被添加用于目标检测。在这三层中,我们进行了6次预测,而不是4次。SSD总共使用6层进行了8732次预测。

图1:SSD:单发多盒探测器SSD: Single Shot MultiBox Detector

动机

使用SSD背后的动机是其高速和实时的准确性。它避免了区域建议网络的更快的R CNN来识别区域,这需要两次拍摄,一次是识别区域,第二次是识别提议区域中的对象。相反,它在单次拍摄中预测对象的类别和位置,性能优于所有其他算法。SSD300在59FPS时达到74.3%的MAP,而SSD500在22FPS时达到76.9%的MAP,这比更快的R-CNN(7FPS时73.2%的MAP)和YOLOv1(45FPS时63.4%的MAP)性能更好。

方法论

单发多盒检测是一种简单、快速、应用广泛的检测模型。虽然这只是众多对象检测模型中的一个,但本节中的一些设计原则和实现细节也适用于其他模型。

型号

单次多盒检测主要由一个基本网络和几个多尺度特征图块组成。基神经网络用于从输入图像中提取特征,因此可以使用深度CNN。例如,原来的单发多盒检测纸采用分类层前截断的VGG网络,也可以使用RESET。通过我们的设计,我们可以使基础网络输出更大的特征地图,从而生成更多的锚盒来检测较小的目标。随后,每个多尺度特征地图挡路从前一个挡路减小(例如,减半)特征地图的高度和宽度,并且使得特征地图的每个单元能够增加其在输入图像上的接受野。

多尺度目标检测的设计是层次化的。由于靠近顶部的多尺度特征地图较小,但具有较大的接收范围,因此适合于检测较少但较大的对象。

简而言之,单镜头多盒检测通过其基础网络和多个多尺度特征地图块,生成不同大小的锚盒,并通过预测这些锚盒(即边界盒)的类别和偏移量来检测不同大小的对象,因此,这是一种多尺度目标检测模型。

下面,我们将介绍不同SSD块的实现细节。首先,我们讨论如何实现类和边界框预测。

类预测层

设对象类的个数为q,则锚盒有q+1个类,其中类0为背景。在一定比例下,假设要素地图的高度和宽度分别为h和w。当以这些特征地图的每个空间位置为中心生成锚盒时,总共需要对HWA锚盒进行分类。这通常会使具有完全连接层的分类变得不可行,因为参数化成本可能很高。但是,类似于卷积层的信道预测类别,单次激发多盒检测使用相同的技术来降低模型复杂度。

具体地说,类预测层在不改变特征地图的宽度或高度的情况下使用卷积层。这样,在要素地图的相同空间维度(宽度和高度)的输出和输入之间可以一一对应。更具体地说,在任何空间位置(x,y)处的输出特征地图的通道表示以输入特征地图的(x,y)为中心的所有锚框的类别预测。为了产生有效的预测,必须有(q+1)个输出通道,其中对于相同的空间位置,具有索引i(q+1)+j的输出通道表示类别j(0≤j≤q)对锚盒i(0≤i

边界框预测图层

包围盒预测层的设计类似于类预测层的设计。唯一的区别在于每个锚点框的输出数量:这里我们需要预测四个偏移量,而不是Q+1个类。

多尺度的串联预测

正如我们所提到的,单镜头多框检测使用多尺度特征映射来生成锚框并预测它们的类别和偏移量。在不同的比例尺上,特征地图的形状或以同一单元为中心的锚框的数量可能会有所不同。因此,不同尺度的预测输出的形状可能不同。

在下面的示例中,我们为同一小批量构建了两个不同比例(Y1和Y2)的特征地图,其中Y2的高度和宽度是Y1的一半。让我们以班级预测为例。假设分别为Y1和Y2中的每个单元生成5个和3个锚盒。进一步假设对象类别的数量为10,对于特征映射Y1和Y2,类别预测输出中的通道数量分别为5×(10+1)=55和3×(10+1)=33,其中任一输出形状为(批次大小、通道数量、高度、宽度)。

我们可以看到,除了批次大小维度外,其他三个维度都有不同的大小。为了连接这两个预测输出以实现更有效的计算,我们将把这些张量转换为更一致的格式。

请注意,通道维度保存具有相同中心的锚框的预测。我们首先将该维度移动到最里面。由于批次大小对于不同的尺度保持不变,我们可以将预测输出转换为具有形状(批次大小、高度××宽度××通道数)的二维张量。然后,我们可以沿着维度1在不同的尺度上串联这些输出。

这样,即使Y1和Y2在通道、高度和宽度上具有不同的大小,对于同一小批量,我们仍然可以在两个不同的尺度上连接这两个预测输出。

下采样挡路

为了在多个尺度上检测对象,我们定义了下面的下采样挡路down_sample_blk,它将输入要素地图的高度和宽度减半。事实上,这款挡路采用的是VGG积木的设计。更具体地说,每个下采样挡路由两个填充为1的3×3卷积层和一个步长为2的2×2最大合并层组成。众所周知,填充为1的3×3卷积层不会改变特征地图的形状。然而,随后的2×2最大合并将输入要素地图的高度和宽度减少了一半。对于此降采样挡路的输入和输出特征图,由于1×2+(3−1)+(3−1)=6,因此输出中的每个单元在输入上都有一个6×6的接受场。因此,下采样挡路在其输出特征地图中扩大了每个单元的接受范围。

在下面的示例中,我们构造的下采样挡路改变了输入通道的数量,并将输入特征地图的高度和宽度减半。

基地网挡路

基本网络挡路用于从输入图像中提取特征。为简单起见,我们构建了一个由三个下采样块组成的小型基本网络,每个挡路的信道数量翻了一番。给定256×256输入图像,这个基本网络挡路输出32×32特征地图(256/23=32)。

完整的模型

完整的单发多盒检测模型由五个模块组成。每个挡路生成的特征地图既用于(I)生成锚盒,也用于(Ii)预测这些锚盒的类别和偏移量。在这五个块中,第一个是基础网络挡路,第二到第四个是下采样块,最后一个挡路使用全局最大值合并将高度和宽度都减小到1,从技术上讲,第二到第五个块都是那些多尺度要素地图块

现在我们定义每个挡路的前向传播。与图像分类任务不同,这里的输出包括(I)CNN特征地图Y,(Ii)在当前比例下使用Y生成的锚框,以及(Iii)这些锚框的类别和预测偏移量(基于Y)。

回想一下,靠近顶部的多比例要素地图挡路用于检测较大的对象;因此,它需要生成较大的锚框。在上面的正向传播中,在每个多尺度特征地图挡路,我们通过调用的MULTIONBOX_PREVICE函数的SIZES参数传递一个包含两个比例值的列表。在下文中,0.2和1.05之间的间隔平均分为五个部分,以确定五个块上较小的比例尺值:0.2、0.37、0.54、0.71和0.88。然后给出它们的较大比例尺数值为0.2×0.37=0.272,0.37×0.54=0.447,依此类推。

现在我们可以定义完整的模型TinySSD,如下所示。

我们创建一个模型实例,并使用它在一小批256×256图像X上执行前向传播。

如本节前面所示,第一个挡路输出32×32个要素地图。回想一下,第二到第四个下采样块将高度和宽度减半,第五个挡路使用全局池。由于沿特征地图的空间维度为每个单元生成4个锚盒,因此在所有5个尺度下,对于每幅图像总共生成(322+162+82+42+1)×4=5444个锚盒。

培训

现在我们将看到如何训练单镜头多盒检测模型来进行目标检测。

读取数据集并初始化模型

首先,让我们读取货架图像检测数据集

正在从下载../data/Detection.zip。

阅读1000个培训示例

阅读100个验证示例

架子图像检测数据集中只有一个类。定义模型后,需要对模型参数进行初始化,并定义优化算法。

定义损失函数和评估函数

目标检测有两种类型的损失。第一个损失涉及锚盒的类别:它的计算可以简单地重用我们用于图像分类的交叉熵损失函数。第二个损失涉及正(非背景)锚盒的偏移:这是一个回归问题。然而,对于这个回归问题,这里我们不使用平方损失。取而代之的是,我们使用L1范数损失,即预测和基本事实之间的差值的绝对值。掩码变量BBOX_MASKS在损失计算中过滤掉负锚框和非法(填充)锚框。最后,将锚箱类损失和锚箱偏移损失相加,得到模型的损失函数。

我们可以用准确率来评价分类结果。由于偏移量使用的L1范数损失,我们使用平均绝对误差来评估预测的边界框。这些预测结果是从生成的锚盒和它们的预测偏移量中获得的。

培训模型

在训练模型时,我们需要生成多尺度锚盒(锚),并预测它们在前向传播中的类(CLS_Preds)和偏移量(BBOX_Preds)。然后基于标签信息Y对生成的锚盒的类(CLS_Labels)和偏移量(BBOX_Labels)进行标注。最后,利用类和偏移量的预测值和标签值计算损失函数。为了实现简明,这里省略了测试数据集的评估。

预测

在预测过程中,目标是检测图像上所有感兴趣的对象。下面我们读取测试图像并调整其大小,将其转换为卷积层所需的四维张量。

最后,我们将置信度为0.9或以上的所有预测边界框显示为输出。

结果和讨论

我们有284幅图像作为训练数据集,71幅图像作为测试数据集。在借条为0.75时,我们在列车和测试数据集上分别获得了0.905和0.823的地图。

##数据集准备

  • 使用标签img为下载的ShelfImages数据集中的所有图像创建批注。
  • 将生成的XML批注转换为CSV,并将其保存在数据文件夹中,名称为Annotations.txt。
  • 使用的增强-图像的水平翻转,生成不同对比度和亮度的图像。

##使用的检测网络

  • 预训练模型-带批量归一化的VGG16
  • 使用准备好的数据集微调到60个历元。

#培训参数说明

  • 纪元-60
  • 批量大小-4
  • 初始学习率–0.001
  • 输入图像大小-300 X 300 X 3

创建了一个Google CoLab实例以在GPU上训练它

注:每个功能框使用多个锚定框。以下是可供参考的结果。

{

“C1_P11_N2_S4_3.jpg”:41,

“C4_P07_N1_S3_1.jpg”:40,

“C1_P03_N3_S2_1.jpg”:30,

“C3_P01_N1_S5_1.jpg”:32,

“C3_P05_N3_S2_1.jpg”:13,

“C1_P08_N2_S4_1.jpg”:56,

“C3_P01_N2_S3_2.JPG”:24,

“C1_P03_N2_S2_1.jpg”:25,

“C1_P02_N2_S3_1.jpg”:28,

“C3_P03_N3_S3_1.jpg”:39,

“C3_P04_N1_S5_1.jpg”:41,

“C4_P07_N1_S3_2.JPG”:40,

“C1_P12_N1_S2_1.jpg”:14,

“C4_P08_N1_S4_1.jpg”:44,

“C1_P03_N2_S3_1.jpg”:43,

“C4_P05_N2_S2_1.jpg”:6,

“C3_P06_N2_S3_2.JPG”:37,

“C4_P08_N3_S3_1.jpg”:33,

“C3_P03_N2_S4_1.jpg”:50,

“C1_P03_N1_S2_1.jpg”:28,

“C4_P08_N1_S5_2.JPG”:36,

“C1_P06_N1_S3_1.jpg”:36,

“C4_P04_N1_S3_1.jpg”:26,

“C3_P06_N4_S3_1.jpg”:32,

“C1_P11_N1_S4_2.JPG”:39,

“C1_P11_N2_S3_2.JPG”:30,

“C2_P07_N2_S2_1.jpg”:23,

“C4_P07_N3_S3_1.jpg”:42,

“C1_P08_N3_S3_1.jpg”:42,

“C1_P06_N1_S4_1.jpg”:49,

“C3_P02_N1_S2_2.JPG”:23,

“C1_P12_N2_S3_1.jpg”:20,

“C1_P03_N1_S4_1.jpg”:17,

“C1_P04_N3_S3_1.jpg”:44,

“C2_P01_N3_S3_1.jpg”:45,

“C4_P03_N1_S4_1.jpg”:46,

“C1_P02_N2_S2_1.jpg”:19,

“C1_P04_N1_S4_1.jpg”:59,

“C3_P04_N1_S4_1.jpg”:35,

“C4_P04_N4_S2_1.jpg”:15,

“C1_P10_N1_S3_1.jpg”:29,

“C2_P04_N3_S2_1.jpg”:16,

“C1_P10_N2_S3_1.jpg”:32,

“C1_P06_N3_S3_1.jpg”:38,

“C1_P02_N1_S5_1.jpg”:46,

“C4_P04_N2_S2_1.jpg”:13,

“C2_P08_N3_S3_2.JPG”:24,

“C1_P12_N1_S3_1.jpg”:21,

“C2_P07_N1_S6_1.jpg”:26,

“C2_P05_N3_S3_1.jpg”:35,

“C2_P02_N1_S4_1.jpg”:47,

“C1_P05_N4_S3_1.jpg”:35,

“C4_P01_N2_S2_1.jpg”:21,

“C2_P02_N1_S3_1.jpg”:36,

“C4_P02_N4_S2_1.jpg”:23,

“C1_P11_N1_S3_1.jpg”:27,

“C2_P03_N2_S3_1.jpg”:18,

“C1_P06_N1_S5_1.jpg”:36,

“C1_P11_N2_S4_2.JPG”:41,

“C3_P06_N1_S3_2.JPG”:42,

“C4_P03_N1_S3_1.jpg”:34,

“C4_P08_N1_S3_1.jpg”:36,

“C3_P03_N1_S3_1.jpg”:37,

“C1_P10_N1_S5_1.jpg”:30,

“C1_P03_N1_S4_2.JPG”:8,

“C1_P05_N2_S4_2.JPG”:48,

“C4_P08_N2_S2_1.jpg”:19,

“C1_P03_N1_S3_1.jpg”:44,

“C1_P12_N1_S5_1.jpg”:33,

“C2_P01_N1_S4_1.jpg”:34,

“C2_P01_N2_S2_1.jpg”:29

}

结论与未来展望

单镜头多盒检测是一种多尺度目标检测模型,因为它使用多个不同大小的锚盒。该算法具有一个基本网络和多个多尺度特征地图块,生成不同大小的锚盒,并通过预测这些锚盒(即包围盒)的类别和偏移量来检测不同大小的对象,在训练单次多盒检测模型时,根据锚盒类别和偏移量的预测和标签值计算损失函数。我想将来在这个问题上,我们也可以用单个锚盒代替多个锚盒来构建SSD,因为这里所有的对象都是相同大小的,单个锚盒会给出更有效的解决方案。

参考文献

https://www.kaggle.com/loaiabdalslam/vgg16-layers-visualization-tutorialhttps://www.kaggle.com/loaiabdalslam/vgg16-layers-visualization-tutorial

https://jonathan-hui.medium.com/object-detection-speed-and-accuracy-comparison-faster-r-cnn-r-fcn-ssd-and-yolo-5425656ae359https://jonathan-hui.medium.com/object-detection-speed-and-accuracy-comparison-faster-r-cnn-r-fcn-ssd-and-yolo-5425656ae359

https://jonathan-hui.medium.com/ssd-object-detection-single-shot-multibox-detector-for-real-time-processing-9bd8deac0e06https://jonathan-hui.medium.com/ssd-object-detection-single-shot-multibox-detector-for-real-time-processing-9bd8deac0e06

https://medium.com/@sdoshi579/convolutional-neural-network-learn-and-apply-3dac9acfe2b6https://medium.com/@sdoshi579/convolutional-neural-network-learn-and-apply-3dac9acfe2b6

https://www.bing.com/search?q=ssd+google+scholar&cvid=a1c6fdb09dc44fcd9dbc1534203cfa17&aqs=edge..69i57j69i60.4814j0j1&FORM=ANAB01&PC=U531https://www.bing.com/search?q=ssd+google+scholar&cvid=a1c6fdb09dc44fcd9dbc1534203cfa17&aqs=edge..69i57j69i60.4814j0j1&FORM=ANAB01&PC=U531

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/09/18/%e5%9f%ba%e4%ba%8e%e6%af%8f%e4%b8%aa%e5%a4%9a%e4%b8%aa%e9%94%9a%e5%ae%9a%e7%9b%92%e7%9a%84%e5%8d%95%e6%ac%a1%e6%8b%8d%e6%91%84%e7%9b%ae%e6%a0%87%e6%a3%80%e6%b5%8b%e5%99%a8%e7%9a%84%e8%b4%a7-2/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息