FCN訓練自己的數據集

本人研究生,最近在做關於FCN的課題,因爲要實現論文中的算法,所以自己要實現FCN,也參考了很多網絡上的博客,自己做個小的總結,以及遇到的一些問題解決方案。

一、CAFFE的安裝

這裏我不贅述,因爲有很多教程,大家可以參考:
http://blog.csdn.net/Tang_DH/article/details/52556636
http://blog.csdn.net/xierhacker/article/details/53035989#python
中有很詳細的說明。而FCN的例程運行可以參考:
http://blog.csdn.net/u013059662/article/details/52770198
我在以上步驟中遇到的問題基本上在上面博客中都有解答,有的網盤數據集下不了的可以到上面博客的評論區,裏面有相應的解答。

二、FCN運行自己的數據集

我用的數據集是自己在論文中使用的DVMM數據集,是拼接檢測的數據集。一些圖像如下圖:

然後製作訓練集和驗證集,圖像本身是不用做處理直接保存到一個train文件夾和test文件夾,然後製作標籤,我用的是windos的命令來製作的:cd到數據集的文件夾下執行:
dir/s/on/b>d:/train.txt
可以在D盤根目錄下生成一個txt文件,然後使用替換命令去除文件格式和文件路徑。另一個驗證集也同樣製作。
然後就是製作圖像的label圖,因爲很多人不習慣用mat文件表示分割,我也是,所以就在網上找是否可以直接用圖片的方式來做分割圖,(雖然後來發現還是應該用mat文件比較方便。。。。),於是在
http://blog.csdn.net/supe_king/article/details/58121993
中找到了很好的方法,修改了voc_layers.py中的訓練集的分割圖的讀取方式,即使用VOCSegDataLayer中的load_label代替SBDDSegDataLayer中的load_label方法,並修改voc_dir爲sbdd_dir。我用的數據集中是提供一個mask的文件的,就是分割圖,如下圖

但是這樣的彩色圖片不能直接作爲分割圖,matlab可以用起來了。。。
因爲我想做二分類的問題,但是想一步步來,我首先將其轉換爲灰度圖像,代碼如下:
file_path =  'C:\Users\qxm\Desktop\新建文件夾 (2)\';% 圖像文件夾路徑  
img_path_list = dir(strcat(file_path,'*.jpg'));%獲取該文件夾中所有jpg格式的圖像  
img_num = length(img_path_list);%獲取圖像總數量  
if img_num > 0 %有滿足條件的圖像  
        for j = 1:img_num %逐一讀取圖像  6
            image_name = img_path_list(j).name;% 圖像名  
            i = strfind(image_name,'.j');
            %去除文件後綴,提取單純的文件名
            imname = image_name(1:i-1);
            image =  imread(strcat(file_path,image_name));  
            fprintf('%d %d %s\n',i,j,strcat(file_path,image_name));% 顯示正在處理的圖像名  
            %圖像處理過程 省略  
            
         image = rgb2gray(image);
           imwrite(image,strcat('C:\Users\qxm\Desktop\mask\',imname,'.jpg'));
            
            
          end  
end 
同樣地將驗證集的label圖也處理了,這樣就批量轉換了我的彩色分割圖像~
接下來就修改網絡的結構文件,我使用的是FCN目錄下的voc-fcn8s的這個文件夾裏的文件,首先將其FCN目錄下的surgery.py,voc_layers.py,score.py複製到voc-fcn8s文件夾下,然後打開solver.py,第一個紅線所表示的內容是下載的訓練模型,我這裏註釋掉了,也可以不註釋,註釋掉就表示只是用自己的數據來訓練,收斂效果可能會差些。第二個紅線所表示的就是要修改的我們剛剛生成的test.txt的保存路徑,這個因你設置而定,而紅線圈出來的則表示的是你使用的GPU,如果只有一個GPU就可以註釋掉這句,我這裏用的是2號GPU即第3個GPU。

接着修改的voc-layers.py在上面提過了,可以在那篇博客裏看更詳細的修改方法。
接着修改train.prototxt和val.prototxt兩個文件,下圖紅線中部分中../data/my是我的保存數據的路徑。另外需要修改的就是原網絡是分割21類的,而我要做的是2分類的,所以將num_output:21都換爲2。這裏要注意,如果你要使用訓練好的模型,即我在solver.py註釋掉的那個,你需要更改下層的名字,因爲我沒有用,所以就沒有改。

然後修改solver.prototxt文件,如下圖,要修改的有下面的保存的快照路徑。

然後cd到voc-fcn8s路徑下,執行python solver.py就開始訓練了。

下面是我遇到的問題:

1、out of memory

這個問題出現真的好煩,除了修改batch_size和更換大的GPU,就是調整圖片的大小了,我一開始就因爲筆記本的GPU過小運行不了,但後來我用GTX 1080TI還是出現了這個問題。。。我才統一了訓練集和驗證集的圖片爲256*256的才行。

2、Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR

這個問題出現我當時也是一頭霧水。。。後來查了在CNN中是因爲訓練集的大小與label不一致,即用18類不同的圖像做訓練集而你的label只有2。我遇到時纔想起來我們使用的是圖像label,那麼就是你圖像中有多少個不同的像素值,就是分成了多少類。。我設置只是灰度圖像基本上是0—255。。。。而我設置的num_output是2.。。肯定出現這個問題,所以這裏要將我的灰度圖像轉換爲二值圖像,而用matlab轉換後我保存爲jpg文件後,還是出現了這個問題。。。真尷尬,後來我把圖片又imread後發現,我修改的二值圖像中並不是只有0和255,還有很多其他像素值,這是爲什麼。。。我查了才發現是jpg有損壓縮的問題。。所以保存我們的圖像爲bmp文件就好了。

3、IOError:cannot identify image file

這個問題我查了很多資料說是將import image 換成from PIL import image,然而我們是在官方的改的啊,根本沒這個錯誤,然後我發現是我的linux沒有安裝相應的依賴包,所以from PIL 就相當於沒用,

pip uninstall Pillow

sudo pip install pillow
就好了。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章