您的位置:首页 > 其它

DL学习之 2 —— Faster R-CNN 训练自己的数据集遇到的问题总结

2019-03-06 15:54 561 查看

简介

去年年底用Faster R-CNN 训练自己的数据集,从GitHub上下载代码,到调试通过,训练自己的数据集,前后花了将近一个月的时间。前后经历了,数据库,xml文件建立,图像尺寸,环境配置不同等问题,终于成功运行。

本来写了一个Word版本的总结,但是想到在调试的过程中,从别人公开的经验中学习到很多,因此决定把自己总结的内容公开,希望能给后面入坑的童鞋们一些帮助。(水平有限若有问题欢迎指正~~~)

工作环境:
window7 + python3.5 + cuda + cucnn

问题总结

1. no model named “pycocotools”

问题分析: 缺少配置cocoAPI.

解决办法:
首先打开命令行,转入到指定文件下:

然后输入:

python setup.py install
,运行结束即可。

备注:配置python setup.py文件夹时会用到。必须要知道有关简单的命令行操作的问题。
a. 命令行转移到指定文件夹的位置以及命令行的复制粘贴:
CD C:\Users… (转移到指定文件)
b. 命令行的复制和粘贴方法:
右键 + 粘贴

2.运行完的train.py的模型放置在default文件夹中。

Default 文件是文件中本来没有的,训练完成后会放到default文件夹中

3.文件下载速度慢:data\imagenet_weights\vgg16.ckpt?

解决办法:
文件下载功能应该是在faster r-cnn 源程序中体现的,但是目前我还没有调通代码,没有看到这个文件夹,因此,从网上手动下载了vgg16.ckpt文件。

注意:记得保持命名一致,config.py文件中调用是vgg16,因此下载后的文件需要命名也为vgg16.ckpt.

4.train():跑不出模型的原因分析。

解决办法:
train.py训练得到的模型保存在根目录下的\default\voc_2007_trainval\default文件中,模型训练过程中每5000次迭代保存一次,所以小于5000代是不会出结果的。

所以想要跑 demo.py先训练吧。

参考网址:https://blog.csdn.net/ytusdc/article/details/80255920

5. 运行demo.py文件时出现了absl.flags._exceptions.UnrecognizedFlagError: Unknown command line flag ‘net’. Did you mean: network ?

解决办法:
发现是config.py文件中的参数没有调用到 demo.py中。
from lib.config import config as cfg
没有用到config文件里面的参数
第一种:最后我把cfg中的参数全部用相应的数字代替好了
第二种:我新建了一个.py文件 把demo.py文件复制到里面也好了(采用该方法成功测试程序)

参考网址:https://blog.csdn.net/j497205974/article/details/80074072

6. 安装TensorFlow-GPU以及cuda和cudnn后,测试程序报错:failed to load the native tensorflow runtime

解决方法:

把cudnn/bin/里面的文件从_7.dll 改成了_5.dll。测试通过。但是运行程序不行,需要把cuda cudnn 和TensorFlow的版本也对应上。

参考网址:https://www.geek-share.com/detail/2716451925.html

7. Loaded runtime CuDNN library: 5005 (compatibility version 5000) but source was compiled with 5103 (compatibility version 5100). If using a binary install, upgrade your CuDNN library to match. If building from sources, make sure the library loaded at runtime matches a compatible version specified during compile configuration.

• 原因:
cudnn版本和cuda不兼容
• 解决方法:
官网更新cudnn后,拷贝cuDNN库文件到cuda目录下.
具体的如何选择合适的cudnn,参考网址 https://blog.csdn.net/Invokar/article/details/80145559?utm_source=blogxgwz2 中的方法.

参考网址:https://www.jianshu.com/p/5d5b521c7382

8.如何查看GPU使用情况

解决办法:

下载gpu-Z,然后运行tensorflow一个训练,然后打开gpu-z,看到load等数据百分比,变大就是在用了,

参考网址: https://www.geek-share.com/detail/2723743662.html

9.lib/datasets/imdb.py报错:AssertError

解决办法:

图像太大;Faster-Rcnn本身对于采集的原图像没有要求,但是作为输入放入网络训练的话就必须限制图片的大小,一般Faster-Rcnn对于输入图像的大小限制规则是:限制最小边为600,最大边为1000,对于输入图像优先考虑最大边的限制。代码:./lib/utils/blob.py

参考网址:https://blog.csdn.net/oMoDao1/article/details/82427934

10.AttributeError: ‘NoneType’ object has no attribute ‘text’:

解决办法:

这里面的’difficult’属性,是由于原来的标注文件.xml中是difficult,但是用IMlabel标注出的.xml文件中是Difficult。需要改为Difficult。

参考网址:https://blog.csdn.net/lvsehaiyang1993/article/details/80910104

11.图像标注工具labelimg 标注出的某些图像的.xml文件中,width =0,length =0 , 导致读取图片大小时出错:

解决办法:

调整图片大小(出错的图片有的图片像素大,但有的很小,没有找到统一的特性,但是后来将图像大小归一到512*512后,再标注的.xml文件可以正常显示,不再出现width = 0;length = 0的情况)

参考网址:https://blog.csdn.net/qq_36735489/article/details/80285654(讲的不清楚,不知道具体含义是什么)

12.模型训练出后,如何利用训练好的模型进行测试?

总结:

首先,测试程序为test.py文件,需要测试的图像名称在第159行罗列出,测试图像存放位置为…\data\demo;
Test.py文件中调用的模型位置在…\output\vgg16\voc_2007_trainval+voc_2012_trainval\default文件夹下,若没有该文件夹需要新设置一个文件夹,然后将名称都如此保存;
Test.py文件中调用的模型名称如下所示。在测试模型时,需要将训练好的最终的模型文件copy到该文件夹下,并且更改模型文件名。(训练好的模型最终文件保存在…\default\voc_2007_trainval\default文件夹中)

13.test.py程序报错:InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [84] rhs shape= [8]:

解决办法:

训练的模型参数与测试的参数不匹配,修改完CLASSES的参数后,net.create_architecture中的参数=1+CLASSES中参数个数。

参考网址:https://blog.csdn.net/orangefly0214/article/details/80909755

14.在用tensorflow-cpu对faster rcnn进行训练自己的数据集过程中,train.py出现中意外中止(不是终止),即程序并未报错,但停止训练,出现keep_inds = np.append(fg_inds, bg_inds) (Pdb)?

解决办法:

看到这个博客:https://www.geek-share.com/detail/2733491765.html 有一个解决方案,但是重新标注训练集是个大工程,因此就另寻他法了。(该博客中的建议是,将大的图片10241024等均改为500700左右的图像(已经写了缩小图像的程序,以及批量修改.xml文件的程序))
在这里:https://github.com/endernewton/tf-faster-rcnn/issues/107 找到了一个方案使得训练集成功run起来:在文件夹\lib\datasets\下,将文件pascal_voc.py中的函数:_load_pascal_annotation中的:

x1 = float(bbox.find('xmin').text) - 1
y1 = float(bbox.find('ymin').text) - 1
x2 = float(bbox.find('xmax').text) - 1
y2 = float(bbox.find('ymax').text) - 1

改成:

x1 = float(bbox.find('xmin').text)
y1 = float(bbox.find('ymin').text)
x2 = float(bbox.find('xmax').text)
y2 = float(bbox.find('ymax').text)

还是在文件夹\lib\datasets\下,将文件imdb.py中的函数append_flipped_images中的:

boxes[:, 0] = widths[i] - oldx2 - 1
boxes[:, 2] = widths[i] - oldx1 - 1

改成 :

boxes[:, 0] = widths[i] - oldx2
boxes[:, 2] = widths[i] - oldx1

原因分析:
①bbox的:xmin = 0 or ymin = 0,②bbox的:xmax= width or ymin = height(faster r-cnn源码中的边缘是从1开始的,所以程序中有-1;而自己标注的图像中有一些是在边缘,是从0开始的。)

哈哈,前面说了一堆的内容,又是改程序又是改程序的,但是最后针对我自己的数据库,解决pdb的办法是:清除文件夹中的缓存,__pycache__文件夹。so easy !

参考网址:https://blog.csdn.net/Gerwels_JI/article/details/84258117;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: