🐳单发多框检测 SDD
2021-11-30
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

模型

 
notion image
模型主要由基础网络组成,其后是几个多尺度特征块。
基本网络用于从输入图像中提取特征,因此它可以使用深度卷积神经网络(单发多框检测论文中选用了在分类层之前截断的VGG,现在也常用ResNet替代)。 我们可以设计基础网络,使它输出的高和宽较大。 这样一来,基于该特征图生成的锚框数量较多,可以用来检测尺寸较小的目标。 接下来的每个多尺度特征块将上一层提供的特征图的高和宽缩小(如减半),并使特征图中每个单元在输入图像上的感受野变得更广阔。
由于接近顶部的多尺度特征图较小,但具有较大的感受野,它们适合检测较少但较大的物体。 简而言之,通过多尺度特征块,单发多框检测生成不同大小的锚框,并通过预测边界框的类别和偏移量来检测大小不同的目标,因此这是一个多尺度目标检测模型。

类别预测层

设目标类别的数量为。这样一来,锚框有个类别,其中0类是背景。 在某个尺度下,设特征图的高和宽分别为。如果以其中每个单元为中心生成 个锚框,那么需要对个锚框进行分类。 如果使用全连接层作为输出,很容易导致模型参数过多。单发多框检测采用了使用卷积层的通道来输出类别预测的方法来降低模型复杂度。
具体来说,类别预测层使用一个保持输入高和宽的卷积层。 这样一来,输出和输入在特征图宽和高上的空间坐标一一对应。 考虑输出和输入同一空间坐标:输出特征图上坐标的通道里包含了以输入特征图坐标为中心生成的所有锚框的类别预测。 因此输出通道数为,其中索引为的通道代表了索引为的锚框有关类别索引为的预测
定义了一个类别预测层,通过参数num_anchorsnum_classes分别指定了a和q。 该图层使用填充为1的3×3的卷积层。此卷积层的输入和输出的宽度和高度保持不变。
 

边界框预测层

边界框预测层的设计与类别预测层类似。 唯一不同的是,这里需要为每个锚框预测4个偏移量,而不是个类别。

连结多尺度的预测

单发多框检测使用多尺度特征图来生成锚框并预测其类别和偏移量。 在不同的尺度下,特征图的形状或以同一单元为中心的锚框的数量可能会有所不同。 因此,不同尺度下预测输出的形状可能会有所不同
以下示例中,我们为同一个小批量构建两个不同比例(Y1Y2)的特征图,其中Y2的高度和宽度是Y1的一半。 以类别预测为例,假设Y1Y2的每个单元分别生成了5个和3个锚框。 进一步假设目标类别的数量为10,对于特征图Y1Y2,类别预测输出中的通道数分别为5×(10+1)=55和3×(10+1)=33,其中任一输出的形状是(批量大小,通道数,高度,宽度)
为了将这两个预测输出链接起来以提高计算效率,我们将把这些张量转换为更一致的格式
通道维包含中心相同的锚框的预测结果。我们首先将通道维移到最后一维。 因为不同尺度下批量大小仍保持不变,我们可以将预测结果转成二维的(批量大小,高×宽×通道数)的格式,以方便之后在维度1上的连结。
这样一来,尽管Y1Y2在通道数、高度和宽度方面具有不同的大小,我们仍然可以在同一个小批量的两个不同尺度上连接这两个预测输出。

高和宽减半块

为了在多个尺度下检测目标,我们在下面定义了高和宽减半块down_sample_blk,该模块将输入特征图的高度和宽度减半。 事实上,该块应用了在 subsec_vgg-blocks中的VGG模块设计。 更具体地说,每个高和宽减半块由两个填充为1的3×3的卷积层、以及步幅为2的2×2最大汇聚层组成。 填充为1的3×3卷积层不改变特征图的形状。但是,其后的2×2的最大汇聚层将输入特征图的高度和宽度减少了一半。 对于此高和宽减半块的输入和输出特征图,因为1×2+(3−1)+(3−1)=6,所以输出中的每个单元在输入上都有一个6×6的感受野。因此,高和宽减半块会扩大每个单元在其输出特征图中的感受野。

基本网络块

基本网络块用于从输入图像中抽取特征。 为了计算简洁,这里构造了一个小的基础网络,该网络串联3个高和宽减半块,并逐步将通道数翻倍。 给定输入图像的形状为256×256,此基本网络块输出的特征图形状为32×32(

完整的模型

完整的单发多框检测模型由五个模块组成。每个块生成的特征图既用于生成锚框,又用于预测这些锚框的类别和偏移量。在这五个模块中,第一个是基本网络块,第二个到第四个是高和宽减半块,最后一个模块使用全局最大池将高度和宽度都降到1。从技术上讲,第二到第五个区块都是多尺度特征块
 
现在每个块定义前向传播。与图像分类任务不同,此处的输出包括:CNN特征图Y;在当前尺度下根据Y生成的锚框;预测的这些锚框的类别和偏移量(基于Y
一个较接近顶部的多尺度特征块是用于检测较大目标的,因此需要生成更大的锚框。 在上面的前向传播中,在每个多尺度特征块上,通过调用的multibox_prior函数的sizes参数传递两个比例值的列表。 在下面,0.2和1.05之间的区间被均匀分成五个部分,以确定五个模块的在不同尺度下的较小值:0.2、0.37、0.54、0.71和0.88。 之后,他们较大的值由 等给出
 
 

完整的模型TinySSD

对一个256×256像素的小批量图像X执行前向传播
第一个模块输出特征图的形状为32×32。 回想一下,第二到第四个模块为高和宽减半块,第五个模块为全局汇聚层。 由于以特征图的每个单元为中心有4个锚框生成,因此在所有五个尺度下,每个图像总共生成(322+162+82+42+1)×4=5444个锚框
 

训练模型

读取数据集和初始化

定义损失函数和评价函数

目标检测有两种类型的损失。 第一种有关锚框类别的损失:可以简单地复用之前图像分类问题里一直使用的交叉熵损失函数来计算; 第二种有关正类锚框偏移量的损失:预测偏移量是一个回归问题。 但是,对于这个回归问题,这里不用平方损失,而是使用L1范数损失,即预测值和真实值之差的绝对值。 掩码变量bbox_masks令负类锚框和填充锚框不参与损失的计算。 最后,将锚框类别和偏移量的损失相加,以获得模型的最终损失函数。
沿用准确率评价分类结果。 由于偏移量使用了L1范数损失,使用平均绝对误差来评价边界框的预测结果。这些预测结果是从生成的锚框及其预测偏移量中获得的

训练模型

在训练模型时,我们需要在模型的前向传播过程中生成多尺度锚框(anchors),并预测其类别(cls_preds)和偏移量(bbox_preds)。 然后根据标签信息Y为生成的锚框标记类别(cls_labels)和偏移量(bbox_labels)。 最后根据类别和偏移量的预测和标注值计算损失函数。为了代码简洁,这里没有评价测试数据集。
notion image

预测目标

读取并调整测试图像的大小,然后将其转成卷积层需要的四维格式
使用下面的multibox_detection函数,可以根据锚框及其预测偏移量得到预测边界框。然后,通过非极大值抑制来移除相似的预测边界框。
最后,筛选所有置信度不低于0.9的边界框,做为最终输出
notion image
 
 
 
 
  • PyTorch
  • 目标检测数据集区域卷积神经网络
    目录