当前位置:   article > 正文

python3+Tensorflow+Faster R-CNN训练自己的数据_faster rcnn 训练可视化 tensorflow

faster rcnn 训练可视化 tensorflow

之前实现过faster,但是因为各种原因,写的技术文档丢了,代码也没了,捶胸痛哭!所以写篇博客记录下。

有些地方用的方法比较粗糙,不过偏方治大病,能用就ok。

文章代码链接:tf-faster-rcnn

系统:Mint 18.2

显卡:Tesla K40m

内存:64G

Python 3.6.5+TensorFlow-gpu 1.2+Cuda 8.0+Cudnn v5.1


一、克隆代码

git clone https://github.com/endernewton/tf-faster-rcnn.git

二、根据你的显卡更改下对应的计算单元。

在tf-faster-rcnn/lib/setup.py的第130行,Tesla K40m对应的是sm_35。在这可以查到每种显卡对应的计算单元


三、编译Cython

仍然在lib路径下,编译Cython模块(确保你已经安装了easydict,如果没有,pip install easydict):

  1. make clean
  2. make
  3. cd ..

四、安装COCO API。

这点按照GitHub的步骤走就ok,没啥错误:

  1. cd data
  2. git clone https://github.com/pdollar/coco.git
  3. cd coco/PythonAPI
  4. make
  5. cd ../../..

五、下载数据:

  1. Download the training, validation, test data and VOCdevkit

    1. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
    2. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
    3. wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
  2. Extract all of these tars into one directory named VOCdevkit

    1. tar xvf VOCtrainval_06-Nov-2007.tar
    2. tar xvf VOCtest_06-Nov-2007.tar
    3. tar xvf VOCdevkit_08-Jun-2007.tar
  3. It should have this basic structure

    1. $VOCdevkit/ # development kit
    2. $VOCdevkit/VOCcode/ # VOC utility code
    3. $VOCdevkit/VOC2007 # image sets, annotations, etc.
    4. # ... and several other directories ...
  4. Create symlinks for the PASCAL VOC dataset

    1. cd $FRCN_ROOT/data
    2. ln -s $VOCdevkit VOCdevkit2007

这里有点小问题,我的软连接似乎不起作用了,于是我直接把VOCdevkit文件夹拷贝到tf-fater-rcnn/data路径下,并重命名为VOCdevkit2007,记得删除那个VOCdevkit的软连接。


六、下载预训练模型

需要翻墙,如果翻不了墙就从网盘里下吧,我存网盘了。链接:预训练模型 密码:8ahl


七、建立预训练模型的软连接

在tf-faster-rcnn目录下建立output文件夹,并使用软连接来使用预训练模型,这里按照步骤走就行,没啥问题:

  1. NET=res101
  2. TRAIN_IMDB=voc_2007_trainval+voc_2012_trainval
  3. mkdir -p output/${NET}/${TRAIN_IMDB}
  4. cd output/${NET}/${TRAIN_IMDB}
  5. ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default
  6. cd ../../..

八、对一些图片进行测试。

仍然按步骤走:

  1. GPU_ID=0
  2. CUDA_VISIBLE_DEVICES=${GPU_ID} ./tools/demo.py

九、使用训练好的faster模型对数据进行测试。

这里有点地方需要改:首先把 tf-faster-rcnn/lib/datasets/voc_eval.py的第121行的

with open(cachefile,'w') as f

改成:

with open(cachefile,'wb') as f

同时还要把第105行的

  cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile)

改成:

cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile.split("/")[-1].split(".")[0])

然后再按步骤运行就ok了!

  1. GPU_ID=0
  2. ./experiments/scripts/test_faster_rcnn.sh $GPU_ID pascal_voc_0712 res101

测试结果:


十、训练模型

这里按照步骤走可能会链接不上外网,我把权重数据存网盘了。网盘地址:VGG16 密码:45ef

在data目录下创建一个imagenet_weights文件夹,解压权重数据并把解压后的vgg_16.ckpt重命名为vgg16.ckpt,因为后面在调用权重数据的时候名字需要对应的上。

开始训练(这里最后的vgg16就是对应的权重数据,名字要对的上,0是GPU的ID,pascal_voc是训练使用的数据集):

./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16

为了节省时间并排除错误,我把迭代次数只设置了20次,把./experiments/scripts/train_faster_rcnn.sh里的第22行把ITERS=70000改成ITERS=20,同时记得把./experiments/scripts/test_faster_rcnn.sh的ITERS也改成20。

注意:因为我使用的是pascal_voc数据集,所以只需要更改对应数据集的ITERS的就行了,训练和测试的都要改,因为在train_faster_rcnn.sh的末尾会执行test_faster_rcnn.sh。

训练过程的loss:

训练结果:

可以看到,结果都很差,因为就迭代了20轮。


十一、替换自己的数据

在替换数据之前,先介绍一下标注工具,我用的labelImg对数据进行标注的,其界面如下:

具体怎么安装以及用法就不介绍了,GitHub上已经介绍的很详细了。然后介绍一下xml数据格式:

  1. <annotation>
  2. <folder>fire_data</folder>
  3. <filename>000001.jpg</filename> #图像名称
  4. <path>/home/htu/yc/fire_data/000001.jpg</path> #路径
  5. <source>
  6. <database>Unknown</database>
  7. </source>
  8. <size>
  9. <width>450</width> #宽
  10. <height>253</height> #高
  11. <depth>3</depth> #RGB三通道
  12. </size>
  13. <segmented>0</segmented>
  14. <object>
  15. <name>fire</name> #目标名称
  16. <pose>Unspecified</pose>
  17. <truncated>0</truncated>
  18. <difficult>0</difficult>
  19. <bndbox> #BBOX值
  20. <xmin>146</xmin>
  21. <ymin>22</ymin>
  22. <xmax>207</xmax>
  23. <ymax>60</ymax>
  24. </bndbox>
  25. </object>
  26. </annotation>

其中需要说明的是:图像名称一定要命名为000001.jpg,以及xml也要命名为000001.xml格式(事实上如果你对图像名称是六位数字组成的,xml也会自动生成六位数字)。我之前用的是1,2,3,4这样命名,结果运行总是会提示Keyerror:"1"。

一般出现keyerror的原因有两种,一是图像以及xml命名不符合要求,这就需要你重命名;二是标注的object信息有误,什么意思呢?拿我的数据来说,我是对火焰进行标注的,所以label是fire,如果因为操作失误导致fire变成如w或者其他字母,就会提示keyerror。为什么会是w呢?因为标注的快捷键是w,所以有时候会因为粗心把w写到label里。我就犯过这样的错误,这样的错误排除起来很麻烦,还需要再写一段代码,对xml的所有name节点的值进行访问,如果不是你的label,把对应的索引记录下来,手动再修改。

xml数据准备完毕后,需要划分训练验证以及测试集,这里我使用的别人写好的划分代码(读书人的事,怎么能叫偷呢?)Creat_FRCNN_DataSet,是matlab的,下载后更改下VOC2007txt.m中d 路径就能用了。执行结果会按比例对你的数据划分为训练集验证集以及测试集,同时会生成四个txt文档,分别是test.txt,train.txt,trainval.txt,val.txt。

训练验证测试集划分之后,就开始替换自己的数据了(讲了那么多废话终于到正点了,其实主要是怕自己以后忘记了,脑子不太好用了)。

首先,在tf-faster-rcnn/lib/datasets目录下的pascal_voc.py里第36行更改自己的类别,'__background__'切记不可删掉,把后面的原来的20个label换成自己的,不用更改类别数目,也没有地方可以更改。

然后把你的xml文件放置在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations路径下,记得把原来的删掉;同时把你的jpg文件放在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages路径下,xml和jpg替换完了,现在该txt了,把之前matlab生成是四个txt文档放在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Layout 和 tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Main。

在开始训练之前,还需要把之前训练产生的模型以及cache删除掉,分别在tf-faster-rcnn/output/vgg16/voc_2007_trainval/default路径下和tf-faster-rcnn/data/cache路径下,然后就可以开始训练了:

./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16

因为我只训练了20轮,而且因为写博客需要,数据总共就100个,所以效果很差,不过能跑通就行了。

~~Thanks,The Management!

更新于2018年11月7日:

似乎有不少人问测试的时候怎么办,其实在train_faster_rcnn.sh代码的末尾处会有一行执行测试的代码test_faster_rcnn.sh,所以执行train_faster_rcnn.sh就会自动进行测试的。

更新于2019年1月10日:

在介绍生成训练集测试集的txt文件时,之前写错了,写的是执行VOC2007xml.m会生成四个txt文件,实际上执行的是VOC2007txt.m,现已修改。

更新于2019年5月6日:

添加了第二部分每种显卡对应的计算力的链接。

更新于2019年5月23日:

评论中有人提出的一个错误的解决方法,也是被评论的网友 @月里浮假面 解决的。

错误:

  1. Traceback (most recent call last): File "./tools/test_net.py", line 120, in <module> test_net(sess, net, imdb, filename, max_per_image=args.max_per_image)
  2. File "/home/ccy/fasterrcnn/tf-faster-rcnn/tools/../lib/model/test.py", line 192, in test_net imdb.evaluate_detections(all_boxes, output_dir)
  3. File "/home/ccy/fasterrcnn/tf-faster-rcnn/tools/../lib/datasets/pascal_voc.py", line 283, in evaluate_detections self._do_python_eval&#40;output_dir&#41;
  4. File "/home/ccy/fasterrcnn/tf-faster-rcnn/tools/../lib/datasets/pascal_voc.py", line 246, in _do_python_eval use_07_metric=use_07_metric, use_diff=self.config['use_diff'])
  5. File "/home/ccy/fasterrcnn/tf-faster-rcnn/tools/../lib/datasets/voc_eval.py", line 135, in voc_eval R = [obj for obj in recs[imagename] if obj['name'] == classname]
  6. KeyError: '010902' Command exited with non-zero status 1

解决方法:删除data/VOCdekit2007下的annotations_cache文件夹。

训练之前为保险起见,一定要记得清空所有cache文件。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/250055
推荐阅读
相关标签
  

闽ICP备14008679号