作 者: 心有宝宝人自圆
声 明: 欢迎转载本文中的图片或文字,请说明出处
写在前面
受到前辈们的启发,决定应该写些文章记录一下学习的内容了
之前也读过一些文章、写过一些代码,以后再慢慢填坑吧
现在把最近读的学习与大家分享一下
本人初入江湖,分享一下自己的理解和心得,如有错误或理解不当敬请指出
SSD
论文地址:SSD: Single Shot MultiBox Detector
SSD是一个one-stage目标检测方法,不同于R-CNN系列的方法(two-stage),能够又快有准确的进行目标检测
目标检测嘛,就是我们常看到的那种用一个个方框框圈出检测目标
接下来就和大家分享一下我对论文的理解 (这一部分主要是思路和总体上的把握)
接下来还有代码实现部分(细节实现)正在填坑,请多多关注*
代码实现部分(细节实现):SSD:Single Shot Multibox Detector:第二部分-代码与细节实现(来就来全家桶,有些这篇文章没有讲清楚的内容、或令人困惑的地方都写在里面了,欢迎围观)
Abstract
本文提出仅使用一个深度神经网络进行目标检测的方法,将输出空间的边界框离散化为以aspect ratios(长宽比)和scales参数确定形状和大小、基于每个特征图生成的一系列固定的锚框。网络连接了从不同特征图生成的不同分辨率的预测,很自然的能够处理不同的目标尺寸。SSD生成的锚框类似于目标提议方法,但SSD消除了提议区域生成和后续像素或特征重采样阶段,并把这些过程封装在了一个网络里。
Introduction
之前的目标检测方法基本都是如下方法的变种(two-stage)-文中作者很形象的形容为pipeline
pipeline:假设提议区域,并对每个提议区域进行重采样 ➡ 使用分类器对提议区域分类
该方法存在的最大缺点:准确率和计算资源消耗(速度)的权衡
SSD则是一种single-shot的目标检测方法(YOLO也是single-shot)
- 使用小卷积核预测目标类别和边界框的偏移量(高层特征图的感受野大,是小卷积核就能处理到大尺度特征)
- 使用独立的预测器(filter)处理不同长宽比的检测,这些滤波器作用于多层特征图以检测不同尺度的特征
- 这些
滤波器卷积核的设计使卷积过后的特征图的大小不发生变化,相当于对每一原始特征图的每一像素块进行了预测 - 我觉得这里的设计与锚框的设计是有一致性的,等到了介绍锚框的部分可以再来回顾一下
- 这些
summarize their contributions(先总结一下SSD的贡献)
- 核心操作:使用一组固定的边界框(类似R-CNN锚框,也称作锚框)、作用于特征图的独立卷积核
- 准确率提升操作:边界框显式使用不同长宽比,对不同尺度的特征图产生不同尺度的预测
- end-to-end:特征的提取由网络学习完成,...妈妈再也不用担心如何选特征参数了(当然他的固定的边界框也是人为定的,对训练有重要影响)
- 任意输入形状:往往最后的分类器限制了输入的形状,SSD把预测器改为了卷积层(当然训练的时候一般固定输入形状)
SSD的实现介绍
1. 模型
feed-forward卷积神经网络:
- 使用截断了全连接层的image classification network
- 产生一系列固定大小的边界框(不同的aspect ratios 和 scales,作用于不同特征图,未来的ground truth)
- 预测边界框内不同目标的类别得分、实际的边框的偏移(预测器产生的结果,预测值)
- 非极大值抑制得到最终的检测结果(留下信度最高的预测边界框)
auxiliary structure(辅助结构,一些模型重要部分的介绍)
-
多尺度特征图的检测:
多尺度特征图的检测
- 将指定feature map传入独立的predictor预测offset和class,并将这些预测结果加到截断的base net之后
- 这些特征图逐层减小,能检测到不同尺度的特征(就是之前说的特征图减小后每个像素的感受野就很大,小卷积核就能捕获大特征)
-
卷积预测器:
上面每个指定feature map传入的predictor,以卷积的方式实现
predictor分为预测offset和class,每个卷积核的大小均为3x3,stride为1,通道维为P(之后用作特征维,设计理念类似于1x1卷积层)
-
默认锚框和长宽比:
- 每个特征图对用一组默认锚框(不同aspect ratios,scales参数),假设特征图为m x n,锚框是以每个像素块为中心生成的,每个像素生成k个锚框(可以先认为锚框是人为选定目标区域,但其与ground truth不完全一致,还需要进行处理才能变成训练用的ground truth,这是后面的部分了......大概能知道锚框是按像素块生成的,所以predictor的结果也是要按像素生成的)
- predictor计算c个类别得分和4个offset,每个像素产生(c+4)k个预测,每个特征图产生(c+4)kmn个预测
- 多个特征图上不同形状的锚框有效的离散化了输出空间边界框的形状
2. 训练
锚框与ground truth匹配策略:(终于可以将锚框转换为ground truth了 (_),然而锚框的组成参数还要往下...... )
-
训练中我们需要为锚框分配ground truth信息,判断指标:jaccard overlap(交并比):
以一个ground truth图像的锚框分配为例:
锚框与ground truth各个类别分别计算 jaccard overlap:
shape ->(k\*m\*n,num_class)
)为每个ground truth边框分配一个固定锚框(这些锚框拥有不同位置(像素)、aspect ratios、scales)(先把交并比最大的锚框分给该类,把output之中该行给去除,最后得到了新输出为:
shape ->(k\*m\*n-num_class,num_class)
的未分配锚框)-
剩余未分配的固定锚框,以jaccard overlap>阈值(0.5)来分配ground truth信息(每个未分配锚框找出交并比最大值以及对应目标类别,若交并比大于阈值,则为该锚框分配该目标类别)
以上分类为POSITIVE
jaccard overlap<=阈值的锚框被分为背景类,NEGATIVE
训练目标(损失函数):
- 位置损失函数:针对offset,使用Smooth L1函数(实际offset的四个指标已经被编码)
- 信度损失函数:针对分类,使用Cross Entropy Loss
-
针对offset的编码:
从上面 不同特征图上的锚框 图片中可以看出锚框的offset标识为,然而在计算LOSS的时候使用了如下转换:
=,=,, (1)
其中(cx,cy,w,h)是ground truth的真实位置信息,是锚框的真实位置信息
这个时候会有如下的问题存在(个人理解):
ground truth信息是基于原始输入图像的大小,锚框大小基于特征图的大小,所以两者尺度存在不一致性
即使同一特征图内,大的锚框可能会导致的offset偏大,使LOSS增加
于是我们采取如下操作(个人理解):
- 真实位置信息(cx,cy,w,h)使用相对大小表示,这样ground truth信息和锚框的大小在尺度上就一致了(由于网络正向传播是采样过程,原始图像和特征图的相对位置在空间上具有一致性,简单说就是等比例缩小......)
- 之后把不同offset做如(1)式的变换,消除了锚框各个锚框差异的影响
为锚框选择scales和aspect ratios参数(作者使用的锚框参数):
实际操作中,两组参数的选择是自己指定的,要让锚框尽可能平铺在特征图上,这里作者给出了他的选择
类比语义分割:网络低层捕获到更细节的信息,有利于提高语言分割准确率;global context pooled能够帮助平滑语义分割结果
不同层的特征图有不同的感受野,SSD将固定锚框平铺在特征图上,特定特征图上的predictor只用去学习响应该特定尺度下的目标(这个时候需要数据增广了来扩充训练集来增加各个尺度的目标)
-
计算公式:aspect ratio -> , scales ->
,
此外当 时,会额外引入的锚框
一般高层的特征图选用更大的scale来捕获更广的感受野,低层的特征图则使用小scale来捕获更为细节的信息
Hard negative mining:
- 大部分锚框都是negative类别(背景类),尤其当锚框很多的时候,这样会导致训练数据正负类的不平衡
- 当实际计算损失,将负类按信度损失排序,只选择信度损失最高的部分负类,使负类:正类最大为3:1
Data augmentation数据增广
- 目的:增强对不同尺度、形状的输入图片的鲁棒性
- 随机采样的选择:
- 使用最原始的输入图片
- 对原始图片采样,使的与检测目标最小jaccard overlap 分别为0.1,0.3,0.5,0.7或0.9
- 随机采样一个patch
实验结果
更新一下:这部分的内容在SSD:Single Shot Multibox Detector:第二部分-代码与细节实现中有我个人的理解和代码的实现,欢迎围观
这一部分基本上是在使用不同的数据集、不同控制处理条件、不同网络结构的情况下,对实验所产生最终目标检测结果做了一次全面的测评.......
总得来说就是又快又准,blablabla...... 特别好,谁用谁知道
作者还总结了一些训练要点简要和大家分享一下:
- 数据增广很重要,能大幅提升训练的效果,增强模型的鲁棒性,之前也提到过数据增广的必要性
- 锚框的形状越多越好:锚框是用来生成训练用的ground truth label的,需要多种多样的形状来覆盖不同尺度的目标
- Atrous算法:
还没有研究过......溜了溜了
在细节实现的模型部分有我自己的理解 - 不同分辨率的各输出层能使模型更好:不同的特征图主要负责各自尺度的目标,随着层数的升高,细节信息被丢弃的越多,所以小目标的检测需要更低层输出的特征图,SSD在尺度大的目标检测上比小目标的检测效果更好
总结
模型的关键特点
- 不同的特征图上,锚框with不同的aspect ratios和scales (之前差不多一大半的篇幅都是锚框的生成处理过程.......)
- 使用独立的小卷积核的卷积predictor来对选定的特征图对目标边界框做出预测
- 适当的训练策略(实验结果部分给定的要点)使模型更优秀
新人上路,请多多关注,纯手动不易,欢迎讨论
转载请说明出处。