1. 程式人生 > >訓練SSD時出現的資料問題

訓練SSD時出現的資料問題

使用COCO2014訓練SSD網路。

參照https://github.com/weiliu89/coco.git的方法處理資料集。

生成lmdb格式資料。

開始訓練之後報這種錯誤。

OpenCV Error: Assertion failed ((scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)) in cvtColor

各種搜尋之後發發現是因為SSD只支援3通道的RGB影象。(也有人說是因為訓練影象可能最小邊<300,這樣resize到固定300x300的時候就會有問題)

解決方案有兩個(反正這兩個方案對我的問題都有效,不過我選擇了第二個):

1. 修改resize_mode為FIT_SMALL_SIZE,batch_size=1.

雖然能解決問題,但是batch_size設為1可能會導致無法收斂等問題,而且所有影象尺寸也不是統一的300x300了,訓練的結果就會和原作者有誤差,所以我沒選擇次方案。

2.從訓練集中選出灰度圖,然後刪掉,重新生成lmdb檔案重新訓練。篩選程式碼如下,我是用matlab寫的:

fid=fopen('/your_root/new_train.txt','wt');%新建一個txt列表  
lst = ['/your_root/train.txt'];           %要讀取的列表所在的路徑
imgpath = '/image_root/MS-COCO2014/';
count = 0;
fpn = fopen (lst, 'rt');             
while feof(fpn) ~= 1                  
      elem = fgetl(fpn);             
      res = strsplit(elem);   %空格分開
      %disp(strcat(imgpath,char(res(1))));
      img = imread(strcat(imgpath,char(res(1))));%獲取影象路徑
      if ndims(img)== 2 %灰度圖
		disp(strcat(imgpath,char(res(1))));
        count=count+1;
      else
          fprintf(fid,'%s\n',elem);%刪除灰度圖的list
          
      end 
 end  
 fclose(fid);
 disp(count);

發現train裡面有227張灰度圖,相對於118287的訓練集來說,刪除227也沒關係。然後就可以不用修改網路引數直接訓練了。

不過我發現minival裡面也有10張灰度圖,但是載入minival_lmdb檔案就沒出錯。這是為什麼?難道驗證集不需要3通道RGB也可以?

—————————————————————————分割線———————————————————————

果然測試載入資料的時候還是出問題了。

BUG:

mean_values_.size() == 1 || mean_values_.size() ==img_channels Specify either 1 mean_value or as many as channels: 1 

因為minival裡面只有10張灰度圖,所以我直接將這十張灰度圖轉為了三通道圖,直接s使用opencv中的 cvtcolor()函式。

然後......因為修改了影象資訊。

又開始了漫長的處理資料過程(心好累!)

如果還出問題。。。。再說吧