1. 程式人生 > >caffe fcn資料集製作 -標籤

caffe fcn資料集製作 -標籤

caffefcn資料集的製作:看過我上篇部落格的人,想必已經跑通了作者的fcn資料集,現在就是製作自己的資料集並進行訓練。其實不難,首先我們分析一下作者的資料集。根據他的資料集,模仿一個即可。首先我們看作者訓練時需要的兩個資料集voc和dataset(這裡我的voc,我自己改了名字叫做voc2016):
\

這兩個資料集分別有什麼用呢?其中dataset存放的是訓練時所用的資料,voc2016存放的則是測試所用的資料。

1///我們先看訓練的資料dataset,開啟資料夾:

\

當然你們的dataset開啟,可能和我的不一樣,但是cls這個資料夾和img資料夾和train.txt,這三個檔案你們肯定有,至於其他的你們可以暫時不用管,因為用不到,至於我的cls1,是我的另一分資料,不用管。好,現在我們就來介紹一下這三個檔案,第一個,cls——開啟裡面全是.mat格式的檔案,這個.mat裡面儲存的是訓練時的label,我們知道fcn

的label其實就是一張張人工分割好的圖片,只不過這裡這張圖片的儲存個格式被改成了.mat形式。而這個.mat可以用matlab來製作,那麼怎麼製做這個.mat呢?不急,我們先來用matlab開啟一個.mat看一下里面的結構:

\

可以看到是一個GTcls的結構體,這個結構體中間有三個部分,一個是Boundaries,裡面儲存的是對應每種分類的邊緣,比如人這個分類,那麼這個人在原圖中會被分割出來,用數字1來表示,對應Boundaries裡面1這個元胞裡面就會 存下這個人的邊框,可以看見

Boundaries裡面有33個cell,這就是說明是33個分類。特別說明這裡分類數不帶背景,背景一般以數字0表示。第二個部分是segmentation很顯然這就是你分割的label圖片,開啟segmentation,可以 看到是0到33的數字矩陣,對應的每一個數字,都代表一個分類。

\

最後一個部分CateoriesPresent,這個很簡單,可以直接看到裡面對應的是一行數字矩陣,其每個數字代表的是對應這張圖片中 的分類數,比如這張圖片中只有人和車這兩個分類,分別是數字1,2。那麼這個行矩陣中就會是1,2。特別說明這裡,背景0,一般不用寫進去。好,介紹這麼多,我直接貼出製作這個.mat檔案的程式碼,大家可以自行更改路徑,和分類數,進行製作:

clc

clear

% im=imread('C:\Users\Administrator\Desktop\1.png');

dirction='C:\Users\sk\Desktop\road_line\T4\img_label
'; Path=dir(fullfile(dirction,'*.png')); for k=1:numel(Path) imPath=fullfile(dirction,Path(k).name); im=imread(imPath); [row col]=size(im); %圖片的尺寸 bd=cell(1,33); bd(:)={logical(sparse(row,col))}; %在一個元胞陣列中預載33個全零稀疏矩陣,背景0不算 N=unique(im); %圖片分成多少類 if N(1)==0 %排除背景畫素 N=N(2:numel(N),1); end for i=1:numel(N) [x y]=find(im==N(i)); %找到圖片中標號為一類的所有座標 flog=1; for t=1:numel(x) if ((x(t)-1)==0)||((y(t)-1)==0)||((x(t)+1)>row)||((y(t)+1)>col) %找到邊界線點,排除他 continue; else if (im(x(t)-1,y(t))~= N(i))||(im(x(t)+1,y(t))~= N(i))||(im(x(t),y(t)-1)~= N(i))||(im(x(t),y(t)+1)~= N(i)) %找到一類影象上的邊框點 X(flog)=x(t); Y(flog)=y(t); flog=flog+1; end end end val=zeros(row,col); %建立輸入影象大小的全零矩陣 val((Y-1)*row+X)=1; %將其一類影象的的邊框存入全零矩陣 bd(N(i))={logical(sparse(val))}; %將這個帶有影象邊框的矩陣以稀疏矩陣的方式存入元胞陣列對應的邊框分類中 X=zeros(0);Y=zeros(0); % X,Y矩陣歸零處理,方便下次重新儲存座標 end GTcls.Boundaries=bd; GTcls.Segmentation=im; GTcls.CategoriesPresent=N'; save_path=fullfile('C:\Users\sk\Desktop\road_line\T4\cls',strcat(Path(k).name(1:5),'.mat')); save(save_path,'GTcls'); end

需要說明的是這裡輸入的圖片必須是你分割好的圖片,且已經將類別進行了規劃,比如分類是20類(帶背景),那麼,輸入圖片裡面的畫素值範圍就是0-19;其中沒一個數字帶表一種分類。

ok,這就是cls檔案,這應該是最複雜的一部分了。下面的簡單了,到img,顯然img,就是你需要訓練的原圖,一般都是rgb格式。至於train.txt.就是你訓練圖片的名字,注意不需要副檔名,如圖:

\

2/// 我們再來看測試集voc2016

開啟該資料夾裡面我們用到的檔案有這幾個

ImageSets,JPEGImages,SegmentationClass,如圖所示:

\

同樣的道理,你們開啟肯定和我的不一樣,因為我多餘的都刪除了。但是沒關係,只要有這幾個資料夾就行。首先是JPEGImages,裡面裝原圖,很簡單,只不過 這裡的原圖指的是測試需要的原圖,然後是SegmentationClass,這裡面裝的是測試的label圖片,其圖片也是 和上面一樣,進行了種類歸類話操作(歸類到0到N),只是上面採用的是.mat形式,這裡就是直接的圖片形式了。但是有人可能有疑問了,既然圖片都歸類化了,我的是灰色,甚至是黑色,怎麼作者的彩色。這是因為,作者把這歸類化的圖片又對映成了索引圖,所以看起來就是彩色,至於什麼是索引圖,和索引圖怎麼做就很簡單了,自行百度即可。需要說明的是製作索引圖時,用到的map是什麼樣的不重要,可以自行設定,只是為了便於觀察,訓練是起作用的是你的歸類數,而你的map,不起任何作用。最後是ImageSets資料夾,開啟它,進入裡面的這個資料夾:

\

其他的不用管,都是沒用的,進入之後,會發現是有這個seg11valid.txt。這個名字很奇特,其實就是測試檔案的檔名,和上面說的train.txt性質一樣。

ok,說到這裡基本fcn的資料集製作就完成了。按照上面介紹的製作完資料集,再根據我的上一篇部落格,進行路徑的修改。至於輸出的分類數,很簡單,進入train.prototxt,和test.protetxt將其最後幾層的num_output:21 改成你的分類數即可。然後就可以訓練自己的資料了。

總結:

其實說了這麼多,可能有點亂,因為趕時間,所以沒有按邏輯一塊一塊的來講:其實主要就是兩個資料夾,一個訓練一個測試,訓練裡面有三個檔案,一個訓練原圖,一個txt,一個label(.mat形式);測試裡面三個檔案,一個測試原圖,一個txt,一個label(索引圖形式)。其實資料也很簡單,只是作者寫的夠麻煩。看這片教程諸位先把自己的資料跑起來,日後熟了,還望自己寫一下資料輸入的介面,將其簡單化,再拿出來我們一起共享。