1. 程式人生 > >Segnet分割網路caffe教程(二)

Segnet分割網路caffe教程(二)

繼上一篇Segnet分割網路caffe教程(一)對segnet的介紹以及操作步驟的說明,下面講解對自己資料的一個說明。
對利用segnet進行影象分割需要的資料要求一個是原始影象,二是影象的標記即所說的mask,以我的的一個工程為例說明
(1)影象的處理,我的mask是二值影象因而需要轉換,這個我就不說了,只需要把mask轉化為0、1兩種值
(2)影象和mask的list的建立,這個我的做法是寫的一個指令碼,當然了也可用MATLAB或者Python等一些各位熟悉的語法進行操作,MATLAB和Python我也都嘗試過,可以的,我只是為了方便才用指令碼寫的,程式碼如下

#!/usr/bin/env sh
DATA_train=/home/ccf/CCF/Cell_segnet/data/data_train_enhancement/train/image MASK_train=/home/ccf/CCF/Cell_segnet/data/data_train_enhancement/train/mask DATA_test=/home/ccf/CCF/Cell_segnet/data/data_train_enhancement/test/image MASK_test=/home/ccf/CCF/Cell_segnet/data/data_train_enhancement/test/mask MY=/home/ccf/CCF/Cell_segnet/data/data_train_enhancement ################################################
rm -rf $MY/train.txt echo "Create train.txt" find $DATA_train/ -name "*.tif">>$MY/img.txt find $MASK_train/ -name "*.tif">>$MY/mask.txt paste -d " " $MY/img.txt $MY/mask.txt>$MY/train.txt rm -rf $MY/img.txt rm -rf $MY/mask.txt ################################################## rm -rf $MY/test.txt echo
"Create test.txt" find $DATA_test/ -name "*.tif">>$MY/img.txt find $MASK_test/ -name "*.tif">>$MY/mask.txt paste -d " " $MY/img.txt $MY/mask.txt>$MY/test.txt rm -rf $MY/img.txt rm -rf $MY/mask.txt

大家只需要改一下自己資料的路徑就可以生成自己的圖片和mask的list

(3)下面就說訓練了,在訓練的時候我們可以根據自己訓練的要求更改分割的型別,segnet對原來是11中型別,在我的工程中我只有兩種型別,這就會遇到對網路的修改,同時資料輸入的也是一樣原來的是360*480,我用的是400*400,網路中的修改根據個人的要求以及效果進行修改,要注意的是上取樣upsample這個引數的修改,以及最後的class_weighting,對於class_weighting個數以及引數是根據自己的資料以及要求設定,輸出幾個類別class_weighting就有幾個,對於class_weighting引數的確定是根據訓練資料的mask中每一種型別的label確定的,就算方法:(all_label/class)/label,下面是計算的演算法程式碼:

clear;
clc;
Path='/home/ccf/CCF/Cell_segnet/data/data_train_enhancement/train/mask/';
% save_mask_path='/home/ccf/CCF/Cell_segnet/data/mask_change/'
files=dir(Path);
for k=3:length(files)
    subpath=[Path,files(k).name];
    name=files(k).name;
    image=imread(subpath);
    I=image;
    img=uint8(zeros(400,400))
    [x,y]=find(I==0);
    for i=1:length(x)
        img(x(i),y(i))=0;
    end
    [x,y]=find(I==1);
    for i=1:length(x)
        img(x(i),y(i))=1;
    end
%     imwrite(img,[save_mask_path,name]);
    label_num=double(unique(img));
    element(:,1)=[0;1];
    if (length(element(:,1))==length(label_num))
        element(:,1)=label_num;
    end
    for j=1:length(label_num)
        a=label_num(j);
        e=length(find(img==a));
        element(j,i-1)=e;
    end
end
num=element(:,2:end);
sum_num=sum(num,2);
median=sum(sum_num)/length(sum_num);
class_weighting=median./sum_num;
total=[element(:,1),class_weighting];
save('class_weight.mat','total');

(4)接下來就是訓練了,訓練的指令碼如下

/home/ccf/caffe-segnet/build/tools/caffe train -gpu 0 -solver /home/ccf/CCF/Cell_segnet/code/segnet_solver.prototxt -weights /home/ccf/CCF/Cell_segnet/code/VGG_ILSVRC_16_layers.caffemodel 2>&1|tee /home/ccf/CCF/Cell_segnet/code/train_enhancement.txt

(5)測試,與博文Segnet分割網路caffe教程(一)一樣用到的幾個檔案,測試時候的test_weigths.caffemodel的生成

python /home/ccf/CCF/Cell_segnet/code/compute_bn_statistics.py /home/ccf/CCF/Cell_segnet/code/segnet_train.prototxt /home/ccf/CCF/Cell_segnet/models/segnet_iter_40000.caffemodel /home/ccf/CCF/Cell_segnet/code/Inference/

(6)測試結果的顯示和儲存

python /home/ccf/CCF/Cell_segnet/code/test_segmentation_ccf.py --model /home/ccf/CCF/Cell_segnet/code/segnet_inference.prototxt --weights /home/ccf/CCF/Cell_segnet/code/Inference/test_weights.caffemodel --iter 400

附上我的test_segmentation_ccf.py裡面修改的具體細節大家可以自己看。

python /home/ccf/CCF/Cell_segnet/code/test_segmentation_ccf.py --model /home/ccf/CCF/Cell_segnet/code/segnet_inference.prototxt --weights /home/ccf/CCF/Cell_segnet/code/Inference/test_weights.caffemodel --iter 400