图像目标检测与分割——CaffeModel的使用

最近的数字图像处理课程项目的课题是“图像的目标检测与分割”,我选择使用Faster R-CNN实现目标检测,使用FCN实现目标分割。
虽然前面Caffe已经编译成功,但是由于依赖库和Caffe版本的问题,在使用CaffeModel的时候,仍然遇到很多问题,特此记录。

pycthon接口问题

下载好模型后,运行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

目标检测(Faster R-CNN)

{% githubCard user:rbgirshick repo:py-faster-rcnn %}

Clone

# Make sure to clone with --recursive
git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git

编译Cython

cd $FRCN_ROOT/lib
make

Cython是一个快速生成Python扩展模块的工具,从语法层面上来讲是Python语法和C语言语法的混血,当Python性能遇到瓶颈时,Cython直接将C的原生速度植入Python程序,这样使Python程序无需使用C重写,能快速整合原有的Python程序,这样使得开发效率和执行效率都有很大的提高,而这些中间的部分,都是Cython帮我们做了。参考Cython的简单使用

编译Caffe和pycaffe

该模型内置了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(this->phase_);删掉。

最后参考之前编译过程Deepin(Linux)下安装caffe。

或者使用Microsoft/caffe

cd $RFCN_ROOT
git clone https://github.com/Microsoft/caffe.git

下载Model

cd $FRCN_ROOT
./data/scripts/fetch_faster_rcnn_models.sh

运行demo

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)

目标分割(FCN)

{% 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

编译Caffe和pycaffe

按照 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

效果

你可能感兴趣的:(caffe,deep-learning)