d2l笔记,原书地址:d2l.ai
14.3 目标检测与边界框
边界框的两种主要表示方法:
- (左上角x,左上角y,右下角x,右下角y)
- (中心点x,中心点y,宽,高)
图片的左上角为坐标原点,向右和向下都为正值
14.4 锚框 Anchor Box
锚框是指在中心点设置在每个像素点的、不同大小和宽高比的备选边界框。
给定一系列缩放比例和一系列宽高比,对每个像素点都生成锚框的话,计算量会过大。
通常的做法是,取缩放比例中的第一个值,搭配所有的宽高比,再取宽高比中的第一个值,搭配所有的缩放比例,如此生成锚框。
可以用IoU来评价锚框与真实框的匹配程度,即交集/并集
训练时,需要为每个锚框指定两个标签,即类别与偏移:
- 所有的锚框和真实框之间的IoU构成一个矩阵
- 找出矩阵中IoU的最大值,将真实框的类别指定给对应的锚框,然后将此最大值所在行和列的值清零
- 重复上一步,直至所有的值被清零;因为锚框的数量大于真实框的数量,所以还有一些锚框没有被指定类别
- 根据预先设定的一个IoU阈值,对于每个还没有被指定类别的锚框,如果其IoU最大的真实框的IoU大于阈值,则将该锚框的类别指定为该真实框的类别,否则将锚框的类别指定为背景
- 指定锚框的类别时,会同时计算出该锚框与对应的真实框的偏移量
预测时,首先得出预测的锚框,给出预测的类别和偏移量,然后据此计算出预测的边界框。由于对于同一个目标会给出许多个预测框,我们需要通过NMS算法来合并它们。步骤如下:
- 将所有预测框按照置信度逆序排列
- 对于置信度最大的预测框,将所有与它的IoU在某个阈值以上的预测框都从列表中去掉,也就是说与置信度最大的预测框过于相似的预测框都会被去掉
- 继续处理置信度第二大的预测框,直至所有的预测框都被处理
- 最终保留下来的预测框,两两之间的IoU都小于阈值
- 实践中,可以在NMS之前和之后将置信度较低的预测框排除掉
14.5 多尺寸目标检测
如果对每个像素点都生成一系列锚框,那么计算量会过大。我们可以将图片分割成m * n块区域,只在每个区域的中心点设置锚框。不同的m和n就会得到不同大小的区域,配合适当的尺寸和宽高比,就得到了多尺度的锚框。
用于分割区域的图片可以是CNN的中间特征图。在CNN中靠后的中间特征图具有更大的感受野,适合检测更大的目标。
14.6 目标检测数据集
由于主流的数据集都很大,作者构造一个小型的香蕉数据集
14.7 Single Shot Multibox Detection(SSD 模型)
SSD模型
- 首先是一个去头的CNN,用于生成特征图
- 然后是多个多尺寸特征图,分割区域数依次减半,区域面积依次翻倍,用于检测不同大小的目标。在特征图的每个像素点生成锚框。
- 每个多尺寸特征图都分别连接类别层和边界框层,类别层输出类别数+1个值(包含背景),边界框层输出4个值,即边界框坐标
损失函数
涉及到类别和边界框两方面。类别可以直接使用交叉熵。边界框是一个回归问题,但一般不使用二阶的MSE,而使用一阶的MAE
训练过程
- 根据多尺寸特征图生成锚框,通过前向传播计算出每个锚框的类别和偏移
- 根据训练集的真实边界框,给出每个锚框的真实类别和偏移,计算损失函数,然后就是一般的反向传播了
预测过程
- 同训练的第一步,计算出每个锚框的类别和偏移
- 将锚框还原为预测的边界框,通过NMS去掉类似的预测框,过滤掉置信度低的预测框,最后将保留下来的预测框绘制到图片上
14.8. Region-based CNNs (R-CNNs)
R-CNN:起点
- 选择~2000个候选边界框,指定其类别和偏移
- 将候选边界框中的图像输入预训练的无头CNN,得到特征
- 使用SVM计算每个候选框的类别
- 使用线性回归计算每个候选框的偏移
由于需要计算大量候选框的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改用候选框网络:
- 对CNN的输出,使用另一个CNN处理
- 在每个像素点生成锚框,包括其类别和偏移,使用二分类区分该锚框是目标还是背景
- 丢弃背景锚框,对目标锚框做NMS,得出最终的候选框
候选框网络和最后的类别/偏移网络是一起训练的。
Mask R-CNN:像素级
使用像素级标注的数据,使用了RoI对齐层替代了RoI pooling层,是一个语义分割模型,并使用全卷积网络提高目标检测的准确率。
YOLOv1
将图片划分成n * n个网格,每个网格负责预测中心点落在该网格的目标的类别
每个网格产生b个预测框,每个预测框有对应的坐标和置信度,置信度 = 预测框含有任意目标的概率 * IoU。
每个预测框对应5个输出,即4个坐标值,和1个置信度。每个网格又有c个类别one hot值。所以模型的输出size为 n * n * (b * 5 + c)
得到模型输出后,将以上数据相乘,得到每个预测框是某个目标的概率,按一定阈值筛选,经过NMS,就得到最终的结果。
损失函数使用平方损失函数
缺点:
- 每个网格只能检测出一个目标,不利于检测小目标
- 大小物体的IoU误差贡献相同,定位准确度差
YOLOv2
- 联合训练,用ImageNet训练分类能力,用COCO训练定位能力
- 加入BN层