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