SSD图像识别代码学习笔记

看代码之前先简述一下SSD的做法:图片被送进网络之后先生成一系列feature map,传统一点的框架会在feature map(或者原图)上进行region proposal提取出可能有物体的部分然后进行分类,这一步可能非常费时,所以SSD就放弃了region proposal,而选择直接生成一系列defaul box(或者叫prior box),然后将这些default box回归到正确的位置上去,整个过程通过网络的一次前向传播就可以完成,非常方便,如下图所示。思路类似的算法还有YOLO,不过精度比SSD差了不少。

 

prior_box_layer

这一层完成的是给定一系列feature map后如何在上面生成prior boxSSD的做法很有意思,对于输入大小是 W×H feature map,生成的prior box中心就是 W×H 个,均匀分布在整张图上,像下图中演示的一样。在每个中心上,可以生成多个不同长宽比的prior box,如[1/3, 1/2, 1, 2,3]。所以在一个feature map上可以生成的prior box总数是 W×H×length_of_aspect_ratio ,对于比较大的feature map,如VGGconv4_3,生成的prior box可以达到数千个。当然对于边界上的box,还要做一些处理保证其不超出图片范围,这都是细节了。

这里,先弄清楚下文所说的 defaultbox 以及 featuremap cell 是什么。看下图:

·        featuremap cell 就是将 feature map 切分成 8×8 或者 4×4 之后的一个个 格子

·         default box 就是每一个格子上,一系列固定大小的 box,即图中虚线所形成的一系列 boxes

这里需要注意的是,虽然priorbox的位置是在 W×H 的格子上,但prior box的大小并不是跟格子一样大,而是人工指定的,原论文中随着featuremap从底层到高层,priorbox的大小在0.20.9之间均匀变化。

这里需要注意的是,虽然priorbox的位置是在 W×H 的格子上,但priorbox的大小并不是跟格子一样大,而是人工指定的,原论文中随着feature map从底层到高层,prior box的大小在0.20.9之间均匀变化。


一开始看SSD的时候很困扰我的一点就是形状的匹配问题:SSD用卷积层做bbox的拟合,输出的不应该是feature map吗,怎么能正好输出4个坐标呢?

这里的做法有点暴力,比如需要输出 W×H×length_of_aspect_ratio×4 个坐标,就直接用 length_of_aspect_ratio×4 channel的卷积层做拟合,这样就得到 length_of_aspect_ratio×4 个大小为 W×H feature map,然后把feature map拉成一个长度为 W×H×length_of_aspect_ratio×4 的向量,用SmoothL1之类的loss去拟合,效果还意外地不错……

multibox_loss_layer

FindMatches

我们已经在图上画出了prior box,同时也有了ground truth,那么下一步就是将prior box匹配到ground truth上,这是在 src/caffe/utlis/bbox_util.cpp  FindMatches 函数里完成的。值得注意的是这里不光是给每个groudtruth box找到了最匹配的prior box,而是给每个prior box都找到了匹配的groundtruth box(如果有的话),这样显然大大增大了正样本的数量。

MineHardExamples

给每个prior box找到匹配(包括物体和背景)之后,似乎可以定义一个损失函数,给每个prior box标记一个label,扔进去一通训练。但需要注意的是,任意一张图里负样本一定是比正样本多得多的,这种严重不平衡的数据会严重影响模型的性能,所以对prior box要有所选择。这一步是在src/caffe/utlis/bbox_util.cpp  MineHardExamples 函数里完成的,我没细看= =

EncodeLocPrediction&& EncodeConfPrediction

因为我们对prior box是有选择的,所以数据的形状在这里已经被打乱了,没办法直接在后面连接一个lossCaffe等框架需要每一层的输入是四维张量),所以需要我们把选出来的数据重新整理一下,这一步是在 src/caffe/utlis/bbox_util.cpp  EncodeLocPrediction  EncodeConfPrediction 两个函数里完成的。

训练

Wei Liu等人在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值