0. 背景
经过了rcnn,spp,fast rcnn, faster rcnn,yolo,这里又到了ssd模型。
faster rcnn的贡献是将候选框区域提取的部分也集成到CNN中去,并且与对象的分类和候选框区域微调共享同一个基CNN,而其中还是存在需要做4步训练的方法(作者虽然后续也实现了近似联合训练的方法);
不过yolo就比较暴力,直接将最后的feature map硬编码成7*7的网格,每个神经元就是一个如faster rcnn中RPN的划框,先验的将faster rcnn的RPN的工作硬编码到网络中。假设每个神经元就是原图中对象的中心,通过直接对目标函数进行改进,很好的将原来RPN的工作和fast rcnn的工作融合到目标函数中去了,这样做的好处是快,在预测的时候也不需要经过RPN去先得到所谓的对象候选框,直接一次过整个网络就行了;当然,也存在最后目标预测准确度下降的问题,因为从模型的设计上就可以看出,如果每个神经元只预测一个对象,那么就存在丢失目标的可能,而且作者通过实验也发现,对小目标的识别不如faster rcnn。
而SSD模型是在yolo后提出的,其本身兼顾了多尺度的feature map的结合,颇有点faster rcnn 论文中提到的图像金字塔的味道在里面,而且不需要单独的一个部分来提供对象候选框,本身就如yolo一样是一个单一的网络模型,相比于faster rcnn更容易训练,而且,ssd相比faster rcnn,整体准确度有所提升,并且速度也比yolo一代要快。
SSD模型通过将CNN后部分多个不同尺度的feature map都拿来预测,从而很好的解决小目标在最后哪个feature map上会消失不见的问题;而且如yolo就是一个单一网络,所以整体的训练和预测上耗时也相较之前的模型要低。不过我们还是从中发现了SSD如faster rcnn中一样,会事先假定一些尺寸和长宽比大小的框,就如RPN中一样。
个人觉得SSD就是采用了:
- 1 - yolo的单一模型思想;
- 2 - faster rcnn 预先假定的固定尺寸的候选框,然后训练阶段去微调;
- 3 - 并如其他模型一样通过多个feature map上获取信息解决小目标识别问题。
1. 模型
图1.1 不同尺度下feature map
如图1.1所示,最左边的就是真实图片和给定的groundtruth框;而中间的8*8就是某一层的feature map,从中可以看出和原图的狗和猫都有所对应,然而因为当前层的feature map映射回输入层的感受野上,猫部分是够了的,而狗部分不够,也就是最多框住了狗的一半;再看最右边的4*4的feature map,这一层每个神经元映射回输入层的感受野相比8*8的更大,所以狗部分检测成功了。而如果从当前层映射回原图的感受野,猫应该会完整的框住,不过同时也会框住其他对象,不利于基于预先定义的框的微调(因为得把预定义框移动好多)。所以从这里就可以看出从不同尺度的feature map上获取对象的好处了。
图1.2 SSD与yolo模型结构
如图1.2的SSD部分所示,输入层是300*300大小,然后通过vgg16接入,其中的conv6,conv7这两层本事vgg的全连接层,这里替换成了卷积层。后面的conv8_2,conv9_2,conv10_2,conv11_2也都是新增加的层。
并且将前面的VGG16的conv4_3,conv7也作为框选择的feature map
2. 预定义候选框
如论文3.1介绍的,在conv4_2,conv10_2,conv11_2这三个feature map上,每个位置选取4个不同尺寸的候选框,而在其他几个位置上选取6个;所以如下计算:
(38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4=8732)
也就是从这些feature map上一共可以预先设定这么多个候选框
其中每个feature map的一个神经元都对应着输入层的一个感受野,如yolo那样最后的7*7的feature map上就有49个神经元,每个神经元对应输入层一个感受野区域。而如果基于这几个感受野需要做预定义框的变形,那么越往后的缩放只能相对变小,不然因子太大,直接对应输入层的感受野区域就完全包含了整个图片了。
在SSD中每个预定义框的默认中心为((frac{i+0.5}{|f_k|},frac{j+0.5}{|f_k|})),其中(|f_k|)为第k个所需要提取的feature map的尺寸,如我们一共会在6个feature map上设定候选框,第一个是(38*38),那么(|f_k|=38),而分子的(i,j)就是当前神经元的位置,其中的0.5是因为神经元的跨越是以1为单位的(即第一个神经元是((0,0)),第二个是((0,1))),所以第一个神经元所表示的候选框的设定中心为((0.5,0.5))
其中计算预定义候选框的长宽如下步骤:
- 按公式:
计算当前feature map的预定义框的缩放因子,其中以图1.2结构为例,(m=6),而其中的(s_{min}=0.2),(s_{max}=0.9)是人为预先定义的,表示最低feature map的尺度是0.2,最高的是0.9,从而其他中间的feature map就介于两者之间了
2. 设定长宽比:
- 基于缩放因子和长宽比例,计算当前预定义框的宽和高:
宽: ((w_k^a = s_ksqrt a_r)) ;
高:((h_k^a= s_ksqrt a_r ))
其中对长宽比为1的多加一个缩放因子:({s'}_k=sqrt{(s_ks_k+1)})
如上所述,在每个feature map上一共会有6种类型的候选框,对于其中某些feature map,丢弃缩放因子为(frac{1}{3},3)这两种情况