最近的数字图像处理课程项目的课题是“图像的目标检测与分割”,我选择使用Faster R-CNN
实现目标检测,使用FCN
实现目标分割。
虽然前面Caffe已经编译成功,但是由于依赖库和Caffe版本的问题,在使用CaffeModel的时候,仍然遇到很多问题,特此记录。
下载好模型后,运行python脚本,会有如下报错
Boost.Python.ArgumentError: Python argument types in
Net.__init__(Net, str, str, int)
did not match C++ signature:
__init__(boost::python::api::object, std::string, std::string, int)
__init__(boost::python::api::object, std::string network_file, int phase, int level=0, boost::python::api::object stages=None, boost::python::api::object weights=None)
根据BVLC/caffe/issues/#3220,应该是python和c++的string转换问题,可能是boost
版本问题。
解决方法是在$CAFFE_ROOT/python/caffe/_caffe.cpp
中修改
shared_ptr > Net_Init( string param_file, int phase) ...
shared_ptr > Net_Init( string param_file, string pretrained_param_file, int phase) ...
为
shared_ptr > Net_Init( char * param_file, int phase) ...
shared_ptr > Net_Init( char * param_file, char * pretrained_param_file, int phase) ...
最后再运行make pycaffe
编译python接口。
caffe版本不同,可能变量名有变化,主要是将
string
改为char
{% githubCard user:rbgirshick repo:py-faster-rcnn %}
# Make sure to clone with --recursive
git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
cd $FRCN_ROOT/lib
make
Cython是一个快速生成Python扩展模块的工具,从语法层面上来讲是Python语法和C语言语法的混血,当Python性能遇到瓶颈时,Cython直接将C的原生速度植入Python程序,这样使Python程序无需使用C重写,能快速整合原有的Python程序,这样使得开发效率和执行效率都有很大的提高,而这些中间的部分,都是Cython帮我们做了。参考Cython的简单使用
该模型内置了Caffe由于,clone下来的Model使用的Caffe版本较老(CUDNNv4),而我们使用的较新的版本(CUDNNv5),需要做以下操作
cd caffe-fast-rcnn
git remote add caffe https://github.com/BVLC/caffe.git
git fetch caffe
git merge -X theirs caffe/master
然后将include/caffe/layers/python_layer.hpp
中的self_.attr("phase") = static_cast
删掉。
最后参考之前编译过程Deepin(Linux)下安装caffe。
或者使用Microsoft/caffe
cd $RFCN_ROOT
git clone https://github.com/Microsoft/caffe.git
cd $FRCN_ROOT
./data/scripts/fetch_faster_rcnn_models.sh
cd $FRCN_ROOT
optirun ./tools/demo.py
由于该模型识别速度约为每张0.3s,实时效果比较差,帧数较低。修改demo
脚本
# Warmup on a dummy image
im = 128 * np.ones((300, 500, 3), dtype=np.uint8)
for i in xrange(2):
_, _= im_detect(net, im)
im_names = ['test.jpg']
for im_name in im_names:
print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
print 'Demo for data/demo/{}'.format(im_name)
demo(net, im_name)
plt.show()
为
# Load Video File
videoFilePath = 0
videoFile = cv2.VideoCapture(videoFilePath)
while True:
ret, image = videoFile.read()
demo_video(net,image)
{% githubCard user:shelhamer repo:fcn.berkeleyvision.org %}
参考caffe初步实践———使用训练好的模型完成语义分割任务
git clone https://github.com/shelhamer/fcn.berkeleyvision.org
这里提供了很多模型,我们选择voc-fcn8s
,通过caffemodel-url
下载模型,在$RFCN_ROOT/voc-fcn8s
wget http://dl.caffe.berkeleyvision.org/fcn8s-heavy-pascal.caffemodel
按照 Deepin(Linux)下安装caffe ,设置caffe全局路径即可。
按照自己选择修改infer.py为im = Image.open('voc-fcn8s/test.jpeg')
(测试图片路径)和net = caffe.Net('voc-fcn8s/deploy.prototxt', 'voc-fcn8s/fcn8s-heavy-pascal.caffemodel', caffe.TEST)
(选择的model)
optirun infer.py