Faster R-CNN源码:https://github.com/endernewton/tf-faster-rcnn
该源码是我试过几个后才成功的一个,不过按教程编译该源码过程同样遇到不少问题,但我都还没放弃,所以你也一样坚持看下去,一一击破。
系统:Ubuntu18.04
Python:3.6(最好是在Anaconda虚拟环境下,其他版本也可以,不过没试过)
GPU配置: GTX 1060
Tensorflow环境配置:CUDN9.0 + CUDNN7.0.5(安装参考此教程)tensorflow-gpu 1.7.0 用pip安装得到,用的不是源码安装。
我试过tensorflow1.2.1不行,升级到tensorflow1.12.0版本太高,与CUDN不兼容,然后又降到1.7.0。用指令重装:
python -m pip install tensorflow-gpu==1.7.0
总之很折腾,啰嗦几句:tensorflow安装必须注意,安装tensorflow的时候一定要确认好要安装的版本与CUDN和CUDNN是兼容,不然源码编译tensorflow会遇到到很多问题。
1.下载Github代码和数据
git clone https://github.com/endernewton/tf-faster-rcnn.git
此时home目录下出现一个tf-faster-rcnn文件夹,即为所下载的代码和数据。
2.设置GPU配置
在/tf-faster-rcnn/lib文件夹下有个setup.py文件,里面设置CPU和GPU的参数。如图所示
打开setup.dy文件,修改:
extra_compile_args={'gcc': ["-Wno-unused-function"],
'nvcc': ['-arch=sm_61',
'--ptxas-options=-v',
'-c',
'--compiler-options',
"'-fPIC'"]},
include_dirs = [numpy_include, CUDA['include']]
这段代码中第二行“-arch=sm_61”的值,我的GPU为GTX1060,所以修改为sm_61。其他类型GPU,根据下图选择修改:
3.到tf-faster-rcnn/lib下编译Cython 模块
make clean
make
cd ..
4.安装 Python COCO API,这是为了使用COCO数据库
cd data
git clone https://github.com/pdollar/coco.git
cd coco/PythonAPI
make
cd ../../..
5.下载预训练模型
./data/scripts/fetch_faster_rcnn_models.sh
有几百M大小,下载速度慢。提供以下网盘下载:谷歌网盘,百度网盘,下载的预训练模型为:voc_0712_80k-110k.tgz。
下载之后放到 data文件夹中就行。
使用命令 :tar
xvf voc_0712_80k-110k.tgz
解压得到voc_2007_trainval+voc_2012_trainval文件夹
6.创建文件夹和软链接以使用预先训练的模型
data目录下运行如下命令:
NET=res101
TRAIN_IMDB=voc_2007_trainval+voc_2012_trainval
mkdir -p output/${NET}/${TRAIN_IMDB}
cd output/${NET}/${TRAIN_IMDB}
ln -s ../../../voc_2007_trainval+voc_2012_trainval ./default
cd ../../..
原博客第五行是:ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default,其实是不对的。
7.演示用于测试自定义图像
GPU_ID=0
CUDA_VISIBLE_DEVICES=${GPU_ID} ./tools/demo.py
测试的图片在/tf-faster-rcnn/data/demo文件里
你也可以修改demo.py文件读取检测图片段代码,将需要检测的图片放在demo文件夹里。
im_names = ['000456.jpg', '000542.jpg', '001150.jpg',
'001763.jpg', '004545.jpg']
以下是我用到自己的图片检测到的效果图:
问题1:当运行demo的时候出现找不到下载的预训练模型,打开demo.py文件,修改自己的文件夹位置:
tfmodel = os.path.join('/home/fa/tf-faster-rcnn/data/output', demonet, DATASETS[dataset][0], 'default',
NETS[demonet][0])
问题2:
1.下载训练、验证、测试数据和VOCdevkit
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
2.将所有这些tars解压缩到一个名为VOCdevkit的目录中
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar
3.它应该具有这种基本结构
$VOCdevkit/ # development kit
$VOCdevkit/VOCcode/ # VOC utility code
$VOCdevkit/VOC2007 # image sets, annotations, etc.
# ... and several other directories ...
4.为PASCAL VOC数据集创建符号链接
cd $tf-faster-rcnn/data
ln -s $VOCdevkit VOCdevkit2007
5.使用预先训练的Resnet101模型进行测试
GPU_ID=0
./experiments/scripts/test_faster_rcnn.sh $GPU_ID pascal_voc_0712 res101
6.结果
mAP=0.7971 还是很不错的。
问题1:没找到.....预训练的模型(具体问题忘记了)
打开/home/fa/tf-faster-rcnn/experiments/scripts里的test_faster_rcnn.sh,按提示修改模型导入路径。
问题2:recs = pickle.load(f) EOFError: Ran out of input
打开lib/datasets/voc_eval.py文件,增加一行判断代码:if os.path.getsize(cachefile) > 0:
else:
# load
if os.path.getsize(cachefile) > 0:
with open(cachefile, 'rb') as f:
try:
recs = pickle.load(f)
except:
recs = pickle.load(f, encoding='bytes')
问题3:local variable recs referenced before assignment 文件voc_eval.py中的recs参数,未定义但是用了。
打开lib/datasets/voc_eval.py文件,对应增加一行:recs = {},如位置下所示
recs = {}
if not os.path.isfile(cachefile):
# load annotations
recs = {}
for i, imagename in enumerate(imagenames):
recs[imagename] = parse_rec(annopath.format(imagename))
if i % 100 == 0:
print('Reading annotation for {:d}/{:d}'.format(
i + 1, len(imagenames)))
问题参考链接:https://stackoverflow.com/questions/24791987/why-do-i-get-pickle-eoferror-ran-out-of-input-reading-an-empty-file
问题4:如下错误描述
File "/home/fa/tf-faster-rcnn/tools/../lib/datasets/voc_eval.py",
line 137, in voc_eval R = [obj for obj in recs[imagename] if obj['name'] == classname]
KeyError: '000001'
删除 rm data / VOCdevkit2007 / annotations_cache / annots.pkl,并再次运行程序。
您还应该删除roidb缓存:rm data / cache / voc_2007_trainval_gt_roidb.pkl
删除test.txt_annots.pkl
文件。
其次,修改 /home/.../faster_rcnn_pytorch/faster_rcnn/datasets/voc_eval.py,修改段代码如下:
obj_struct['bbox'] = [int(float(bbox.find('xmin').text)),
int(float(bbox.find('ymin').text)),
int(float(bbox.find('xmax').text)),
int(float(bbox.find('ymax').text))]
四、训练自己的模型
1、下载预先训练的模型和权重参数。目前的代码支持VGG16和Resnet V1型号。预先训练的模型由slim提供,您可以在此处获取预先训练的模型并将它们设置在data / imagenet_weights文件夹中。例如对于VGG16型号,您可以设置如下:
mkdir -p data/imagenet_weights
cd data/imagenet_weights
wget -v http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz
tar -xzvf vgg_16_2016_08_28.tar.gz
mv vgg_16.ckpt vgg16.ckpt
cd ../..
对于Resnet101,您可以设置如下:
mkdir -p data/imagenet_weights
cd data/imagenet_weights
wget -v http://download.tensorflow.org/models/resnet_v1_101_2016_08_28.tar.gz
tar -xzvf resnet_v1_101_2016_08_28.tar.gz
mv resnet_v1_101.ckpt res101.ckpt
cd ../..
2、训练
./experiments/scripts/train_faster_rcnn.sh [GPU_ID] [DATASET] [NET]
# GPU_ID is the GPU you want to test on
# NET in {vgg16, res50, res101, res152} is the network arch to use
# DATASET {pascal_voc, pascal_voc_0712, coco} is defined in train_faster_rcnn.sh
# Examples:
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
./experiments/scripts/train_faster_rcnn.sh 1 coco res101
训练过程(./experiments/scripts/train_faster_rcnn.sh 1 pascal_voc res101):
3、使用Tensorboard进行可视化
tensorboard --logdir=tensorboard/vgg16/voc_2007_trainval/ --port=7001 &
tensorboard --logdir=tensorboard/vgg16/coco_2014_train+coco_2014_valminusminival/ --port=7002 &
4、测试和验证
./experiments/scripts/test_faster_rcnn.sh [GPU_ID] [DATASET] [NET]
# GPU_ID is the GPU you want to test on
# NET in {vgg16, res50, res101, res152} is the network arch to use
# DATASET {pascal_voc, pascal_voc_0712, coco} is defined in test_faster_rcnn.sh
# Examples:
./experiments/scripts/test_faster_rcnn.sh 0 pascal_voc vgg16
./experiments/scripts/test_faster_rcnn.sh 1 coco res101
5、您可以使用tools / reval.sh进行重新评估
默认情况下,训练有素的网络保存在:
output/[NET]/[DATASET]/default/
测试输出保存在:
output/[NET]/[DATASET]/default/[SNAPSHOT]/
训练和验证的Tensorboard信息保存在:
tensorboard/[NET]/[DATASET]/default/
tensorboard/[NET]/[DATASET]/default_val/
未完待续.....
欢迎留言讨论。
参考:
1.https://github.com/mengyingfei/tf-faster-rcnn
2.https://blog.csdn.net/sinat_33486980/article/details/81045315
3.https://www.jianshu.com/p/dda97b547f95