日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用FCN做图像语义分割(实践篇)

發布時間:2024/9/21 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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值如下:

Index 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,寫入需要進行相應任務的圖片的編號

修改代碼

  • fcn/scripts/fcn_train.py
  • # setup optimizeroptimizer = O.MomentumSGD(lr=1e-10, momentum=0.99) #這里的lr一定要小,大的話程序會報錯,我使用的是1e-9optimizer.setup(model)# traintrainer = fcn.Trainer(dataset=dataset,model=model,optimizer=optimizer,weight_decay=0.0005,test_interval=1000,max_iter=100000,snapshot=4000,gpu=gpu,)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • fcn/fcn/pascal.py
  • target_names = np.array(['background','aeroplane','bicycle','bird','boat','bottle','bus','car','cat','chair','cow','diningtable','dog','horse','motorbike','person','potted plant','sheep','sofa','train','tv/monitor',]) #修改成自己的,記得按照顏色表寫
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • fcn/fcn/util.py
  • def resize_img_with_max_size(img, max_size=500*500): #修改max_size,按照實際寫"""Resize image with max size (height x width)"""from skimage.transform import rescaleheight, width = img.shape[:2]scale = max_size / (height * width)resizing_scale = 1if scale < 1:resizing_scale = np.sqrt(scale)img = rescale(img, resizing_scale, preserve_range=True)img = img.astype(np.uint8)return img, resizing_scale
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • fcn/fcn/models/fcn32s.py
  • def __init__(self, n_class=21): #修改類別n_classself.n_class = n_classsuper(self.__class__, self).__init__(conv1_1=L.Convolution2D(3, 64, 3, stride=1, pad=100),conv1_2=L.Convolution2D(64, 64, 3, stride=1, pad=1),conv2_1=L.Convolution2D(64, 128, 3, stride=1, pad=1),conv2_2=L.Convolution2D(128, 128, 3, stride=1, pad=1),conv3_1=L.Convolution2D(128, 256, 3, stride=1, pad=1),conv3_2=L.Convolution2D(256, 256, 3, stride=1, pad=1),conv3_3=L.Convolution2D(256, 256, 3, stride=1, pad=1),conv4_1=L.Convolution2D(256, 512, 3, stride=1, pad=1),conv4_2=L.Convolution2D(512, 512, 3, stride=1, pad=1),conv4_3=L.Convolution2D(512, 512, 3, stride=1, pad=1),conv5_1=L.Convolution2D(512, 512, 3, stride=1, pad=1),conv5_2=L.Convolution2D(512, 512, 3, stride=1, pad=1),conv5_3=L.Convolution2D(512, 512, 3, stride=1, pad=1),fc6=L.Convolution2D(512, 4096, 7, stride=1, pad=0),fc7=L.Convolution2D(4096, 4096, 1, stride=1, pad=0),score_fr=L.Convolution2D(4096, self.n_class, 1, stride=1, pad=0),upscore=L.Deconvolution2D(self.n_class, self.n_class, 64,stride=32, pad=0),)self.train = False
    • 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做图像语义分割(实践篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。