大白话分析——SSD目标检测网络从训练到预测(上)
一. 背景
本文档以ssd300作为背景网络进行解读,以Tensorflow,Keras为框架
原始代码:https://github.com/pierluigiferrari/ssd_keras
分析后的代码:https://github.com/Freshield/LEARN_detection/tree/master/a4_github_better_ssd/a2_analyze_model
目前网上基本都网络部分讲的比较多,但是真正训练和预测部分都相对粗略,所以自己网上找了一个相对比较好的ssd检测作为蓝本来分析,然后把相应的过程用大白话给表达出来,方便大家可以更好的理解网络。
二. 整体流程
整个SSD大致可以分为四个部分:模型部分,数据部分,Loss部分以及decode部分
三. 模型部分
模型部分是一般网上文章说的比较多的部分,模型可以分为主干网络,conf预测,loc预测,pirorbox,reshaper这5个部分,下图为总体的架构
1. 主干网络
这里是主干网络和yolo的网络的对比,可以看出从不同的地方选择了多尺度的信息。主干网络这例使用的是vgg网络,其实就是从头到尾的正常卷积操作,尺寸的变化如下:
(300,300,3) -> (150,150,64) -> (75,75,128) -> (38,38,256) -> (38,38,512)(conv4_3) -> (19,19,512) -> (19,19,1024)(fc7) -> (10,10,512)(conv6_2) -> (5,5,256)(conv7_2) ->
(3,3,256)(conv8_2) -> (1,1,256)(conv9_2)
这里后边加上名称的都是之后要用的的层。
2. conf预测
这是是conf预测,也就是confidence,其实就是相当于分类网络,把每个priorbox的21个类别都预测出来,就像正常的分类网络一样。各层的变化如下:
conv4_3(38,38,512) -> L2 norm -> (38,38,4*21)
这里要进行L2 norm的原因是conv4_3层比较靠前,它的值相对较大所以使用L2 norm来减小数值。后边的4为每个格的先验框数量,也就是说本层一共有38*38*4个先验框,具体的解释会在priorbox部分介绍,而21则代表了类别数,其中20个类别和1个背景类。
fc7(19,19,1024) -> (19,19,6*21),6代表这层是每个格6个先验框,一共19*19*6个先验框。
conv6_2(10,10,512) -> (10,10,6*21)
conv7_2(5,5,256) -> (5,5,6*21)
conv8_2(3,3,256) -> (3,3,4*21)
conv9_2(1,1,256) -> (1,1,4*21)
3. loc预测
这里是坐标预测的部分,需要特别注意的是,坐标的预测并不是真正的预测检测的目标的位置,而是检验的目标相对于先验框也就是priorbox的相对位置,包括相对的中心点的偏移以及宽高的缩放。
这里之所以不直接预测检验框的位置是因为无法做到。由于使用的卷积神经网络,所以所有的操作都是卷积,而卷积神经网络先验的前提是空间不变性,所以我们会用同一个卷积核按照步长遍历整个图像,这样可以大大减少所需的计算量。但是也由于是同样的卷积核,那么对于同一个特征,也会得出一模一样的结果。我们假设在一张图的左上和右下有一模一样的两辆车,那么同一个卷积核则会得出同样的结果而无法得出不同的车的位置。这也是之所以需要先验框的一部分原因&#