从训练一开始就loss为0:

最开始以为是在生成train.lmdb前没有对label_map进行修改,发现并不是这个问题

1.训练的命令是:python ./examples/ssd/ssd_pascal.py

运行ssd_pascal.py后,会在ssd/caffe/下生成jobs文件夹,并在子目录下生成以下文件:

ssd_pascal.py主要作用就是这些用来训练的文件,真正运行训练的是最后几段代码:

这段代码实际运行的就是VGG_VOC2007_SSD_300x300.sh:

我先把~/ssd/caffe/examples/ssd/ssd_pascal.py里的solver_param的bug_info置为true进行调试:

调试的结果如下图:

可以看到最后一个forward(mbox_loss层)为0,这个就是训练网络最终的loss输出。如下图,mbox_loss层的输入为:

bottom: "mbox_loc"
bottom: "mbox_conf"
bottom: "mbox_priorbox"
bottom: "label"

可以看到mbox_loc,mbox_conf,mbox_priorbox层都有输入,好像label也是有输入的

这个时候就要去调试mbox_loss层看到底是什么造成了输出loss为0。

mbox_loss层的输出如下图,这两个if语句都要执行,loc_loss_为0,所以输出为0:

定位loc_loss_代码如下图,num_matches为0,所以loc_loss_也为0

定位num_matches代码如下图

MineHardExamples函数在bbox_util.cpp定义实现,num_matches由CountNumMatches函数来得到

下面是CountNumMatches的代码:

match_indices的size为0,所以后面两个for循环都不会执行。所以问题处在all_match_indices,all_match_indices又直接来自于MineHardExamples,所以返回看MineHardExamples。

MineHardExamples的all_match_indices来自于FindMatches,FindMatches也定义在bbox_util.cpp,如下图:

经过调试发现,FindMatches的all_gt_bboxes出错,按照作者注释:There is no gt for current image. All predictions are negative.

all_gt_bboxes来自于mbox_loss层GetGroundTruth函数:

经调试发现item_id为-1,所以gt_data出现了错误,gt_data来自于bottom[3],如下图:

bottom[3]的数据是直接来自于data层(即annotated_data_layer层),传来的是从数据集得到的label数据,所以去看annotated_data_layer层。

要注意一个问题, mbox_loss层的bottom[3]其实是annotated_data_layer的top[1],即label。在annotated_data_layer.cpp中查找top[1],只有一个,涉及到top[1]的代码如下:

这一部分只是确定形状,真正载入数据的应该是load_batch的这一部分:

即Transform函数,Transform函数来自data_transformer.cpp,Transform函数最终又可以定位到TransformAnnotation函数,TransformAnnotation函数中的ProjectBBox(crop_bbox, resize_bbox, &proj_bbox)返回为false,ProjectBBox来自于bbox_util:

调试发现bbox的xmin,xmax,ymin,ymax都为0,这和第二个过程寻找bug的结果一样了:

后面还有很多自己继续看的源码,但实际上都不能直接解决问题。其实仔细思考,既然知道了从数据集读取的label有问题,那就直接定位数据读取的问题,直接调到第二个过程,而不是一而再再而三的往里面看源码,有点浪费时间。

2.第一个过程花费了很多时间看代码,依旧没能快速定位。尝试用一张图去跑程序,发现bug依旧存在。由第一个过程发现label为空想到应该可能是数据读取出现错误,所以将bug定位在数据读取部分。caffe读取的是lmdb数据库,自己的数据集是VOC格式的,所以需要将VOC转换为lmdb,步骤是先后使用create_list.sh和create_data.sh,create_data.sh就生成了lmdb。

看了一下create_list.sh生成的文件,感觉没什么问题,就去看create_data.sh。create_data.sh需要create_annoset.py,转去看create_annoset.py。create_annoset.py中使用了convert_annoset(cmd = "{}/build/tools/convert_annoset"),转去看convert_annoset。convert_annoset.cpp中使用了ReadRichImageToAnnotatedDatum函数,这个函数来自于io.cpp,转去看io.cpp。io.cpp中的ReadRichImageToAnnotatedDatum函数有ReadXMLToAnnotatedDatum函数,这个函数是读取xml文件的,转去看这个函数。

函数中有这样一段代码,这个时候就想到了在第一阶段看到的xmax为0,ymax为0。

LOG输出看结果,这里的xmax和ymax也都为0。这说明从xml文件读取坐标时就出了错误。想一想本身代码应该不会有错,那就是我的xml文件有错,检查了很久发现xml文件格式没有错误。最后尝试将小数换成整数,发现就能正常读取这些坐标,loss的bug也解决了。

查阅资料,boost::property tree读取解析.xml文件的get函数有以下3种形式,把三种形式拿来调试:

下图是xml坐标为整数时的情况:

下图是xml坐标为浮点数的情况:

可以发现,为整数3种方式都可以,为小数的话,只能用float。想要实现浮点数坐标,就需要修改成以下形式:

并且你可以看到读取之后,就把这些坐标进行了回归处理:

自己用datum.py读取的程序,修改bug后那个依旧是不对的

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=caffe%20detum&oq=datum%2520%25E6%2580%258E%25E4%25B9%2588%25E8%25AF%25BB&rsv_pq=cc56a2d200019cbb&rsv_t=d64chi4v5Hx3yBvu2spt16z0COREoG%2BSu1dt8AMBR%2Fa%2BdSExcqbrUwDUuOs&rqlang=cn&rsv_enter=1&inputT=4482&rsv_sug3=72&rsv_sug1=37&rsv_sug7=100&rsv_sug2=0&rsv_sug4=6527

https://zhuanlan.zhihu.com/p/23485774

http://blog.csdn.net/change_things/article/details/53158217

那个在等号前面的&引用

之所以不能LOG出来,是因为前面那个是一个datum类,不是int 或者float类型

ssd遇到的bug的更多相关文章

  1. ssd训练之bug:Invalid JPEG data or crop window, data size 565248

    bug信息 tensorflow.python.framework.errors_impl.InvalidArgumentError: Invalid JPEG data or crop window ...

  2. ssd的BUG

    苦恼了我一周,当然最近我有事老请假,也有原因.就是查不到我训练的SSD模型问题出在哪里,loss也在下降,但是跳动比较大.测试时,有些类效果还可以,但是有些类压根检测不出来.而根据我的经验,那些类大概 ...

  3. ssd运行过程中遇到的bug

    1.出现以下错误: 没有添加环境变量: https://github.com/weiliu89/caffe/issues/4 可以看到当前PYTHONPATH不再ssd1里面,所以需要修改,修改之后就 ...

  4. SQL Server 优化器特性导致的内存授予相关BUG

    我们有时会遇到一些坑,要不填平,要不绕过.这里为大家介绍一个相关SQL Server优化器方面的特性导致内存授予的相关BUG,及相关解决方式,也顺便回答下邹建同学的相关疑问. 问题描述 一个简单的查询 ...

  5. 联想G50-70安装SSD及WIN10教程

    借着双11的东风,果断入手SSD120G和4G内存条1枚.经过近一周的安装与试运行,笔者实现了SSD+HDD双硬盘+WIN10系统.目前运行体验非常好,开机时间9秒,软件运行也非常流畅.在折腾的过程中 ...

  6. 【转】如何使用分区助手完美迁移系统到SSD固态硬盘?

    自从SSD固态硬盘出世以来,一直都被持续关注着,SSD的性能优势让无数用户起了将操作系统迁移到SSD的心思,直接后果就是让无数机械硬盘为止黯然退场,很多软件都可以做到系统迁移,然而,被完美迁移的系统却 ...

  7. 物体检测算法 SSD 的训练和测试

    物体检测算法 SSD 的训练和测试 GitHub:https://github.com/stoneyang/caffe_ssd Paper: https://arxiv.org/abs/1512.02 ...

  8. ssd算法的pytorch实现与解读

    首先先放下github地址:https://github.com/acm5656/ssd_pytorch 然后放上参考的代码的github地址:https://github.com/amdegroot ...

  9. SSD惊悚的跪了,找回数据

    1.电脑出现小bug,例如显示乱码,开机变慢等,都是SSD跪的前兆,哭,我怎么就没看出来,而且没有备份过数据. 2.终于,PC死机了...OK,重启,纳尼?起不来... 3.大哭,所有代码,所有论文不 ...

随机推荐

  1. 字符设备驱动另一种写法—mmap方法操作LED

    最近在看韦老师的视频,讲解了很多种字符设备的驱动写法.经过自己的研究之后,我发现还有另外一种写法,直接在应用层操作,省去了内核中的地址映射部分,使得用户可以在应用层直接操作LED.        mm ...

  2. sum=1+2+3+…+100

    sum = 1 for i in range(0,101): # sum = sum + i sum += i print(sum) sum +=i 等于 sum = sum + i

  3. 杂项-Java:JBoss

    ylbtech-杂项-Java:JBoss 是一个基于J2EE的开放源代码的应用服务器. JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用.JBoss是一个管理EJB的容器和服务器,支持E ...

  4. 12_传智播客iOS视频教程_注释和函数的定义和调用

    OC的注释和C语言的注释一模一样.它也分单行注释和多行注释. OC程序里面当然可以定义一个函数.并且定义的方式方法和调用的方式方法和我们C语言是一模一样的.OC有什么好学的?一样还学个什么呢? 重点是 ...

  5. myeclipse 导入maven

    一安装maven 先安装jdk,配置JAVA_HOME 把下载的maven bin包,解压到指定目录,比如:D:\apache-maven-3.3.9-bin 配置maven的系统变量M2_HOME和 ...

  6. linux 查看进程和端口

    1.进程查看 #ps aux | grep java 2.查看系统与内核相关信息 #uname [-asrmpi] 查看系统位数 # uname -m 3.查看端口 #netstat [-aatunl ...

  7. 递推DP UVA 607 Scheduling Lectures

    题目传送门 题意:教授给学生上课,有n个主题,每个主题有ti时间,上课有两个限制:1. 每个主题只能在一节课内讲完,不能分开在多节课:2. 必须按主题顺序讲,不能打乱.一节课L时间,如果提前下课了,按 ...

  8. DB2:在缓冲池 "1" 中当前没有任何页面可用。. SQLCODE=-1218, SQLSTATE=57011, DRIVER=3.61.75

    服务器端DB2数据库最近频繁报错: 在缓冲池 , SQLSTATE=, DRIVER= 试验发现简单的查询SQL执行没有问题,复杂的SQL就会报上述错误. 百度发现是因为数据库bufferpool太小 ...

  9. 转-MySQL for Mac 安装和基本操作

    一.安装mysql 1.mysql下载地址:http://dev.mysql.com/downloads/mysql/ 2.安装软件包位于硬盘映象(.dmg)文件中,必须首先双击搜索起中的图标来安装该 ...

  10. 转 SQLPLUS中SQL换行执行

    权声明:本文为博主原创文章,未经博主允许不得转载. 正常情况下,在SQLPLUS中输入命令时,可以换行,但不能有空格,否则不能执行,会直接返回到SQL>下.但通过命令设置可以实现语句换行时允许有 ...