Caffe学习系列——5使用R-CNN进行目标检测

Contents

  1. 1. 1.安装matlab
  2. 2. 2. caffe下matcaffe配置
  3. 3. 3.下载Selective Search文件
  4. 4. 4.运行R_CNN例子

RCNN是一个比较经典的目标检测算法,由此后续衍生出的一系列fast-rcnn、faster-rcnn都对目标检测产生了很大的影响。对于RCNN、Fast-RCNN、Faster-RCNN的介绍请看我的这篇博文()
本文主要介绍如何使用caffe实现RCNN目标检测,这也是caffe文档中Notebook Examples的倒数第二个例子,链接在此: http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/detection.ipynb在这个例子,预训练模型是基于Imagnet数据集的,并在ILSVRC13上进行了微调。一共有200个类。需要注意的是:本例中一个原始数据对应的所有SVM分类的得分是没有概率校准和类间比较的。并且使用现成的模型只是为了简便,并不是完整的R-CNN模型。
首先,我们需要做一些准备工作:

1.安装matlab

本文安装的MATLAB014a,下载地址:http://pan.baidu.com/s/1o6qKdxo#path=%252Fmatlab
解压缩包,创建新的文件夹,将matlab挂载到linux上

1
2
sudo mkdir MATHWORKS_R2014A
sudo mount -o loop MATHWORKS_R2014A.iso MATHWORKS_R2014A

进入目录,开始安装
cd MATHWORKS_R2014A
./install
安装过程中使用readme.txt中的序列号
安装完成后使用crack下的 license进行激活
将crack文件夹下的libmwservices.so copy到 /usr/local/MATLAB/R2014A/bin/glnxa64
完成安装,命令行下使用sudo matlab即可启动使用
假如你的linux版本是没有桌面型的,则需要提前写好安装过程中需要输入的值,然后再安装,否则安装过程会报错。
创建etc目录并将配置文件拷贝到etc中

1
2
3
4
5
sudo mkdir -p etc
sudo cp MATHWORKS_R2014A /installer_input.txt etc/
sudo cp MATHWORKS_R2014A /activate.ini etc/
chmod +w /usr/local/matlab/etc/installer_input.txt
chmod +w /usr/local/matlab/etc/activate.ini

编辑installer_input.txt文件,按如下内容设置配置项

1
2
3
4
5
6
7
destinationFolder=/home/linbiyuan/MATLAB/R2014a #安装目录
fileInstallationKey= 12345-67890-12345-67890#序列号,似乎可以随便写
agreeToLicense=yes #同意协议
outputFile=/home/linbiyuan/log/mathworks_lby.log#安装日志
mode=silent #开启无人值守安装
activationPropertiesFile=/home/linbiyuan/matlab/etc/activate.ini#激活文件
licensePath= /home/linbiyuan/mymatlab/Crack/license_405329_R2014a.lic#license文件

编辑activate.ini文件,按如下内容设置

1
2
3
isSilent=true #开启silent模式
activateCommand=activateOffline #设置激活方式, 离线激活 无需联网
licenseFile=/home/linbiyuan/matlab/etc/license_405329_R2014a.lic#license文件位置

安装命令:

1
sudo MATHWORKS_R2014A /install -inputFile etc/installer_input.txt

激活:

1
sudo 2014a/bin/activate_matlab.sh -propertiesFile etc/activate.ini

添加matlab安装路径,sudo gedit ~/.bashrc, 在文本最后添加:
export PATH=”/home/linbiyuan/matlab/R2014a/bin”:$PATH
记住修改完要source ~/.bashrc一下
否则运行时会出现:OSError: [Errno 2] No such file or directory错误

2. caffe下matcaffe配置

这里要说明的是,caffe中matlab只支持gcc4.7,但是ubuntu14.04默认安装的是4.8. 因此,需要安装gcc4.7,并给gcc降级
安装gcc4.7、g++4.7
sudoapt-getinstallgcc-4.7 g++-4.7 g++-4.7-multilibgcc-4.7-multilib
在终端执行以下系统gcc降级命令:

1
2
3
4
5
6
7
8
9
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 40
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 60
update-alternatives --config g++
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.7 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
sudo update-alternatives--install /usr/bin/cpp cpp- bin/usr/bin/cpp-4.7 100
sudo update-alternatives --install /usr/bin/cpp cpp- bin/usr/bin/cpp-4.8 50

验证gcc-4.7是否安装并成为系统的默认版本:
gcc-v
安装完成后需要修改Makefile.config里面matlab的路径:(matlab安装路径),并取消注释。
保存然后重新编译caffe:
sudo make clean
make all
make test
make runtest
make matcaffe
make pycaffe

3.下载Selective Search文件

下载地址:https://github.com/sergeyk/selective_search_ijcv_with_python,用于检测候选框,关于Selective Search的算法介绍,参考:http://koen.me/research/selectivesearch/,下载完成后,解压,在matlab下运行demo.m, 进入demo.m 的目录,运行matlab,然后再输入 run demo 。无报错信息关闭即可,
需要注意的是,如果这个文件不在$CAFFE-ROOT/python目录下,需要将其添加到PYTHONPATH路径中,我的是:
export export PYTHONPATH=/home/linbiyuan/caffe/python/selective_search_ijcv_with_python-master/:/home/linbiyuan/caffe/python:$PYTHONPATH(按自己的情况添加)
这里推荐一个便捷且不容易报错的方法,就是使用git clone来下载,这样caffe可以自己找到这个文件,不需要配置。命令如下

1
2
cd  caffe/python/caffe
git clone git@github.com:sergeyk/selective_search_ijcv_with_python.git

运行 python selective_search.py看看是否有报错,一般来说,前面都配置好的话,不会出什么问题

4.运行R_CNN例子

1. 创建临时目录,导入检测样本

1
2
3
cd $Caffe_Root/examples
mkdir -p _temp
echo `pwd`/images/fish-bike.jpg > _temp/det_input.txt

2. 运行 selective_search提取候选框,调用Caffe进行分类预测。运行GPU模式

1
../python/detect.py --crop_mode=selective_search --pretrained_model=../models/bvlc_reference_rcnn_ilsvrc13/bvlc_reference_rcnn_ilsvrc13.caffemodel --model_def=../models/bvlc_reference_rcnn_ilsvrc13/deploy.prototxt --gpu --raw_scale=255 _temp/det_input.txt _temp/det_output.h5

3. 查看结果
检测得分存放在~/_temp/det_outpu.h5文件中,使用python代码查看结果

1
2
3
4
5
6
7
import numpy as np  
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_hdf('_temp/det_output.h5', 'df')
print(df.shape)
print(df.iloc[0])

输出:

1
2
3
4
5
6
7
(1570, 5)  
prediction [-2.62247, -2.84579, -2.85122, -3.20838, -1.94...
ymin 79.846
xmin 9.62
ymax 246.31
xmax 339.624
Name: /home/sindyz/caffe-master/examples/images/fish-bike.jpg, dtype: object

加载ILSVRC13的检测类别名称, 可通过./data/ilsvrc12/get_ilsvrc12_aux.sh获取数据

1
2
3
4
5
6
7
8
9
10
with open('../data/ilsvrc12/det_synset_words.txt') as f:  
labels_df = pd.DataFrame([
{
'synset_id': l.strip().split(' ')[0],
'name': ' '.join(l.strip().split(' ')[1:]).split(',')[0]
}
for l in f.readlines()
])
labels_df.sort('synset_id')
predictions_df = pd.DataFrame(np.vstack(df.prediction.values), columns=labels_df['name'])

取得分最大值,并输出

1
2
3
max_s = predictions_df.max(0)  
max_s.sort(ascending=False)
print(max_s[:10])

得到结果

1
2
3
4
5
6
7
8
9
10
11
12
name  
person 1.835771
bicycle 0.866109
unicycle 0.057079
motorcycle -0.006122
banjo -0.028208
turtle -0.189833
electric fan -0.206787
cart -0.214237
lizard -0.393519
helmet -0.477942
dtype: float32

检测结果最高的是人和自行车,检测还需要定位,于是,选择得分最高的人和自行车来定位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
i = predictions_df['person'].argmax()  
j = predictions_df['bicycle'].argmax()
# Show top predictions for top detection.
f = pd.Series(df['prediction'].iloc[i], index=labels_df['name'])
print('Top detection:')
print(f.order(ascending=False)[:5])
print('')
# Show top predictions for second-best detection.
f = pd.Series(df['prediction'].iloc[j], index=labels_df['name'])
print('Second-best detection:')
print(f.order(ascending=False)[:5])

# Show top detection in red, second-best top detection in blue.
im = plt.imread('examples/images/fish-bike.jpg')
plt.imshow(im)
currentAxis = plt.gca()

det = df.iloc[i]
coords = (det['xmin'], det['ymin']), det['xmax'] - det['xmin'], det['ymax'] - det['ymin']
currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor='r', linewidth=5))

det = df.iloc[j]
coords = (det['xmin'], det['ymin']), det['xmax'] - det['xmin'], det['ymax'] - det['ymin']
currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor='b', linewidth=5))

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Top detection:  
name
person 1.835771
swimming trunks -1.150371
rubber eraser -1.231106
turtle -1.266037
plastic bag -1.303266
dtype: float32

Second-best detection:
name
bicycle 0.866109
unicycle -0.359140
scorpion -0.811621
lobster -0.982891
lamp -1.096809
dtype: float32