1. 程式人生 > >深度學習(主要是CNN)用於圖片的分類和檢測總結

深度學習(主要是CNN)用於圖片的分類和檢測總結

前言: 主要總結一下自己最近看文章和程式碼的心得。

1. CNN用於分類:具體的過程大家都知道,無非是卷積,下采樣,啟用函式,全連線等。CNN用於分類要求它的輸入圖片的大小是固定的(其實不單單是CNN,很多其它的方法也是這樣的),這是它的一個不足之處之一。目前的大部分CNN都是用來做分類比較多。

2. CNN用於檢測:主要的方法有兩種,細分一下有三種,

第一種最為簡單和暴力的,通過滑動視窗的方法,提取一個固定大小的影象patch輸入到CNN網路中,得到該patch的一個類別,這樣得到一個圖片密集的類別得分圖。顯然,這種方法的一個弊端就是運算量太大,如果圖片的解析度比較的大,就根本無法進行下去,更何況,這還是在沒有考慮圖片多尺度檢測的情況。

第二種方法,在第一種方法的基礎之上,採用了動態規劃的思想,避免了重複計算問題。對於CNN來說,直到第一個全連線層之前,它的輸入圖片大小是可以不固定的,但是有了全連線層之後,就要求輸入大小保持一致,第二種方法是先把任意大小的圖片進行輸入CNN直到第一個全連線層,然後再在它的基礎上進行固定大小的滑動視窗輸入到全連線層中,由於第一個全連線層之前進行了大量的下采樣操作,所以這時候的滑動視窗的數目就大大的減少了,而且前面的卷積操作就要計算一次,沒有重複計算的問題。CNN裡面有一個trick就是把訓練好了的用於分類的網路,把它的全連線層引數轉化為卷積層引數。這樣改造後的CNN就成了全卷積CNN,它的輸入是可以任意的,而它的輸出是patch 的類別得分。這個在Caffe裡面有一個例子說明怎麼轉換。網址在這裡:

http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/net_surgery.ipynb

第三種方法,跟前兩種不同的是,它不是採用滑動視窗的方法,而是採用提取子視窗的方法,這種方法最典型的是今年的CVPR2014的R-CNN方法,它先採用一個方法來進行生成1000-2000左右的視窗區域(類似於目標顯著性檢測,但又不同,英文的說法叫Objectness,不好翻譯),然後再把這些視窗歸一化到相同的大小放到CNN裡面去做分類。(當然RCNN的方法只是用訓練好了的CNN進行提特徵,它還需要進行對每一個類別進行訓練SVM分類器)。顯然這種方法的優點的是比前兩種快,因為分類的視窗少,但是它也有不足就是,它要保證要檢測的目標在這些1000-2000個提取的視窗中的概率要足夠的高,也就是要有比較高的召回率。再者,它要保證這1000-2000個視窗的提取要足夠的快,(在R-CNN中,由於它採用的方法生成視窗很慢,所以實際上整個檢測是比較慢的。)