目标检测(Object Detection)—— SSD总结

写在最前,关于卷积神经网络的一些感悟:
使用卷积神经网络提取到合适的特征后(合理就可以,不同的方法可以提取不同的特征。譬如:faster RCNN提取到的特征是proposal在feature maps上的映射再ROI pooling后的特征;而YOLO提取到的特征就是输入图像的feature maps,显然这两种特征都包含了目标的位置及坐标信息,是合理的),这些特征与我们期待的输出(分类、目标的bounding box等等)是存在非线性关系的。我们并不关注这种关系是如何求得的,我们需要做的就是设置合适的损失函数,以此引导卷积神经网络的权重参数逐渐向这种非线性关系靠近。

点击这里了解Faster RCNN
点击这里了解YOLO

1 概述

  • 之前介绍了YOLO网络,该网络检测速度快的同时检测准确率也不低,可以说是目标检测领域的一个飞跃。那么检测速度能不能更快、同时检测准确率更高?SSD诞生了(59 FPS on Titan X GPU, 74.3 mAP)。
  • SSD也是个端到端的网络,既借鉴了Faster RCNN中anchor boxes的概念、又借鉴了YOLO将检测转化为回归的思想,在它们的基础上,提出“从多层layer的feature maps上分别得到bounding box以实现多尺度检测”的思想。SSD如何利用多个feature maps完成多尺度目标检测?请往下看

2 SSD原理详解

2.1 必要知识回忆

  • Faster RCNN提出了anchor及anchor box的概念。对某个layer得到的feature maps中的某个位置,可在原输入图像中映射出一片区域,将该区域的中心点作为待生成的bounding box的中心点,依据事先确定的bounding box的大小及比例生成9个bounding box,这9个bounding box就被称为feature maps上该位置对应于原图的anchor boxes。然后我们再使用18+36个卷积核对feature maps上的该位置进行卷积操作,最终得到这9个anchor boxes是否包含目标的得分及相对于ground truth的偏移。
  • YOLO将目标检测视为回归问题。将图像划分成SxS的网格,图像经过网络后得到SxSx30的tensor,原图像每个网格对应于一个1x1x30的tensor。1x1x30的tensor可分成三部分:前5个数是第一个bbox的相关参数,再5个数是第二个bbox的相关参数,后20个数是该网格中包含各类目标的条件概率。归根结底,YOLO是对这个SxSx30的tensor进行回归。

2.2 SSD网络

2.2.1 SSD网络整体结构图

在这里插入图片描述
从以下几个方面理解SSD网络:

  • SSD网络基于VGG-16,在其基础上,将全连接层更换为卷积层,并增加新的卷积层(处于尽量简化博文的目的,此处不展开,有兴趣请参考原文)

为什么要将全连接层更换为卷积层?这是因为,图像分类任务需要提取图像的全局特征,全连接层恰好是用来从全局中提取特征的,因此在图像分类网络中采用全连接层是非常自然的;对于图像目标检测、图像语义分隔等更细粒度的任务,提取图像的全局特征与这些任务本身不契合,相反,由于卷积层具有局部感知的特点,相对全连接层,更适用于细粒度任务。

  • SSD网络并不是只采用最后的feature maps作为特征,它选取了6个feature maps,每个feature maps都会在原图上生成bbox(图中标红的feature maps)

2.2.2 如何生成bbox

SSD网络对6个feature maps进行处理。对每个feature maps,其上的每一个位置(anchor),都在原图上生成k个不同长宽比的bbox(anchor boxes)。生成过程如下(看着复杂,实际非常容易理解):

  • 首先,计算出每个feature maps的尺度因子,其中smin=0.2,smax=0.9,m=6

在这里插入图片描述

  • 设定待生成bbox的长宽比ar分别为{1,2,3,1/2,1/3}
  • 依据sk和ar计算出待生成的bbox的长和宽

在这里插入图片描述

  • 依据anchor在feature maps中的相对位置得到anchor对应的anchor boxes的中心坐标,其中|fk|表示feature maps长宽中的较小值。i,j不大于|fk|

在这里插入图片描述

  • 需要注意的是,这里计算出的width和height、中心坐标都是相对值,再乘以输入图像的边长后(调整为正方形)就得到了bbox的真实值

读者需要清楚的是,上述得到bbox的过程与Faster RCNN的RPN网络非常相似,唯一不同的是:Faster RCNN只对最后一个feature maps进行处理,在每个位置上都生成9个不同大小及长宽比的bbox,以使网络实现多尺度检测能力;SSD网络对多个不同尺寸的feature maps上的每个位置,都生成k个不同大小及长宽比的bbox,使网络实现多尺度检测能力,这二者显然不同,望读者知悉。

另外,读者可能会疑惑:feature maps上的每个值都是有感受野(receptive fields)的,对于VGG16这样的较深层的网络而言,其高层的feature maps的感受野已经快与原图一样大了,又怎么可以从这么大的感受野中取出一块作为该位置在原图像上的映射位置呢?其实是这样的,前面所说的感受野是理论感受野,理论感受野中的每个像素点对输出的重要性不同,越靠近中心的像素点影响越大,呈高斯分布,也就是说只有中间的一小部分区域对最后的输出有重要的影响,这个中间的一小部分区域就是有效感受野,也即前面求出的每个feature maps的位置对应的区域。

2.2.3 训练SSD网络

(1)生成的bbox的label的标定
  • 将所有与ground truth的IOU不小于0.5的bbox标记为正样本(positive)
  • 对剩下的bbox,计算其confidence score(损失函数的一部分),从高到低排序,取top-n个作为负样本(negative),n取使正负样本的比例为1:3的数
(2)每个bbox的输出值

在这里插入图片描述

  • 得到bbox后,将bbox送入网络进行训练
  • 首先计算出第一个feature maps(上图中fea_map_1),对fea_map_1的每个位置进行3x3x512的卷积(每个卷积核生成1个值),卷积核数量为4x(Classes+4),得到38x38x4x(Classes+4)个输出

注意:对fea_map_1进行3x3的卷积操作时,采用权值共享,即,对fea_map_1中的每个位置,都采用同一组4x(Classes+4)的卷积核进行卷积。另外,为什么卷积核的数量是4x(Classes+4)呢?第一个4表示feature maps中每个位置生成4个bbox,(Classes+4)表示每个bbox共有Classes+4个值,Classes是预测的bbox的每个类别的概率,4表示bbox的长、宽、中心坐标的横坐标、中心坐标的纵坐标相对于ground truth的偏移值。

  • 其余feature maps同理,其中某几个feature maps每个位置生成6个bbox

一个输入图像共生成8732个bbox,怎么算出来的?38x38x4+19x19x6+10x10x6+5x5x6+3x3x4+1x1x4=8732

(3)损失函数

每次写到损失函数都贼开心,因为写到这儿就说明快写完了……自己搞懂了是一回事,讲出来是一回事,按着一定的逻辑写出来能让别人看懂又是另一回事。

标准的损失函数,没什么可说的:
在这里插入图片描述

  • 由两部分组成,第一部分为分类误差,第二部分为bbox的回归误差,N为正类样本的数量
  • 分类误差:
    在这里插入图片描述

我对这个分类误差函数是有一些疑惑的:上式第一部分计算的是与ground truth匹配的所有anchor box的误差和,具体讲,假如第i个anchor box与第j个ground truth匹配(IOU大于0.5),这时候要看anchor box预测出的类别,假如预测出的类别与匹配的ground truth的类别相同,那么累加误差,如果不相同,则不累加误差。问题就出在这里,也就是说,这个误差函数第一部分只衡量匹配的anchor box中类别预测正确的误差,对类别预测错误的anchor box,并不计算误差。我认为这是不合理的

  • 回归误差:

在这里插入图片描述

2.2.4 数据增强

数据增强在深度学习领域还是非常重要的,SSD中的数据增强手段也值得学习一下,但是我写不太动了,读者自行看论文吧……

3 总结

  • SSD基于Faster RCNN和YOLO,构建了一个端到端的网络,其检测速度、检测准确率在当时达到最好。
  • SSD最重要的创新是用好几个feature maps在原图上生成bbox,低层feature maps的bbox检测小目标,高层feature maps的bbox检测大目标,实现了多尺度检测
  • SSD的缺点是对小目标的检测效果不好,这是因为,在高层feature maps上几乎没有小目标的特征了,检测效果自然不好。论文提出的改进方法是将输入图像放大,但是这种方法非常僵硬。
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值