欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于gluon中Object Detection 中SSD模型的笔记

程序员文章站 2022-04-05 09:59:36
...

源码地址  gluon example: 

Object Detection Using Convolutional Neural Networks

自己跑实验的一些代码理解,可能存在错误,欢迎讨论

1. MultiBoxPrior 函数

   输入与输出:对于(w,h)的shape输入,生成w*h*4(x_1,y_1,x_2,y_2)[左上角,右下角的坐标]。

   参数:size[ m个 ] 和 ratios [n个],理解为 缩放大小和长宽比例 关于gluon中Object Detection 中SSD模型的笔记

   生成n+m-1个 default box, 每个框的大小如下:

for i in range(m+n-1):
   if i<= n:   
       s = size[i]
       r = ratios[0]
   else
       s = size[0]
       r = ratios[i-n]   
2.  模型整体结构

    class ToySSD  -> toy_ssd_forward  -> toy_ssd_model ...

    先画一个模型图. 

关于gluon中Object Detection 中SSD模型的笔记


关于gluon中Object Detection 中SSD模型的笔记

 总的来说模型分为四个主要模块:body() 这个部分可以替代起来任意typical cnn models, i.e., VGG, ResNet. downsampels()就是一个简单的为了得到不同scale的网络。然后是box_preds和class_preds两个网络,值得注意的是代码中多次提到的

for scale in range(5) ---这里是因为代码中设置了五组ratios和size大小:

关于gluon中Object Detection 中SSD模型的笔记

所以 box_preds和class_preds都是各需要5层convolutional layer来预测boxes 和 categories的。同时这里num_anchor = 4 (2+3-1)
这些参数都是可以根据自己的任务进行修改的。

代码最后的输出:

default_anchors, class_predictions, box_predictions

都是包含了五组不同的size和ratios,default_anchors是根据设置的size和ratios在input feature map 计算的出来的,然后class_predictions和box_predictions是在input feature map后面借了一层卷积层计算出来的。

box convolution : channel = num_anchor * 4 , 3*3, padding =1 , 不改变feature shape

class convolution : channel = num_anchor * (num_class+1) , 3*3, padding =1 , 不改变feature shape


3.  关于data的组织,模型的输入与label的构建

  在tutorials中,用的是皮卡丘数据集。输入是x(batchsize,channel,shape[0],shape[1]),label是[categories,x_1,y_1,x_2,y_2]

  我目前也还不知道一张图像如果有多个目标如何给网络,就是y如果是个list的情况。
  而且后面label会从shape(1,5L)reshape成(3,5L), 就是补充 np.ones(2,5)*(-1)... 说是为了cuda implementation 。这里也不懂

  所以欢迎大家能指点下这个多个label的情况

 补充一下:我觉得为什么把y reshape成(3,5L)很可能就是我上述说的图像中有多个目标的做法,这里可能估计一个训练图像里面最多3个目标。仅供参考。我日后也会做实验改进