目标检测

207 阅读6分钟

d2l笔记,原书地址:d2l.ai

14.3 目标检测与边界框

边界框的两种主要表示方法:

  • (左上角x,左上角y,右下角x,右下角y)
  • (中心点x,中心点y,宽,高)

图片的左上角为坐标原点,向右和向下都为正值

14.4 锚框 Anchor Box

锚框是指在中心点设置在每个像素点的、不同大小和宽高比的备选边界框。

给定一系列缩放比例和一系列宽高比,对每个像素点都生成锚框的话,计算量会过大。

通常的做法是,取缩放比例中的第一个值,搭配所有的宽高比,再取宽高比中的第一个值,搭配所有的缩放比例,如此生成锚框。

可以用IoU来评价锚框与真实框的匹配程度,即交集/并集

训练时,需要为每个锚框指定两个标签,即类别与偏移:

  1. 所有的锚框和真实框之间的IoU构成一个矩阵
  2. 找出矩阵中IoU的最大值,将真实框的类别指定给对应的锚框,然后将此最大值所在行和列的值清零
  3. 重复上一步,直至所有的值被清零;因为锚框的数量大于真实框的数量,所以还有一些锚框没有被指定类别
  4. 根据预先设定的一个IoU阈值,对于每个还没有被指定类别的锚框,如果其IoU最大的真实框的IoU大于阈值,则将该锚框的类别指定为该真实框的类别,否则将锚框的类别指定为背景
  5. 指定锚框的类别时,会同时计算出该锚框与对应的真实框的偏移量

预测时,首先得出预测的锚框,给出预测的类别和偏移量,然后据此计算出预测的边界框。由于对于同一个目标会给出许多个预测框,我们需要通过NMS算法来合并它们。步骤如下:

  1. 将所有预测框按照置信度逆序排列
  2. 对于置信度最大的预测框,将所有与它的IoU在某个阈值以上的预测框都从列表中去掉,也就是说与置信度最大的预测框过于相似的预测框都会被去掉
  3. 继续处理置信度第二大的预测框,直至所有的预测框都被处理
  4. 最终保留下来的预测框,两两之间的IoU都小于阈值
  5. 实践中,可以在NMS之前和之后将置信度较低的预测框排除掉

14.5 多尺寸目标检测

如果对每个像素点都生成一系列锚框,那么计算量会过大。我们可以将图片分割成m * n块区域,只在每个区域的中心点设置锚框。不同的m和n就会得到不同大小的区域,配合适当的尺寸和宽高比,就得到了多尺度的锚框。

image.png image.png

用于分割区域的图片可以是CNN的中间特征图。在CNN中靠后的中间特征图具有更大的感受野,适合检测更大的目标。

14.6 目标检测数据集

由于主流的数据集都很大,作者构造一个小型的香蕉数据集

14.7 Single Shot Multibox Detection(SSD 模型)

image.png

SSD模型

  1. 首先是一个去头的CNN,用于生成特征图
  2. 然后是多个多尺寸特征图,分割区域数依次减半,区域面积依次翻倍,用于检测不同大小的目标。在特征图的每个像素点生成锚框。
  3. 每个多尺寸特征图都分别连接类别层和边界框层,类别层输出类别数+1个值(包含背景),边界框层输出4个值,即边界框坐标

损失函数

涉及到类别和边界框两方面。类别可以直接使用交叉熵。边界框是一个回归问题,但一般不使用二阶的MSE,而使用一阶的MAE

训练过程

  1. 根据多尺寸特征图生成锚框,通过前向传播计算出每个锚框的类别和偏移
  2. 根据训练集的真实边界框,给出每个锚框的真实类别和偏移,计算损失函数,然后就是一般的反向传播了

预测过程

  1. 同训练的第一步,计算出每个锚框的类别和偏移
  2. 将锚框还原为预测的边界框,通过NMS去掉类似的预测框,过滤掉置信度低的预测框,最后将保留下来的预测框绘制到图片上

14.8. Region-based CNNs (R-CNNs)

R-CNN:起点

  1. 选择~2000个候选边界框,指定其类别和偏移
  2. 将候选边界框中的图像输入预训练的无头CNN,得到特征
  3. 使用SVM计算每个候选框的类别
  4. 使用线性回归计算每个候选框的偏移

由于需要计算大量候选框的CNN,R-CNN计算量过大,并不实用

Fast R-CNN:CNN前置

在R-CNN中,候选框之间是有很多重叠区域的,导致了很多CNN是重复计算的。在Fast R-CNN中,只对整张图片做一次CNN计算。然后按照候选框的位置对CNN的输出做一次RoI pooling,使输出size统一。然后进入FC。最后分别做类别和偏移的计算。类别使用softmax。

Faster R-CNN:端到端

在Fast R-CNN中,需要生成大量的候选框,计算量仍很大。Faster R-CNN改用候选框网络:

  1. 对CNN的输出,使用另一个CNN处理
  2. 在每个像素点生成锚框,包括其类别和偏移,使用二分类区分该锚框是目标还是背景
  3. 丢弃背景锚框,对目标锚框做NMS,得出最终的候选框

候选框网络和最后的类别/偏移网络是一起训练的。

Mask R-CNN:像素级

使用像素级标注的数据,使用了RoI对齐层替代了RoI pooling层,是一个语义分割模型,并使用全卷积网络提高目标检测的准确率。

YOLOv1

image.png

将图片划分成n * n个网格,每个网格负责预测中心点落在该网格的目标的类别

每个网格产生b个预测框,每个预测框有对应的坐标和置信度,置信度 = 预测框含有任意目标的概率 * IoU。

每个预测框对应5个输出,即4个坐标值,和1个置信度。每个网格又有c个类别one hot值。所以模型的输出size为 n * n * (b * 5 + c)

得到模型输出后,将以上数据相乘,得到每个预测框是某个目标的概率,按一定阈值筛选,经过NMS,就得到最终的结果。

损失函数使用平方损失函数

缺点:

  • 每个网格只能检测出一个目标,不利于检测小目标
  • 大小物体的IoU误差贡献相同,定位准确度差

论文:arxiv.org/abs/1506.02…

代码:github.com/pjreddie/da…

YOLOv2

  • 联合训练,用ImageNet训练分类能力,用COCO训练定位能力
  • 加入BN层