首先,我用的工程文件是https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5里的windows下的代码。这个代码在windows我已经调通过。过程中也是遇到windows下安装pycocotools的难题,需要去下载一个windows下的安装文件去安装,我参考了 CSDN博主 行胜于言的博客: windows 安装 pycocotools 方法(windows10编译 Pycocotools出错解决方案最新)
#####################################################################################################
下面这两个链接里面是支持windows的
Clone of COCO API - Dataset @ http://cocodataset.org/ - with changes to support Windows build and python3
下面这个是原版链接 (在windows上安装会出问题,在linux下应该不会。我没在linux下试过用这个安装,因为我貌似直接参考其他CSND博客用pip3或者是apt等方法给安装好了 )
COCO API - Dataset @ http://cocodataset.org/
之前的一种解决方案
windows10编译 Pycocotools出错解决方案(不可取哦)
#####################################################################################################
好了下面进入正题
【Linux_Faster_RCNN_TensorFlow_Python3_5_master 心路历程(踩坑笔记)】
遇到的主要大问题如下:
-
一、【cython_bbox.cpython-35m-x86_64-linux-gnu.so和cython_bbox.so文件。导致程序运行过程中找不到bbox。】
问题原因: windows下,用的是cython_bbox.cp35-win_amd64.pyd文件,而linux下需要重新make一下。
解决办法: 这个需要在linux下,准备好make文件放进lib文件夹,在lib路径make一下。具体步骤参见博客园 静心得文章Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法。
其中我还遇到了meke出错的问题,开始是说文件修改时间和linux系统时间不一致,这个用linux命令将linux时间给更新到最新的当前时间就好。但是还是没有解决,我索性直接搜到了好心人在网上的编译好的cython_bbox.cpython-35m-x86_64-linux-gnu.so文件,拷贝进了utils文件夹里参见基于tensorflow+python3.5环境实现Faster R-CNN 下载cython_bbox.cpython-35m-x86_64-linux-gnu.so 后来我的make又好了,用ls发现自己也make好了一份,只不过直接在文件夹下看不到,需要用ls命令列出来,才能看到这个编译中的文件——后缀名.so文件。
总之,一般make好了,就会生成好cython_bbox.cpython-35m-x86_64-linux-gnu.so和cython_bbox.so文件,之后程序再去运行就不会报没有bbox的问题啦!
如果还是有各种问题,那就还是要求助BING,谷歌,CSDN,stackoverflow等等网站了。。。
博客园 静心的文章,我也搬了过来,以做备份,内容如下:
Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法
目录
- Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法
- 安装过程
- 1. 深度学习环境Tensorflow的安装
- 2. 安装python包
- 3. Go to ./data/coco/PythonAPI
- 4. git clone
- 5. 下载预训练模型
- 6. 自己数据集的制作
- 7. 替换成自己的数据
- 11. 开始训练
- 12. 跑demo.py
Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法
安装过程
1. 深度学习环境Tensorflow的安装
参考这一篇博客:https://www.cnblogs.com/pprp/p/9463974.html
2. 安装python包
cython, python-opencv, easydict,numpy
pip install Cython pip install opencv-python pip install matplotlib
opencv 的包下载安装,安装教程
ImportError: No module named 'PIL'
- solution:
easy_install PIL
&pip install image
ImportError: No module named 'scipy'
solution:
pip install numpy pip install scipy
ImportError: No module named 'lib.utils.cython_bbox'
git clone --recursive https://github.com/rbgirshick/fast-rcnn.git cd $FRCN_ROOT/lib make cp fast-rcnn/lib/utils/cython_bbox.cpython-35m-x86_64-linux-gnu.so Faster-RCNN-TensorFlow-Python3.5/lib/utils/
3. Go to ./data/coco/PythonAPI
Run
python setup.py build_ext --inplace
Run
python setup.py build_ext install
4. git clone
用git命令将这个库下载到本地 Faster-RCNN-TensorFlow-Python3.5
git clone https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5.git # 将cython_bbox.cpython-36m-x86_64-linux-gnu.so下载下来 wget https://github.com/pprp/DL/blob/master/cython_bbox.cpython-36m-x86_64-linux-gnu.so
把Faster-RCNN_TF 中的cython_bbox.xxx.so 复制到 lib/utils
cp cython_bbox.cpython-36m-x86_64-linux-gnu.so Faster-RCNN-TensorFlow-Python3.5/lib/utils
5. 下载预训练模型
Download pre-trained VGG16 from here and place it as "data\imagenet_weights\vgg16.ckpt"
wget http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz unzip vgg* #重命名为vgg16.ckpt cp vgg* vgg16.ckpt #放到以下位置 mv vgg16.ckpt data\imagenet_weights\vgg16.ckpt
6. 自己数据集的制作
xml文件的制作需要labelImg软件的帮助,这里提供在window下的exe包,打开即可使用
wget https://github.com/pprp/DL/blob/master/LabelIMG.zip
- 使用方法:
Ctrl + u 加载目录中的所有图像,鼠标点击Open dir同功能 Ctrl + r 更改默认注释目标目录(xml文件保存的地址) Ctrl + s 保存 Ctrl + d 复制当前标签和矩形框 space 将当前图像标记为已验证 w 创建一个矩形框 d 下一张图片 a 上一张图片 del 删除选定的矩形框 Ctrl++ 放大 Ctrl-- 缩小 ↑→↓← 键盘箭头移动选定的矩形框
数据的放置结构(自己手动建立)
-data - VOCdevkit2007 - VOC2007 - Annotations (标签XML文件,用对应的图片处理工具人工生成的) - ImageSets (生成的方法是用sh或者MATLAB语言生成) - Main - test.txt - trian.txt - trainval.txt - val.txt - JPEGImages(原始文件)
Main中的四个txt文件的制作
详见附件二,注意要修改路径位置,最好是绝对路径
xmlfilepath = 'Annotations' txtsavepath = 'ImageSets\Main'
7. 替换成自己的数据
将制作好的数据按照以上的目录结构进行放置
用你的Annotations,ImagesSets和JPEGImages替换…\Faster-RCNN-TensorFlow-Python3.5\data\VOCdevkit2007\VOC2007中对应文件夹
8. 将原始代码修改为适配你自己的代码
Pascal_VOC.py,修改自己的标注的类别
self._classes = ('__background__', # always index 0 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor')
将这些类别替换成你自己的类别。
self.__classes=('__background__', '你的标签1','你的标签2',你的标签3','你的标签4')
demo.py, 修改为自己的标注类别
CLASSES = ('__background__', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor')
更改为:
CLASSES = ('__background__', '你的标签1','你的标签2',你的标签3','你的标签4')
demo.py 更改另外一处代码:
net.create_architecture(sess, "TEST", 21,tag='default', anchor_scales=[8, 16, 32])
更改为:
net.create_architecture(sess, "TEST", 5,tag='default', anchor_scales=[8, 16, 32])
原本的代码是有20类物体+背景,所以是21。 把类别数改为,你的类别+背景。如果是只检测一类物体,那就改为2
9. 出现的问题
可能出现以下报错:
m = cv2.imread(roidb[i][‘image’]) KeyError
解决:
将Faster-RCNN-TensorFlow-Python3.5-master\data\cache文件夹中之前生成的文件模型删除。
因为会自己读取cache中的文本,导致训练出现错误。
10. 作出的其他调整
具体方案如下:
将demo.py中main函数中进行如下修改:
# ----------------------- # demonet = args.demo_net # dataset = args.dataset # ----------------------- demonet = 'vgg16' dataset = 'pascal_voc' # -----------------------
demo.py中main函数中将im_names中的内容替换成自己的测试图片
im_names = ['IMG_1.jpg', 'IMG_40.jpg', 'IMG_23.jpg', 'IMG_127.jpg', 'IMG_134.jpg', 'IMG_185.jpg']
然后将Faster-RCNN-TensorFlow-Python3.5/data/demo中替换上相应的图片
将NETS,DATASETS进行如下修改
NETS = {'vgg16': ('vgg16.ckpt',)}
DATASETS = {'pascal_voc': ('voc_2007_trainval',)}
可以运行了python demo.py
11. 开始训练
python train.py
12. 跑demo.py
#如果可以直接跑,就直接跑 python demo.py
如果不能运行demo.py,则进行以下处理:
找到通过训练得到的训练结果:路径为:/Faster-RCNN-TensorFlow-Python3.5/default/voc_2007_trainval/default内容如下:
checkpoint vgg16.ckpt.data-00000-of-00001 vgg16.ckpt.index vgg16.ckpt.meta vgg16_faster_rcnn_iter_10000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_10000.ckpt.index vgg16_faster_rcnn_iter_10000.ckpt.meta vgg16_faster_rcnn_iter_10000.pkl vgg16_faster_rcnn_iter_15000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_15000.ckpt.index vgg16_faster_rcnn_iter_15000.ckpt.meta vgg16_faster_rcnn_iter_15000.pkl vgg16_faster_rcnn_iter_20000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_20000.ckpt.index vgg16_faster_rcnn_iter_20000.ckpt.meta vgg16_faster_rcnn_iter_20000.pkl vgg16_faster_rcnn_iter_25000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_25000.ckpt.index vgg16_faster_rcnn_iter_25000.ckpt.meta vgg16_faster_rcnn_iter_25000.pkl vgg16_faster_rcnn_iter_30000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_30000.ckpt.index vgg16_faster_rcnn_iter_30000.ckpt.meta vgg16_faster_rcnn_iter_30000.pkl vgg16_faster_rcnn_iter_35000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_35000.ckpt.index vgg16_faster_rcnn_iter_35000.ckpt.meta vgg16_faster_rcnn_iter_35000.pkl vgg16_faster_rcnn_iter_40000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_40000.ckpt.index vgg16_faster_rcnn_iter_40000.ckpt.meta vgg16_faster_rcnn_iter_40000.pkl vgg16_faster_rcnn_iter_5000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_5000.ckpt.index vgg16_faster_rcnn_iter_5000.ckpt.meta vgg16_faster_rcnn_iter_5000.pkl vgg16.pkl
将其中的
vgg16_faster_rcnn_iter_40000.ckpt.data-00000-of-00001 vgg16_faster_rcnn_iter_40000.ckpt.index vgg16_faster_rcnn_iter_40000.ckpt.meta vgg16_faster_rcnn_iter_40000.pkl
文件复制到以下路径
/Faster-RCNN-TensorFlow-Python3.5/output/vgg16/voc_2007_trainval/default/
并重命名为:vgg16.ckpt.data-00000-of-00001 vgg16.ckpt.index vgg16.ckpt.meta vgg16.pkl
修改完成,再次运行
python demo.py
附件代码:
下面是适用于我本地环境的MATLAB代码
%注意修改下面四个值 xmlfilepath='/home/pprp/github/Faster-RCNN-TensorFlow-Python3.5/data/VOC2007/Annotations'; txtsavepath='/home/pprp/github/Faster-RCNN-TensorFlow-Python3.5/data/VOC2007/ImageSets/Main'; trainval_percent=0.5; #trainval占整个数据集的百分比,剩下部分就是test所占百分比 train_percent=0.5; #train占trainval的百分比,剩下部分就是val所占百分比 xmlfile=dir(xmlfilepath); numOfxml=length(xmlfile)-2;#减去.和.. 总的数据集大小 trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent))); test=sort(setdiff(1:numOfxml,trainval)); trainvalsize=length(trainval); #trainval的大小 train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent)))); val=sort(setdiff(trainval,train)); ftrainval=fopen([txtsavepath 'trainval.txt'],'w'); ftest=fopen([txtsavepath 'test.txt'],'w'); ftrain=fopen([txtsavepath 'train.txt'],'w'); fval=fopen([txtsavepath 'val.txt'],'w'); for i=1:numOfxml if ismember(i,trainval) fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4)); if ismember(i,train) fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4)); else fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4)); end else fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4)); end end fclose(ftrainval); fclose(ftrain); fclose(fval); fclose(ftest);
Python代码:
import os import random trainval_percent = 0.66 train_percent = 0.5 xmlfilepath = 'Annotations' txtsavepath = 'ImageSets\Main' total_xml = os.listdir(xmlfilepath) num=len(total_xml) list=range(num) tv=int(num*trainval_percent) tr=int(tv*train_percent) trainval= random.sample(list,tv) train=random.sample(trainval,tr) ftrainval = open('ImageSets/Main/trainval.txt', 'w') ftest = open('ImageSets/Main/test.txt', 'w') ftrain = open('ImageSets/Main/train.txt', 'w') fval = open('ImageSets/Main/val.txt', 'w') for i in list: name=total_xml[i][:-4]+'\n' if i in trainval: ftrainval.write(name) if i in train: ftrain.write(name) else: fval.write(name) else: ftest.write(name) ftrainval.close() ftrain.close() fval.close() ftest .close()
批量修改图片名称,以及XML名称:
import os import glob import shutil # 目录名称,你要自己修改 _dir = "H:/mypic/" file_name = os.listdir(_dir) print(file_name) n=1 for file in file_name: pic_name = os.listdir(_dir+file) #print(pic_name) for pic in pic_name: if os.path.isdir(_dir+file+'/'+pic): xml_name=os.listdir(_dir+file+"/"+pic) for xml in xml_name: shutil.copy( _dir+file+'/'+pic+"/"+xml, 'G:/data/VOCdevkit2007/VOC2007/Annotations/') # print(pic) #修改个别XML名称 # if xml == '1000010.xml': #print(dir + file + '/' + pic) # os.rename(_dir+file + '/' + pic + '/' + xml, _dir + file + '/' + pic + "/" + "100010.xml") # oldname = _dir+file+'/'+pic+"/"+xml # newname = _dir+file+'/'+pic+"/"+ str(n).zfill(6) + ".xml" #os.rename(oldname, newname) #n = n + 1 # print(oldname, '--->', newname) # zfill是一个自动补零的函数 6 就是一共六位 不足的补零 只有字符串才有这个函数 所以转换了 # newname = _dir+str(xml_name.index(xml)+1).zfill(6)+".xml" """ #批量修改图片的名称 n=1 for file in file_name: pic_name = os.listdir(_dir+file) print(pic_name) for pic in pic_name: oldname = _dir+file+"/"+pic newname = _dir+file+"/" + str(n).zfill(6) + ".jpg" os.rename(oldname, newname) n = n + 1 print(oldname, '--->', newname) # zfill是一个自动补零的函数 6 就是一共六位 不足的补零 只有字符串才有这个函数 所以转换了 # newname = _dir+str(xml_name.index(xml)+1).zfill(6)+".xml" """
修改对应xml文件
import os import re _dir = "G:/Annotations/" xmlList = os.listdir(_dir) n = 1 for xml in xmlList: #f = open(_dir + xml, "r") f = open(_dir + xml, "r", encoding='utf-8') xmldata = f.read() xmldata = re.sub('\
(.*?)\ ', 'G:/data/VOCdevkit2007/VOC2007/JPEGImages/' + str(n).zfill(6) + '.jpg ', xmldata) f.close() f = open(_dir + xml, "w") f.write(xmldata) f.close() n += 1pascal_voc.py的一些解读
def init(self, image_set, year,devkit_path=None) /*这个是初始化函数,它对应着的是pascal_voc的数据集访问格式,其实我们将其接口修改的更简单一点*/ def image_path_at(self, i) /*根据第i个图像样本返回其对应的path,其调用了image_path_from_index(self, index)作为其具体实现*/ def image_path_from_index(self, index) //实现了 image_path的具体功能 def _load_image_set_index(self) //加载了样本的list文件 def _get_default_path(self) //获得数据集地址 def gt_roidb(self) //读取并返回ground_truth(真实值,设定的一个正确的基准)的db def selective_search_roidb //读取并返回ROI的db def _load_selective_search_roidb(self, gt_roidb) //加载预选框的文件 def selective_search_IJCV_roidb(self) //在这里调用读取Ground_truth和ROI db并将db合并 def _load_selective_search_IJCV_roidb(self, gt_roidb) //这里是专门读取作者在IJCV上用的dataset def _load_pascal_annotation(self, index) //这个函数是读取gt的具体实现 def _write_voc_results_file(self, all_boxes) //voc的检测结果写入到文件 def _do_matlab_eval(self, comp_id, output_dir='output') //根据matlab的evluation接口来做结果的分析 def evaluate_detections //其调用了_do_matlab_eval def competition_mode //设置competitoin_mode,加了一些噪点
reference
https://blog.csdn.net/jcli1_14/article/details/81458847
https://blog.csdn.net/hzhj2007/article/details/79399587
代码改变世界
二、【UnrecognizedFlagError:Unknown command line flag 'f'】
这是在jupyter上运行faster-rcnn遇到的错误...在window上的pycharm下是不会报这个错的。由于我用的是超算服务器节点(有TeslaK40显卡,不算很好,不过还凑合了)的linux,上面就只能用jupyter来运行或者在命令行运行。据查是jupyter不支持这样用没定义的flag???我在程序开头写了flag定义(FLAGS = tf.app.flags.FLAGS),也不行。
问题原因: 用到了ims_per_batch这个字符串,却没有在config.py中的FLAG里去定义它。
解决办法: 在此程序开头写
tf.app.flags.DEFINE_string('f', '', 'ims_per_batch')
三、【AssertionError: Path does not exist: /WANGZAI/Faster_RCNN_TensorFlow_Python3_5_master/data/VOCdevkit2007/VOC2007/ImageSets/Main/trainval.txt 】
我用find -name trainval.txt找到了这个路径下是有的,但就是会报路径不存在这个断言,于是细心的再对一遍路径发现:我的文件夹名写错了一个,VOCdevkit2007写成了VOCDevkit2007。实在无语,这个是我在windows上弄好的,没问题不会报错的,到了linux+jupyter就报错。
解决办法: 修改VOCDevkit2007为VOCdevkit2007即可。
最后总结一些Faster-RCNN训练过程中需要用到的参考网址,可能不全。
faster r-cnn(准备阶段)(RPN、Anchor、感受野、region proposal)
python3+Tensorflow+Faster R-CNN训练自己的数据
详细的Faster R-CNN源码解析之RPN源码解析
Linux TensorFlow implementation of Faster R-CNN
博客园首页新随笔联系订阅管理 随笔 - 305 文章 - 0 评论 - 12 Faster-RCNN-TensorFlow-Python3.5 在Ubuntu16.04下的配置方法
基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
实例分割模型Mask R-CNN详解:从R-CNN,Fast R-CNN,Faster R-CNN再到Mask R-CNN
基于tensorflow+python3.5环境实现Faster R-CNN 下载cython_bbox.cpython-35m-x86_64-linux-gnu.so
faster-rcnn tensorflow windows demo测试
faster-rcnn tensorflow windows demo运行
Windows 下 TensorFlow 和 Faster rcnn 详细安装步骤(二)
dBeker Tensorflow Faster R-CNN for Windows by using Python 3.5
windows 安装 pycocotools 方法(windows10编译 Pycocotools出错解决方案最新)
Faster R-CNN / Mask R-CNN on COCO
2018-11-10