cnn分類時圖片較大物體較圖片較小,大約1/16,要怎麼做?
我是想把圖片resize到700x700多的解析度,這樣人眼可以識別圖中物體,可是700多解析度輸入網路會導致顯存爆炸,loss也不收斂,一直跳。如果將圖片resize到224那麼會丟失很多有用的細節,物體也變得人眼不好辨認了!求大神指教!
最近剛好做到一部分這方面的工作,拋磚引玉。
檢測部分當前基本採用faster_rcnn框架或類faster_rcnn(ssd等),題主提到了1/16,應該也是考慮到在特徵層feature_stride=16,所以以下回答從faster_rcnn框架角度出發考慮問題。
1. resize至224人眼都無法辨認,丟失掉很多細節,這樣效果應該是不好的;
2. 合理的尺寸比如700時,遇到的兩個問題:顯存爆炸和loss抖動。
2.1 顯存爆炸:題主可能用的是較大的模型(zf,resnet)提取特徵,是否可以視問題難易程度縮小特徵提取網路,可以嘗試pvanet或者自己設計較小的網路
2.2 loss抖動:有可能有兩個原因
第一個,網路結構初值不好;
第二個,目標太小rpn結構獲取不到足夠的正樣本,訓練不夠好,獲取不到好的候選框,進一步影響到後面分類識別網路。2.2.1 網路初值:可以先將檢測目標裁剪出來作為正樣本,隨機採取非檢測目標作為負樣本,訓練分類網路作為檢測網路初值,並且可以從側面驗證檢測可行性。
2.2.2 小目標檢測:有比較多的論文做這一塊,有幾個方案可以嘗試一下
skip connection、特徵層做反卷積使feature_stride變為8、rpn階段控制正負樣本比例等。另外請注意anchor的設計是否合理。
以上。
難免疏漏,歡迎指正。沒理解錯的話,問題是說、做classification的時候,想要識別的物體在圖中很小怎麼辦吧?其實一般而言,對於未加處理或裁切的圖像,都是先檢測,再分類的。要是直接想要識別分類,訓練過程比較難一些,當然這個需求也顯得奇怪一些。Loss值不收斂很可能是因為類內差異過大導致的,有的物體占圖片的比例很大,有的很小,但都被標記成同一個物體——這使得網路需要將差異很大的圖像泛化成一種類別。如果你所有的訓練數據都是物體佔到圖像的1/16應該不會一直跳——當然這是我的猜測,可以做實驗驗證一下。
一個可行的方案是,在多個尺度上對於同一個類別進行訓練。打個比方,對於某個你想要分類的特定類別prettyGirl,有很多訓練數據,其中有一部分圖像中的prettyGirl很大佔據了圖像的90%,有的很小隻佔用了圖像的1/16(如你所說),那麼你其實可以將它們當做兩種不同的類——prettyGirlSizaA和prettyGirlSizeD(都是亂碼),訓練的時候打上不同的標籤。
在小物體檢測上最近有一篇很棒的paper,在https://arxiv.org/pdf/1612.04402v1.pdf上,主要說的是做小人臉檢測,我覺得對你會有幫助。1.儘可能提高輸入解析度
2.儘可能用高分辨feature map3.多利用上下文信息,而且要multi scale
4.多提供此類scale的訓練樣本歡迎大家補充推薦閱讀:
※CNN和RNN風行之後,DBN/SAE/pre-train在deep learning中還有意義嗎?
※請問CNN 中的 maxpool 到底是什麼原理,為什麼要取最大值,取最大值的原理是什麼?謝謝。
※如何用FPGA加速卷積神經網路(CNN)?
※深度圖像depth image作為CNN卷積神經網路的輸入層有什麼技巧?選用什麼網路模型能取得好效果?
※Pytorch如何自定義損失函數(Loss Function)?
TAG:Caffe深度學習框架 | 卷積神經網路CNN |