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 map

3.多利用上下文信息,而且要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 |