參考博客:
http://blog.csdn.net/jacke121/article/details/78160398
以視網膜血管分割的數據集為例:
訓練樣本:
訓練標簽:
標簽圖的制作依據voc數據集中的樣例,將被檢測的目標改為voc中的一類。
將用ps軟件制作的黑底白色標簽轉化為,目標為(128,0,0)的單通道彩色圖片,存儲格式為.png。也就是將待分割的目標當做飛機。
轉化png的matlab的代碼如下:
imgname='15.jpg'; I=imread(imgname); I_gray=rgb2gray(I); I_bw=uint8(im2bw(I_gray))*128; I1=uint8(zeros(size(I,1),size(I,2),3)); I1(:,:,1)=I_bw; [x,map]=rgb2ind(I1,256); imgSaveName=imgname(1:length(imgname)-4); imwrite(x,map,strcat(imgSaveName,'.png'));
制作好訓練集后,修改一些文件中的路徑。
我的工程路徑:
I:\caffe171101\caffe-master\fcn-master\retina200-fcn32s
I:\caffe171101\caffe-master\fcn-master\data\retina200_200
voc_layers.py修改:
可以刪掉底下的class SBDDSegDataLayer(caffe.Layer) 訓練的時候用不到。
修改這三個地方的路徑即可。
train.prototxt修改:
這個mean,就是計算訓練樣本RGB三通道的平均值。
將后面的num_output:21 全部改為num_output:2 只有背景和待分割的目標兩類。
val.prototxt的修改同理。
deploy_voc_32s.prototxt 不變
solver.prototxt 不需要改動
因為是第一次訓練,采用fcn32s-heavy-pascal.caffemodel作為預訓練模型。
solve.py
import caffe import surgery, score import numpy as np import os import sys try: import setproctitle setproctitle.setproctitle(os.path.basename(os.getcwd())) except: pass weights = 'fcn32s-heavy-pascal.caffemodel' deploy_proto = 'deploy_voc_32s.prototxt' # init caffe.set_device(int(0)) caffe.set_mode_gpu() solver = caffe.SGDSolver('solver.prototxt') #solver.net.copy_from(weights) vgg_net=caffe.Net(deploy_proto,weights,caffe.TRAIN) surgery.transplant(solver.net,vgg_net) del vgg_net # surgeries interp_layers = [k for k in solver.net.params.keys() if 'up' in k] surgery.interp(solver.net, interp_layers) # scoring val = np.loadtxt('../data/retina200_200/val.txt', dtype=str) for _ in range(50): solver.step(2000) score.seg_tests(solver, False, val, layer='score')
必須采用transplant的方式訓練。因為這個模型的網絡中的圖片尺寸和自己的數據集中的圖片尺寸不一樣。
訓練完成之后,進行預測時,這個deploy.prototxt文件需要改動一下。
將其中num_output:21的地方全部改為num_output:21
實驗結果: