使用FCN做图像语义分割(实践篇)
FCN原理
原理我已經在上篇博客說過,大家可以參考FCN原理篇
代碼
FCN有官方的代碼,具體地址是FCN官方代碼?
不過我用的不是這個代碼,我用的是別人修改官方的版本的代碼,使用Chainer框架實現的,Chainer的源碼鏈接:?
Chainer框架源碼,如果大家使用過Keras的話,應該對它不會感到特別的陌生,Chainer: a neural network framework
好了,我使用的代碼是FCN的Chainer implementation, 具體地址是FCN Chainer implementation
安裝
安裝很簡單,直接pip或者源碼安裝都可以,但是我在我的機器上裝過幾次,發現使用pip的方式最后fcn.data_dir這個變量的值會指向到你系統的python下的dist-packages這個目錄,但是這個目錄需要root權限,所以不推薦使用pip直接安裝的方式; 關于此問題的說明見:?
fcn.data_dir的問題
所以我最后使用的是源碼安裝的方式,這里推薦使用virtualenv工具建立虛擬環境,實踐中發現這是最不會出錯的方式,推薦使用!
clone代碼
git clone?https://github.com/wkentaro/fcn.git?–recursive
使用virtualenv安裝
sudo pip install virtualenv #安裝virtualenv?
創建虛擬目錄?
virtualenv test-fcn?
cd test-fcn?
激活虛擬環境?
source ./bin/activate?
克隆fcn代碼?
git clone?https://github.com/wkentaro/fcn.git?–recursive?
cd fcn?
安裝fcn?
python setup.py develop
demo
下載VOC2012數據集,放入fcn-data-pascal-VOC2012路徑下?
1. 轉換caffe model為Chainer model?
./scripts/caffe_to_chainermodel.py?
2. load model,進行分割?
./scripts/fcn_forward.py –img-files data/pascal/VOC2012/JPEGImages/2007_000129.jpg
訓練自己的數據
這個前后搞了快一個月,才把最終的訓練搞定,其中艱辛很多,在這里寫出來供大家參考
準備自己的數據集
數據集做成VOC2012的segementClass的樣子,下圖是示例,上面一張是原圖,下面一張是分割圖
?
但是每一種label指定的物體都有對應的具體的顏色,這個我們犯了很多錯,最后跟蹤代碼找出來的,具體的每一類的RGB值如下:
| 0 | (0,0,0) |
| 1 | (0,128,0) |
| 2 | (128,128,0) |
| 3 | (0,0,128) |
| 4 | (128,0,128) |
| 5 | (0,128,128) |
| 6 | (128,128,128) |
| 7 | (64,0,0) |
| 8 | (192,0,0) |
| 9 | (62,128,0) |
| 10 | (192,128,0 |
這里只列出10類的值,更多類的可以看下面這段代碼:
def bitget(byteval, idx):return ((byteval & (1 << idx)) != 0)def labelcolormap(N=256):cmap = np.zeros((N, 3)) #N是類別數目for i in xrange(0, N):id = ir, g, b = 0, 0, 0for j in xrange(0, 8):r = np.bitwise_or(r, (bitget(id, 0) << 7-j))g = np.bitwise_or(g, (bitget(id, 1) << 7-j))b = np.bitwise_or(b, (bitget(id, 2) << 7-j))id = (id >> 3)cmap[i, 0] = rcmap[i, 1] = gcmap[i, 2] = bcmap = cmap.astype(np.float32) / 255 #獲得Cmap的RGB值return cmapdef _label_rgb_to_32sc1(self, label_rgb):assert label_rgb.dtype == np.uint8label = np.zeros(label_rgb.shape[:2], dtype=np.int32)label.fill(-1)cmap = fcn.util.labelcolormap(len(self.target_names)) cmap = (cmap * 255).astype(np.uint8) #轉換為整數值for l, rgb in enumerate(cmap):mask = np.all(label_rgb == rgb, axis=-1)label[mask] = lreturn label- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
按照此顏色表做圖就沒有問題,代碼可以正確的讀取分割的ground-truth結果?
原始的圖像放在fcn/data/pascal/VOC2012/JPEGImages?
分割的圖像放在fcn/data/pascal/VOC2012/SegmentationClass?
之后在fcn/data/pascal/VOC2012/ImageSets/Segmentation寫train.txt,trainval.txt,val.txt,寫入需要進行相應任務的圖片的編號
修改代碼
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
訓練
./scripts/fcn_train.py
其會在fcn/data/?下創建一個目錄叫做SegmentationClassDataset_db,里面存放訓練的圖片的pickle數據,如果需要修改原始的訓練圖片則需要將此目錄刪除,否則默認讀取此目錄內的pickle數據作為圖像的原始數據
會在fcn下創建snapshot這個目錄,里面有訓練保存的model,日志文件等,重新訓練的話,建議刪除此目錄
使用自己訓練的model
./scripts/fcn_forward.py -c path/to/your/model -i path/to/your/image?
結果存放在fcn/data/forward_out下
總結
以上是生活随笔為你收集整理的使用FCN做图像语义分割(实践篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习--数据增强
- 下一篇: 深度学习论文资源(截至2016年)