最近使用Fast R-CNN训练了实验室的数据集,期间遇到一些报错,主要还是在配置环境上比较麻烦,但可以根据提示在网上找到解决这些错误的办法。这里我只记录一些难改的报错,以后再遇见这些时希望能尽快解决~

报错汇总:

1、assert (boxes[:, 2] >= boxes[:, 0]).all()

2、targets_dh = np.log(gt_heights / ex_heights)

3、AssertionError: assert (gt_heights > 0).all()

4、ModuleNotFoundError: No module named 'lib.utils.cython_bbox'

解决方法:

报错1:assert (boxes[:, 2] >= boxes[:, 0]).all()

这个错误表示调用append_flipped_images函数时,自己的数据集标注出现矩形越界,导致后面的计算溢出。在尝试了网上说的几种方法无果后,我决定先想办法找到是哪些图片出现问题。需要在lib/datasets/imdb.py文件的assert (boxes[:, 2] >= boxes[:, 0]).all()这句前面加上一行:

print(self.image_index[i])  #打印出图像名

打印出当前正在处理的图像名,运行train.py后报错前最后一个打印的图像名就是出问题的图像啦,打开Annotation中该图像的标注是不是有矩形越界的情况。经查,还真有两个目标的Xmax被标注成了1047。注意每次重新运行前都要删掉./data/cache中的缓存文件。

报错2:targets_dh = np.log(gt_heights / ex_heights)

这个错误尽量不要看网上说的降低learning_rate,降低了学习率很可能只会延迟报错的时间。

折腾好久终于明白,这个错误还是自己的数据集标注出现问题。源码是针对pascal_voc数据集写的,默认数据集没有错误,所以对x和y的标注都没有检查,在上一报错中,我们只检查了图像中对x的标注,所以后面还需对图像中y的标注进行检查。

点击报错的代码,会自动找到lib/datasets/imdb.py文件中targets_dw = np.log(gt_widths / ex_widths)的位置。在其前面加上:

1     print(gt_widths)
2 print(ex_widths)
3 print(gt_heights)
4 print(ex_heights)
5 assert (gt_widths > 0).all()
6 assert (gt_heights > 0).all()
7 assert (ex_widths > 0).all()
8 assert (ex_heights > 0).all()

加上后运行train.py文件,发现运行日志有新的报错3AssertionError: assert (gt_heights > 0).all(),表示height方向数据存在错误,也就是图像中的y,所以应该是y的标注错误。接下来,我们就要对y的标注进行检查。打开imdb.py文件,找到_get-widths函数和append_flipped_images函数所在位置,如下图:

整体替换为下面代码

 1     def _get_widths(self):
2 return [PIL.Image.open(self.image_path_at(i)).size[0]
3 for i in range(self.num_images)]
4 #源码中没有获取图像高度信息的函数,需要补充上
5 def _get_heights(self):
6 return [PIL.Image.open(self.image_path_at(i)).size[1]
7 for i in range(self.num_images)]
8
9 def append_flipped_images(self):
10 num_images = self.num_images
11 widths = self._get_widths()
12 heights = self._get_heights()#add to get image height
13 for i in range(num_images):
14 boxes = self.roidb[i]['boxes'].copy()
15 oldx1 = boxes[:, 0].copy()
16 oldx2 = boxes[:, 2].copy()
17 print(self.image_index[i])
18 assert (boxes[:,1]<=boxes[:,3]).all()#assert that ymin<=ymax
19 assert (boxes[:,1]>=0).all()#assert ymin>=0,for 0-based
20 assert (boxes[:,3]<heights[i]).all()#assert ymax<height[i],for 0-based
21 assert (oldx2<widths[i]).all()#assert xmax<withd[i],for 0-based
22 assert (oldx1>=0).all()#assert xmin>=0, for 0-based
23 assert (oldx2 >= oldx1).all()#assert xmax>=xmin, for 0-based
24 boxes[:, 0] = widths[i] - oldx2 - 1
25 boxes[:, 2] = widths[i] - oldx1 - 1
26 #print ("num_image:%d"%(i))
27 assert (boxes[:, 2] >= boxes[:, 0]).all()
28 entry = {'boxes' : boxes,
29 'gt_overlaps' : self.roidb[i]['gt_overlaps'],
30 'gt_classes' : self.roidb[i]['gt_classes'],
31 'flipped' : True}
32 self.roidb.append(entry)
33 self._image_index = self._image_index * 2

然后运行,当出现中断报错就查看运行日志上最后一个打印出的图像名,找到对应的标注文件检查。改过后记得要删掉./data/cache中的缓存,然后再运行,直到所有图像的y标注错误都修改完后就大功告成啦!

报错4:ModuleNotFoundError: No module named 'lib.utils.cython_bbox'

这个错误可能是因为没有生成训练所需的cython_bbox.py文件,或者已有的cython_bbox.py文件不能在本地正常运行。

解决办法是从cmd中先进入./data/coco/PythonAPI目录,分别运行下面两条命令:

python setup.py build_ext --inplace
python setup.py build_ext install

然后,在cmd中进入./lib/utils目录,运行下面一条命令:

python setup.py build_ext --inplace

这样,就重新运行了setup.py,重新生成了训练所需的文件,报错就解决了。

感悟:直面bug,找到问题源头就更容易解决。

这次内容就分享到这里了,希望与各位老师和小伙伴们交流学习~

Fast R-CNN训练自己的数据集时遇到的报错及解决方案的更多相关文章

  1. 使用Ajax时[object%20object] 报错的解决方案

    踩坑经过 最近初学Ajax,当我想把Ajax应用到自己项目中的时候,没有达到理想的效果,还报了如下错误: 点击图中报错,产生报错页面如下: 当时写的Ajax如下: // 提交修改密码表单 $(&quo ...

  2. List使用Foreach 修改集合时,会报错的解决方案 (Error: Collection was modified; enumeration operation may not execute. ) - 摘自网络

    当用foreach遍历Collection时,如果对Collection有Add或者Remove操作时,会发生以下运行时错误: "Collection was modified; enume ...

  3. MyBatis SQL配置文件中使用#{}取值为null时却不报错的解决方案。

    原因是因为#{kh_id} 这个参数名为小写,我之前写成了大写{#KH_ID}所以取不到值

  4. 解决:eclipse导入android时工程下没有R文件的问题,以及style.xml文件报错

    解决:eclipse导入android时工程下没有R文件的问题,以及style.xml文件报错

  5. soamanager发布的Webservice服务,调用时出现http500报错

    最近再给薪酬那边发布ws服务时出现了报错,调用方反馈了errorCode:BEA-380002.在使用XMLspy工具去调用这个WSDL时候,则反馈http500的错误消息.如下图: 遇到这种问题我通 ...

  6. 当子查询内存在ORDER BY 字句时查询会报错

    问题:当子查询内存在ORDER BY 字句时查询会报错 SQL: SELECT * FROM ( SELECT * FROM USER ORDER BY USER_CORD ) S. 解决办法:在子查 ...

  7. 连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的,

    连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的, 2018-03-12 17:08:52.532DEBUG[localhost-startStop-1]o.s.beans.factor ...

  8. 关于使用CodeFirst,修改类或上下文时操作数据库报错解决方法

    在操作已经创建好的数据库时,若是添加新的实体类或者修改原有数据库上下文,会报如下错误: The model backing the 'StudentDbContext' context has cha ...

  9. nuget包管理nuget服务器发布包时出现请求报错 406 (Not Acceptable)

    在window服务器上部署nuget服务器时,发布包时出现请求报错 406 (Not Acceptable) 验证用户名.密码正确的情况下,还是出现上面错误.后面跟踪服务器日志,发现window\te ...

随机推荐

  1. slowhttptest慢速攻击工具使用详解

    参考文章 浅谈"慢速HTTP攻击Slow HTTP Attack" HTTP慢速攻击 Slowhttptest攻击原理 InstallationAndUsage tag: #slo ...

  2. 阿里云MQ

    阿里云众多中间件服务中有一款非常强大的中间见服务,在企业互联网架构中起到不可替代的作用,相比较开源的RabbitMQ,阿里的消息队列MQ承受的住阿里内部1000+核心应用的使用,每天转几千条消息,稳定 ...

  3. python --装饰器通俗讲解

    装饰器 什么是装饰器?:在不修改源代码和调用方式的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上 Python中的装饰器是你进入Python大门的一道坎; 装饰器特点: 不改变原函数原代码: ...

  4. 杂论-FTP

    FTP 一 简单介绍 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时, ...

  5. vulnhub靶机练习-Os-Hax,详细使用

    Difficulty : Intermediate Flag : boot-root Learing : exploit | web application Security | Privilege ...

  6. Codeforces Global Round 11【ABCD】

    比赛链接:https://codeforces.com/contest/1427 A. Avoiding Zero 题意 将 \(n\) 个数重新排列使得不存在为 \(0\) 的前缀和. 题解 计算正 ...

  7. The 10th Shandong Provincial Collegiate Programming Contest(11/13)

    $$The\ 10th\ Shandong\ Provincial\ Collegiate\ Programming\ Contest$$ \(A.Calandar\) 签到 //#pragma co ...

  8. WPF 之路由事件和附加事件(六)

    一.消息驱动与直接事件模型 ​ 事件的前身是消息(Message).Windows 是消息驱动的系统,运行其上的程序也遵循这个原则.消息的本质就是一条数据,这条消息里面包含着消息的类别,必要的时候还记 ...

  9. 数学知识-欧拉函数&快速幂

    欧拉函数 定义 对于正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目,记作φ(n). 算法思路 既然求解每个数的欧拉函数,都需要知道他的质因子,而不需要个数 因此,我们只需求出他的质因子, ...

  10. 流媒体传输协议之 RTP(下篇)

    本系列文章将整理各个流媒体传输协议,包括 RTP/RTCP,RTMP,希望通过深入梳理协议的设计细节,能够给流媒体领域的开发者带来一定的启发. 作者:逸殊 审核:泰一 接上篇:< 流媒体传输协议 ...