先說一下前期准備工作:自己的運行環境是Ubuntu16.04+caffe+CPU(這台電腦沒有GPU)+python
關於python的搭建就不說了,網上隨便一搜,很多參考資源。說一下我配置好caffe之后,編譯python接口時遇到的問題,以及我用到的解決辦法。
比較順利地配置好caffe只后,到了make pycaffe的時候,提示如下錯誤:
后來執行:~/caffe$ locate pyconfig.h
找到頭文件pyconfig.h
下面是一步至關重要的操作:~/caffe$export CPLUS_INCLUDE_PATH=/usr/include/python2.7
就是這一步,我的問題完美解決。看一下編譯成功的場景:
import caffe成功!
接下來就可以跑一下FCN了,由於本台電腦條件有限,直接使用大神已經跑好的模型進行測試,要這台電腦去跑此模型,有點費時。
OK,下面進入測試操作:
作者在github上開源了代碼:Fully Convolutional Networks,我們首先將代碼下載並且解壓到home目錄下。
下載voc-fcn32s,voc-fcn16s以及voc-fcn8s的caffemodel(根據提供好的caffemodel-url),fcn-16s和fcn32s都是缺少deploy.prototxt的,需要根據train.prototxt稍加修改。
后續步驟:
修改infer.py文件:
- caffe path的加入,由於FCN代碼和caffe代碼是獨立的文件夾,因此,須將caffe的Python接口加入到path中去。這里有兩種方案,一種是在所有代碼中出現
import caffe
之前,加入:1 import sys 2 sys.path.append('caffe根目錄/python')
- 另一種一勞永逸的方法是:在終端或者bashrc中將接口加入到
PYTHONPATH
中: export PYTHONPATH=caffe根目錄/python:$PYTHONPATH
本次我們采用后者。
在解壓代碼的根目錄下找到一個文件:infer.py。略微修改infer.py,就可以測試我們自己的圖片了,請大家根據自己實際情況來進行修改。
im = Image.open('voc-fcn8s/test.jpeg') 這里指的是測試圖片路徑!
net = caffe.Net('voc-fcn8s/deploy.prototxt', 'voc-fcn8s/fcn8s-heavy-pascal.caffemodel', caffe.TEST) ,這里指的是voc-fcn8s文件下的部署文件和模型。
注意,fcn下每一個模型其實都對應於一個文件夾,而每個文件夾下應當放着這個模型的caffemodel文件和prototxt文件!
plt.savefig('test.png'),這里指的是最終分割的結果應當放置在哪個路徑下,大家都知道,語義分割的結果應當是一張圖片!
修改完后的infer.py如下所示:
1 import numpy as np 2 from PIL import Image 3 import matplotlib.pyplot as plt 4 import caffe 5 6 # load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe 7 im = Image.open('voc-fcn8s/test.jpeg') 8 in_ = np.array(im, dtype=np.float32) 9 in_ = in_[:,:,::-1] 10 in_ -= np.array((104.00698793,116.66876762,122.67891434)) 11 in_ = in_.transpose((2,0,1)) 12 13 # load net 14 net = caffe.Net('voc-fcn8s/deploy.prototxt', 'voc-fcn8s/fcn8s-heavy-pascal.caffemodel', caffe.TEST) 15 # shape for input (data blob is N x C x H x W), set data 16 net.blobs['data'].reshape(1, *in_.shape) 17 net.blobs['data'].data[...] = in_ 18 # run net and take argmax for prediction 19 net.forward() 20 out = net.blobs['score'].data[0].argmax(axis=0) 21 22 plt.imshow(out,cmap='gray'); 23 plt.axis('off') 24 plt.savefig('test.png') 25 #plt.show()
然后終端運行:python infer.py
運行結束后會在軟件的根目錄下生成一個分割好的圖片test.png!