FCN网络训练 SIFTFLOW数据集
論文全名:Fully Convolutional Networks for Semantic Segmentation
全卷積神經(jīng)網(wǎng)絡(luò) FCN代碼運行詳解:
運行平臺:
Ubuntu 14.04 + cudnn7
步驟1.代碼準備: 下載新版caffe: ? https://github.com/BVLC/caffe下載fcn代碼: ? ? ?https://github.com/shelhamer/fcn.berkeleyvision.org 將下載后的壓縮包解壓 將解壓后的代碼丟進服務(wù)器
步驟2.編輯caffe和python接口: cd進入caffe所在路徑 以個人路徑示例:/home/my/caffe-master/caffe-master? 在該目錄下,執(zhí)行 cp Makefile.config.example Makefile.configvim Makefile.config(這句代碼根據(jù)自己情況選擇,如果需要修改相關(guān)設(shè)定,就使用這句,需要注意的是,將WITH_PYTHON_LAYER := 1前面的#去掉如果使用cudnn,就把use cudann前面的#去掉我這邊安裝的是openbla,所以我的設(shè)置為BLAS:=open) make all -j8 //8代表線程數(shù)量,可以加快編譯速度 make test -j8 //編譯測試需要的文件 make runtest //開始運行測試例子,這一句貌似有沒有都行以上結(jié)束后開始編譯python接口 在下載的caffe源碼包中,有個叫python的文件夾,cd進入這個文件夾 以我個人路徑為例cd至?/home/wangkun/caffe-master/caffe-master/python 編譯python:
| make pycaffe #測試是否成功 cd caffe-folder/python python import caffe #如果上述命令未報錯,說明成功 #添加caffe/python 到python path變量 vim ~/.bashrc #set the caffe PYTHONPATH export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH |
!如果是采用的Anaconda python,切記編譯python接口在最后執(zhí)行。
!如果是系統(tǒng)自帶的python在make pycaffe可能出現(xiàn)python/caffe/_caffe.hpp:8:31: fatal error: numpy/arrayobject.h: No such file or directory
這是因為64位的python 庫的存放路徑問題。
查找arrayobject.h所在的目錄:
| sudo find / -name arrayobject.h |
然后修改Makefile.config:
| PYTHON_INCLUDE := /usr/include/python2.7 \/usr/lib64/python2.7/site-packages/numpy //這里修改成找到的路徑 |
步驟3.數(shù)據(jù)文件下載 下載siftflow數(shù)據(jù)集:http://www.cs.unc.edu/~jtighe/Papers/ECCV10/siftflow/SiftFlowDataset.zip 并解壓至/fcn.berkeleyvision.org/data/下,并將文件夾名重命名為sift-flow
步驟4.預(yù)訓(xùn)練模型下載: 下載VGG16的預(yù)訓(xùn)練模型并放在FCN源碼文件夾中的ilsvrc-nets文件夾下 https://pan.baidu.com/s/1qYJeFfQ
以個人路徑為例:/home/my/fcn.berkeleyvision.org-master/fcn.berkeleyvision.org-master/ilsvrc-nets
步驟5.為了避免運行程序時候出現(xiàn)no module named caffe 在代碼中包含import caffe的py文件(solve.py)的第一行加入 import sys ?
sys.path.append('/home/my/caffe-master/caffe-master/python')
其中,/home/my/caffe-master/caffe-master/python為你下載的caffe源碼中python文件夾的路徑
步驟6.cd進入fcn源碼路徑 以個人路徑為例:/home/my/fcn.berkeleyvision.org-master/fcn.berkeleyvision.org-master 將其中所有的py文件,例如surgery.py等等,全部復(fù)制到siftflow-fcn32s文件夾中
步驟7.solver.prototxt文件修改 進入siftflow-fcn32s文件夾 打開solver.prototxt 其中snapshot:10000 表示訓(xùn)練10000次保存一次模型 snapshot_prefix:"/home/my/fcn.berkeleyvision.org-master/fcn.berkeleyvision.org-master/siftflow-fcn32s/train"
表示訓(xùn)練得到的模型,也就是model存放的路徑 在此,我附上個人的solver.prototxt供大家參考 [python] view plaincopy
步驟8.solve.py文件修改
在這里鄭重聲明一下:如果訓(xùn)練fcn32s的網(wǎng)絡(luò)模型,
一定要修改solve.py
利用transplant的方式獲取vgg16的網(wǎng)絡(luò)權(quán)重;
具體操作為
[html]?view plaincopy
[html]?view plaincopy
并且在import后添加了
[html]?view plaincopy
http://pan.baidu.com/s/1geLL6Sz
如果訓(xùn)練fcn16s,則可以直接copy自己的fcn32s的model的權(quán)重,不需要transplant,也就是不需要修改solve.py
如果訓(xùn)練fcn8s,則可以直接copy自己的fcn16s的model的權(quán)重,不需要transplant,也就是不需要修改solve.py
只有如此,才能避免loss高居不下的情況步驟9. 以上配置全部結(jié)束,開始進行模型訓(xùn)練 進入siftflow-fcn32s文件夾 執(zhí)行 python solve.py
步驟10.測試單張圖片 在fcn源碼文件夾,找到infer.py 以個人路徑示例:/home/my/fcn.berkeleyvision.org-master/fcn.berkeleyvision.org-master 打開infer.py 在第一行加上 import sys ?
sys.path.append('/home/my/caffe-master/caffe-master/python')
其中/home/my/caffe-master/caffe-master/python為自己所下載的cafe源碼包中的python所在路徑
其中,net = caffe.Net('deploy.prototxt', 'siftflow-fcn32s/train_iter_100000.caffemodel', caffe.TEST) 中,train_iter_100000.caffemodel為訓(xùn)練得到的模型
其中,im = Image.open('test.jpg')為 測試的圖片名,
plt.savefig('test_out.png')為將測試結(jié)果保存為test_output.png
此外? out = net.blobs['score'].data[0].argmax(axis=0)
改成 out = net.blobs['score_sem'].data[0].argmax(axis=0)
我附上個人完整的infer.py的代碼
[python] view plaincopy
.使用infer.py時候遇到no display name and no $DISPLAY environment variable的話 證明服務(wù)器上沒安裝顯卡
不支持plt命令,具體解決方法可以見我的另外一個博客中的問題1,2個解決方法: http://blog.csdn.net/wangkun1340378/article/details/56834642
如果沒有deploy文件,可以參考如下方法:
deploy文件如果沒有 可以參照一下方法
首先,根據(jù)你利用的模型,例如模型是siftflow32s的,那么你就去siftflow32s的文件夾,
里面有train.prototxt文件,將文件打開,全選,復(fù)制,新建一個名為deploy.prototxt文件,粘貼進去,
然后ctrl+F 尋找所有名為loss的layer 只要有l(wèi)oss 無論是loss還是geo_loss 將這個layer統(tǒng)統(tǒng)刪除
然后在文件頂部加上
layer {
? name: "input"
? type: "Input"
? top: "data"
? input_param {
? ? # These dimensions are purely for sake of example;
? ? # see infer.py for how to reshape the net to the given input size.
? ? shape { dim: 1 dim: 3 dim: 256 dim: 256 }
? }
}
其中shape{dim:1 dim:3 dim:256 dim:256}這兩個256,是由于我的測試圖片是256X256 如果你的是500X500 那你就將最后兩個dim改為500 500
需要注意的是 如果你執(zhí)行的是siftflow32s,你沒有deploy,你需要加入inputdata layer,你如果執(zhí)行sififlow16s的model 那么是不需要加inputdata layer的
因為他們的train.prototxt文件里已經(jīng)有了inputdata layer
此外,關(guān)于siftflow-fcn32s需要的deploy文件,我在這里附上一個下載地址,如果不愿意自己制作可以下載這個:
http://pan.baidu.com/s/1dFCHWf3
其中 deploy是fcn32的
deploy16是fcn16的
deploy8是fcn8的
需要額外注意的是 如果使用siftflow數(shù)據(jù)集訓(xùn)練得到的model
在測試時候 也請使用siftflow數(shù)據(jù)集中的img進行test,我以一張voc數(shù)據(jù)集的img利用siftflow數(shù)據(jù)集得到的model示例
可以看到voc的圖像 在利用siftflow數(shù)據(jù)集進行測試的結(jié)果并不好
在siftflow數(shù)據(jù)集中 class.txt文件中是包含person這個類別的 但在這個例子中 仍然無法將person完整分割出來
這是因為 train data中 person類別的多樣性不足 在大家自己制作自己的數(shù)據(jù)集時候
不僅要完整包含自己所需要的類別(class) 在保證數(shù)據(jù)集的數(shù)量足夠大的同時 更要注意每一個class的 多樣性
例如 person的姿勢 多樣性 等等 只有如此 才能使得分割結(jié)果更加完善
fcn只是工具 就像汽車的發(fā)動機?
我們使用fcn 時候 我們的數(shù)據(jù)集就是機油 ?
機油純度高(數(shù)據(jù)集做得好) 汽車跑的就快,跑的遠(分割結(jié)果就好)
在此,fcn的訓(xùn)練已經(jīng)結(jié)束,祝大家順利
如果想下載官方的訓(xùn)練好的model 試試結(jié)果可以在這里下載到
http://dl.caffe.berkeleyvision.org/
以上,FCN的訓(xùn)練和測試全部結(jié)束,這次有個朋友催我做這個,做得比較倉促,如果有問題,歡迎指摘
感謝Zoro_H提供的 利用siftflow訓(xùn)練得到的model 對voc數(shù)據(jù)集中圖片的測試結(jié)果 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的FCN网络训练 SIFTFLOW数据集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FCN网络的训练——以SIFT-Flow
- 下一篇: 主成分变换的实现