Faster R-CNN Github源码 tensorflow GPU下demo运行,训练,测试,验证,可视化。

Faster R-CNN源码:https://github.com/endernewton/tf-faster-rcnn

该源码是我试过几个后才成功的一个,不过按教程编译该源码过程同样遇到不少问题,但我都还没放弃,所以你也一样坚持看下去,一一击破。

一、环境要求(CPU运行请参考该教程:https://blog.csdn.net/sinat_33486980/article/details/81045315

系统: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会遇到到很多问题。

二、简单运行demo

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:

三、使用预先训练的Resnet101模型进行测试(其实就是评价模型的mAP指数)

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

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值