SSD模型解析

SSD模型训练起来较为简单,所以最近用的也比较多

现在做一个完整的SSD模型解析,包括训练过程中遇到的各种坑的解决办法

先放一个被用烂了的图

 模型说明

图片通过vgg16的conv4_3layer得到一个feature_map_1

对feature_map_1进行卷积,使用3*3的卷积核,再使用1*1的卷积核,使用multi_task方法(在使用3*3卷积核之后,分别经过两个不同的1*1卷积核)

获得result_sigmoid(h*w*1)和result_softmax(h*w*m)

result_sigmoid对应的是这个区域的archer_box是否包含正样本

result_softmax对应的是这个区域那一个archer_box为字母框的概率最大

对feature_map_1通过3*3卷积核卷积之后的结果进行max_pooling获取feature_map_2

对feature_map_2进行卷积,使用3*3的卷积核,再使用1*1的卷积核,使用multi_task方法(在使用3*3卷积核之后,分别经过两个不同的1*1卷积核)

获得result_sigmoid_2(hh*ww*1)和result_softmax_2(hh*ww*m)

result_sigmoid_1对应的是这个区域的archer_box是否包含正样本

result_softmax_2对应的是这个区域那一个archer_box为字母框的概率最大

以此类推

关于archer_box:

  先放个图

  

     一般来说,CNN的不同层有着不同的感受野。然而,在SSD结构中,default box不需要和每一层的感受野相对应,特定的特征图负责处理图像中特定尺度的物体。在每个特征图上,default box的尺度计算如下:

  计算feature_map_k的感受野 receptive_field

      其中,smin = 0.2 ×  receptive_field,smax = 0.9 × receptive_field


      default box的aspect ratios 有:

  一般来说,设置6个radio即可(m=6)

      每一个default box,宽度、高度、中心点计算如下:

  

  对于每一个Sk 我们有

  a = {1, 2, 3,1/2,1/3},对于 aspect ratio = 1,额外增加一个default box,该box的尺度为 

  

训练过程:

训练和解析是很不一样的

因为ssd模型的输出是一个feature map嘛,我开始就拿输入为一张图和输出为n张feature map去做反向传播

结果效果非常差,,,feature_map 全部趋于0

  

之后重新读了一遍论文,又读了一些博客,找到了正确训练的方法

我们已有的数据为带标记的图片数据

数据生成:

  将图片输入vgg_16的conv5_3获取feature_map(h*w*c)

  使用3*3的滑动窗口,stride为1 ,padding = same 将feature_map 取成h*w个3*3*c的小窗口

  计算这个3*3滑动窗口的感受野

  通过感受野,每个滑动窗口生成35个default box

  遍历所有的标记,找到对这35个default_box最大的IOU

  若iou<0.3则记为负样本,若iou>0.7则记为正样本

  

  对于IOU>0.7的,找到对于iou最大的default box 相当于一个softmax 分类

  因为我们ssd是多层的,feature_map是可以替换的,所以每一个feature map按照以上规则生成数据即可

网络训练

  我们的输入是3*3*c的一个feature map

  输出有两个

  一个是一维的值,表示是否是正负样本

  另一个是35维的向量,表示哪一个default box为iou最大的那个

  网络结构就是卷积加全连接嘛,这个也比较简单

  但要注意,最后一个卷积要使用(3*3) 的卷积核,输出为1*c

  就是把每一个通道变成一个

网络封装

  封装之后的网络输入为h*w*3的bgr图像

  输出为3-5个map_1(h*w) ,     map_2(h*w*35)

  第一个map 表示正负样本  第二个map表示哪一个default box iou最大

  但是我们有全连接,,,全连接使用1*1卷积核代替即可

  

  卷积没什么好说的

  全连接用1*1卷积核代替即可  

原文地址:https://www.cnblogs.com/shensobaolibin/p/9303748.html