訓練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()函式。
然後......因為修改了影象資訊。
又開始了漫長的處理資料過程(心好累!)
如果還出問題。。。。再說吧