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
2sudo 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
5sudo 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
7destinationFolder=/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
3isSilent=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
9update-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
2cd 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
3cd $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
7import 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
10with 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
3max_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
12name
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
24i = 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
17Top 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