基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo

2014年是目标检测算法的里程碑,因为那一年R-CNN横空出世,将深度学习-卷积神经网络用在了目标检测领域,标志着目标检测进入了一个新的高度。

目前tensorflow深度学习框架比较火且容易上手,所以想基于tensorflow来看看RCNN到底是怎么实现图片目标检测的。本人洒哥比较穷,电脑还是2013年买的,所以GPU很菜,在深度学习领域没法用GPU来train和Inference,github上的RCNN代码很多都默认是GPU运行,我这里记录一下如何在CPU下运行RCNN代码的demo。

因为RCNN出来之后,Fast RCNN,Faster RCNN相继问世,肯定是越来越牛皮,老的方法将会被摒弃,所以我就直接拿Faster R-CNN来做演示了,但是想提醒一下:R-CNN是核心,后面的都是基于此思想来改进的。

1.本机环境

ubuntu16.04,CPU,tensorflow==1.15.0(不是GPU版本的TF,如下),python3,opencv-python3,cython==0.25.2,easydict

基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo

这里如果编译出现了找不到相应模块,大家pip安装一下就可以了,如:
sudo pip3 install cython==0.25.2
sudo pip3 install easydict

2.下载Faster R-CNN代码

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

3.修改CPU运行配置

lib/setup.py文件中设置CPU和GPU的参数,如图所示:

基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo

因为代码默认是在GPU下运行,如果不设置成CPU模式,后面编译和运行代码时会报错。(要在GPU下运行就很简单了,只需要根据自己GPU的型号来设置-arch一个参数就可了)

1. 修改config.py代码:将USE_GPU_NMS 由原来的True改为False就可以:

基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo

2. 修改 lib/model/nms_wrapper.py文件

按照图中所示,将代码注释,直接禁用掉GPU模式

基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo

2. 修改 lib/setup.py文件

一种需要修改三处地方:
基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo

4. 安装和链接cython 模块

首先安装cython模块:sudo pip3 install cython==0.25.2

然后在lib目录下打开终端,输入

 

make clean

make

cd ..

至此,代码要在CPU下运行的设置已完成。

5.安装 Python COCO API

代码中要用到COCO数据库,也可以手动下载,然后放在/data下即可:

cd data

git clone https://github.com/pdollar/coco.git

cd coco/PythonAPI

make

6.下载预训练好的Model

1. 下载预训练模型

要用到的模型 voc_0712_80k-110k.tgz ,百度网盘: https://pan.baidu.com/share/init?surl=ClcNOWiqOm6nyAdfD3RSsQ ,提取码: 6dz8。下载之后放到 data文件夹中,使用以下命令解压:

tar xvf voc_0712_80k-110k.tgz

解压得到voc_2007_trainval+voc_2012_trainval文件夹,其中包含四个模型文件:

res101_faster_rcnn_iter_110000.ckpt.data-00000-of-00001

res101_faster_rcnn_iter_110000.ckpt.index

res101_faster_rcnn_iter_110000.ckpt.meta

res101_faster_rcnn_iter_110000.pkl

2. 建立预训练模型的软连接

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

建立了模型软链接之后,双击default之后,会出现以下四个文件,说明就成功哦,后面运行demo.py时就会找到model来做推理,不然会提示你找不到:xx.cpkt的

基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo

7. CPU下运行demo

python3 ../tools/demo.py

运行结果为:

基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo

这个demo里面自带5张照片:

基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo

运行后的预测结果为12张图像:

基于Tensorflow的Faster R-CNN在CPU下运行目标检测demo

其实想运行demo还是很简单的:大家先去尝试运行下代码,先比较直观的看到图片检测结果,当十几张图片突然跳出来的时候,心里还是慢开心的,后面再怀着好奇心看看代码是如何实现把图片中的目标给框出来的~,这才是关键

疑问:

  1. 为啥一张图片中有多个目标时,一张图片只检测出来一种,然后同样的图片再检测出来另外一种目标?
  2. 检测出来的结果在哪,如何取出来?最终还是要把(x,y,w,h)发送给下面的决策算法的。
  3. 5张图片检测出来需要30多s,看来一张image的inference大概6s,还是很慢的。