SSD改

本文详细解析了SSD(Single Shot MultiBox Detector)在Caffe框架下的源码实现,包括annotated_data_layer、prior_box_layer、multibox_loss_layer等关键层的原理与功能,探讨了数据不平衡处理、训练过程以及损失函数的设计。此外,还介绍了学习率策略和优化算法的选择。
摘要由CSDN通过智能技术生成

SSD源码

Wei Liu所做源码,TensorFlow版SSD可能有莫名其妙的错误,故转去caffe

caffe

C++版caffe,在 include/caffe/ 目录下面的

annotated_data_layer.hpp  (提供数据

detection_evaluate_layer.hpp  (验证模型效果

detection_output_layer.hpp  (输出检测结果

multibox_loss_layer.hpp  (计算loss)

prior_box_layer.hpp  (计算prior bbox

以及对应的 src/caffe/layers/ 目录下面的cpp和cu文件,另外还有 src/caffe/utlis/ 目录下面的 bbox_util.cpp 。其中跟训练有关的是 annotated_data_layer 、 multibox_loss_layer 、 prior_box_layer 。

annotated_data_layer

这部分代码把图片读出来(包含一些data augmentation),同时把每张图里的groundtruth bbox读出来传给下一层,没做什么特殊处理。

prior_box_layer

这一层完成的是给定一系列feature map后如何在上面生成prior box,对于输入大小是 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,如VGG的conv4_3,生成的prior box可以达到数千个。当然对于边界上的box,还要做一些处理保证其不超出图片范围,这都是细节了。这里需要注意的是,虽然 prior box 的位置是在 W×H 的格子上,但 prior box 的大小并不是跟格子一样大,而是人工指定的,原论文中随着feature map从底层到高层,prior box 的大小在0.2到0.9之间均匀变化。

multibox_loss_layer

FindMatches

将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 &am

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值