关于gluon中Object Detection 中SSD模型的笔记
源码地址 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个],理解为 缩放大小和长宽比例
生成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 ...
先画一个模型图.
总的来说模型分为四个主要模块:body() 这个部分可以替代起来任意typical cnn models, i.e., VGG, ResNet. downsampels()就是一个简单的为了得到不同scale的网络。然后是box_preds和class_preds两个网络,值得注意的是代码中多次提到的
for scale in range(5) ---这里是因为代码中设置了五组ratios和size大小:
所以 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个目标。仅供参考。我日后也会做实验改进
上一篇: php如何设置数组
下一篇: ThinkPHP的增、删、改、查