1. 程式人生 > >caffe初步實踐---------使用訓練好的模型完成語義分割任務(使用vocfcn32)

caffe初步實踐---------使用訓練好的模型完成語義分割任務(使用vocfcn32)

利用caffe框架對已經訓練好的模型進行語義分割時要先保證caffe已經安裝配置好,本文的caffe環境是建立在ubuntu 16.04的環境下的,以下是caffe安裝的參考連結:

(一)環境準備

本人電腦是暗影精靈二代pro    GTX1050   的顯示卡。

首先請讀者再回過頭去看《Ubuntu16.04安裝配置Caffe》( http://www.cnblogs.com/xuanxufeng/p/6150593.html  )

在這篇博文的結尾,我們再增加編譯Python介面,而這部分內容請參考別人的博文《Ubuntu14.04搭建Caffe(僅cpu)》 http://www.cnblogs.com/xuanxufeng/p/6016945.html ,這篇文章從編譯Python介面部分看就好了。

(二)下載模型

專案檔案結構很清晰,如果想train自己的model,只需要修改一些檔案路徑設定即可,這裡我們應用已經train好的model來測試一下自己的圖片:

我們下載voc-fcn32s,voc-fcn16s以及voc-fcn8s的caffemodel(根據提供好的caffemodel-url),fcn-16s和fcn32s都是缺少deploy.prototxt的,我們根據train.prototxt稍加修改即可。注意,這裡的caffemode-url其實在各個模型的資料夾下面都已經提供給我們了,請讀者細心找一找,看看是不是每一個資料夾下面都有一個caffemode-url的檔案?開啟裡面會有模型的下載地址!

(三)修改infer.py檔案

  • caffe path的加入,由於FCN程式碼和caffe程式碼是獨立的資料夾,因此,須將caffe的Python介面加入到path中去。這裡有兩種方案,一種是在所有程式碼中出現import caffe 之前,加入:
1 import sys
2 sys.path.append('caffe根目錄/python') #路徑是自己下載的caffe的配置路徑

例如:我自己的路徑是/home/bml/bml/FCN/python(此處的FCN是caffe-master的複製版更名以後的,和caffe-master一樣的功能,經過編譯,可以使用)

  • 另一種一勞永逸的方法是:在終端或者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()

複製程式碼

執行結束後會在軟體的根目錄下生成一個分割好的圖片test.png!

我們可以看一下原始圖片和最後生成的圖片的區別:

可能會遇到的問題:

(1)no display name and no $DISPLAY environment variable

其實,在Ubuntu虛擬終端裡執行python infer.py是沒有任何錯誤的,但是我是通過遠端訪問連線伺服器的方式執行程式的。所以在執行到最後的時候會報這個錯。不過不要害怕,

在stackoverflow中找到了終極解決辦法:

如圖中所示的步驟,找到matplotlibrc,將backend從tkAGG修改為AGG。

sudo gedit /home/xuanxufeng/.local/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc

再次在putty中執行就沒有任何問題了!

(2)在執行python infer.py時可能會提示缺少某一兩個模組。

  這個不用擔心,都是小問題,百度很容易搜到,一兩個命令安裝就好了~

(四) 結束語

從開始讀論文到現在,也算是前進了一小步,可以看見的一小步。在往後,隨著實驗的一步步進行,我還會再更新模型的訓練以及訓練資料集的製作!請各位看官耐心等待!