最近在研究SSD的源码,惊讶的发现,在 https://github.com/weiliu89/caffe/tree/ssd   上给出的源码,与论文中描述竟然不一样!或许是我错了。下面给出疑问和证据。

疑问:mbox_loss中到底包含没包含loc_loss? smooth_L1到底参与运算了没?

首先,在生成脚本:ssd_pascal.py中mining_type是:MAX_NEGATIVE

那么在multibox_loss_layer.cpp中,计算loc_loss表明是下面完成的:

实际我们都被误导,这个函数仅仅是完成该层的前向传递计算,实际计算loc_loss是在MineHardExamples这个函数中,我们打开这个函数的定义,你会发现这里面才是论文中提及的NMS、Smooth_L1的根据地。我搜便了整个caffe-ssd工程路径,发现实现L1计算的只有一处,就是在bbox_util.cpp中的void ComputeLocLoss(const Blob<Dtype>& loc_pred, const Blob<Dtype>& loc_gt, const vector<map<int, vector<int> > >& all_match_indices, const int num, const int num_priors, const LocLossType loc_loss_type, vector<vector<float> >* all_loc_loss)这个函数,也就是说,只有调用这个ComputeLocLoss,才会进行smooth L1 loss的计算。那么问题来了,整个bbox_util.cpp中仅调用了一次ComputeLocLoss,但是这次掉用是在mining_type=MultiBoxLossParameter_MiningType_HARD_EXAMPLE 的情况下。

我查过了,MultiBoxLossParameter_MiningType_HARD_EXAMPLE=HARD_EXAMPLE,而并不是我们定义的MAX_NEGATIVE,因此按照这么分析,上图中的ComputeLocLoss 不执行。

证据:实际验证

在关键点出,我设置了LOG输出,例如在调用ComputeLocLoss后,以及下面的else:

还有,以防程序在其他地方调用这个计算,我索性在ComputeLocLoss函数中设置了LOG:

然后重新编译工程,make -j8,截图显示是我第二次增加LOG,仅改了bbox_util.cpp,因此之编译了这个:

然后重新运行ssd_pascal.py,训练的LOG截图如下:

从输出结果看,computeLocLoss并没有执行(下图是摘出来的LOG输出的逻辑,假如执行,应该输出 "ComputeLocLoss MultiBoxLossParameter_MiningType_HARD_EXAMPLE"):

总结:通过实际验证发现,论文中提到的,可能在实际代码中并没有用到。或许是本人对ssd的使用还没理解到位,如有大神路过,还请不吝指教,为小弟解惑!

另外补充,我们使用./build/tools/caffe train进行训练,但是在运行score_ssd_pascal.py时依然使用 train这个工具,无论怎改test_interval或者multistep的stepvalue,它都是在test。这个问题也困扰了好久,今天回过头来仔细对比了score_ssd_pascal和ssd_pascal生成的.sh发现,前者里面并没有引入solverstate,而仅仅只有一个caffemodel,而后者是两者都载入了。可能就是这里的原因吧,后者会根据设置的solver参数继续进行训练,而前者没有snapshoot的记录,对现存的模型进行test。

关于caffe-ssd训练时smooth_L1到底参与运算与否的问题相关推荐

  1. 记录SSD训练时一个坑:FileNotFoundError

    我在利用训练SSD源码进行训练时,报了如下错误 FileNotFoundError: [Errno 2] No such file or directory: 'voc_demo/VOCdevkit/ ...

  2. ssd训练时提示:Cannot copy param 0 weights from 'xxxx',以及提示No module named caffe.proto,推理时设置GPU模式

    1.Cannot copy param 0 weights from 'xxxx' 使用预训练的模型,当希望修改部分网络结构并继续使用相同结构的网络参数时,经常遇见这个问题.以为改的天衣无缝,但是这个 ...

  3. 使用caffe训练时Loss变为nan的原因

    极视角高校计算机视觉算法邀请赛目前正在报名中,欢迎各高校在读学生报名参加,大奖+商业项目参与机会+数据库等你来拿!!!咨询报名请加小助手(微信号:Extreme-Vision) 本文为极市平台原创编译 ...

  4. Caffe SSD Ubuntu16 04 训练自己的数据集

    总的来说,Caffe 是一个比较难上手的框架.这次尝试训练 Caffe 框架下 SSD 模型的训练是我第一次使用 Caffe 框架.下面就说一说我踩过的几个坑,希望能够帮助到大家. 1 编译 Caff ...

  5. 基于caffe用SSD训练自己的数据

    题记:因需要用到caffe的检测模型,之前在mxnet上用ssd训练过,故还用ssd来训练.从环境到训练,踩了不少坑,记录一下,方便以后翻阅.环境问题,因之前配过,用的docker,并未记录.当初也是 ...

  6. Caffe SSD编译、训练及测试

    SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征以用于检测.SSD的网络结构如上图所示(上面是SSD模型,下面是Yolo模型),可以明显看到SSD利用了多尺度的特 ...

  7. Caffe 训练时loss等于87.3365且保持不变的原因及解决方法

    如题,在caffe训练时,遇到这个特殊的数字之后,loss会一直就是这个数字. 网上虽然有很多针对这个问题调参的trick,但少有详细的分析,因此,有必要研究一下caffe的源代码. softmax的 ...

  8. 笔记:caffe ssd gpu训练自己的数据集

    caffe ssd GPU训练自己的数据集 一.caffe环境搭建 二.数据集 三.训练和测试 一.caffe环境搭建 环境搭建过程网上有很多教程,可能要踩些坑吧,正常,这里不多赘述,主要是我当时也没 ...

  9. Caffe训练时出现了无数个Train net output #.....

    尝试一种基于concatenation的网络结构,结果错把concatenation没接到下一步,训练时出现了无数个"Train net output #.....". 改了网络结 ...

最新文章

  1. 如何在 CentOS 7 中安装或升级最新的内核
  2. 管理员端API——任仲行
  3. Nacos(十一)之NacosSync 介绍
  4. 转-Redis AOF 持久化详解
  5. 用java写的教职工信息管理系统_基于Java的教师信息管理系统的设计与实现论文.doc...
  6. uniapp 创建与配置 tabbar
  7. Web Service Software Factory 入门
  8. 2017php类库,AMQB官方PHP库
  9. matlab制作科学计算器,MATLAB科学计算器设计
  10. 中美线径对照表_线径与线号对照表
  11. stm32学习笔记:点阵模块74HC595、APM4953
  12. mysql优化方面的面试题
  13. 机器学习实战 | 综合项目-电商销量预估进阶方案
  14. H3C交换机远程端口镜像配置
  15. 【论文解读--MPC控制】Dynamic Locomotion in the MIT Cheetah 3 Through Convex Model-Predictive Control
  16. 人工智能热卖榜图书《人工智能怎么学》
  17. C++设计模式 命令模式(服务员命令厨师)
  18. 基于EasyNVR实现RTSP_Onvif监控摄像头Web无插件化直播监控
  19. 白盒测试junit实现三角形问题
  20. 圣天诺 加密java_圣天诺Sentinel LDK 7.8壳加密的编译环境是什么?

热门文章

  1. java网络病毒,网络病毒是由因特网衍生出的新一代病毒,即Java及ActiveX病毒。由于(),因此不被人们察觉。...
  2. python 命名管道_Linux 下 Python 读取命名管道的疑惑
  3. android单例模式代码,设计模式(一):Android 源码中的单例模式
  4. solidworks重建模型好慢_转发:解决SolidWorks运行慢,经常崩溃的方法
  5. linux配置路径,Linux下配置搜索路径
  6. c中的结构体嵌套问题_C中的结构
  7. Java 12字符串方法
  8. sql别名无效_SQL别名
  9. t–sql pl–sql_SQL存储过程–终极指南
  10. 熊猫to_csv()–将DataFrame转换为CSV