目標檢測簡單系統的理解

快過年了,簡單總結一下今年目標檢測的學習經歷和經驗。希望對大家有用。

 

    從2017年末就開始準備國家自然科學基金。首先寫了一箇中央高校專項資助作爲鋪墊,到了春節的時候一直在家寫國家自然基金的方案。2018年3月份結束。

    3月份開始參加全國物聯網創新應用大賽,將一個對模糊、細小人臉檢測效果非常好的論文用來做教室的人數實時檢測,統計繪製成學校教室人流分佈,提出一個在各大高校不斷擴招且不擴建校園的情況下教室資源的優化方案。不得不說這個模型真的好用,檢測速度快、準確率極高。用了多尺度訓練的手段。做比賽的感覺跟研究有點區別,要想着寫一個系統性的應用方案,就要考慮變量的意義和價值,能夠解決什麼問題,有什麼優點等等。相當於要自己構思一個應用系統。實際上比較複雜,要自己想得很多。在清華比賽的時候有幾個人跟我同一個題目,但是算法上,只有我一個用了dp,效果是最好的。當然這是一個比較水的PPT比賽。主要是說其實這是個比較老套的思路,每年都有很多人做,但並不代表着每年都有人更新內部的算法且根據算法擴展構思。

項目主頁:https://www.cs.cmu.edu/~peiyunh/tiny/

Github主頁: https://github.com/peiyunh/tiny

個人寫了一個環境搭建過程記錄,需要的話可以發。

之後寫了幾個目標了檢測的橫向,檢測火災、輸電金具目標以及細小缺陷。

    期間一直在做數據庫及數據庫優化方案。到了8月份開始研究GBD-Net,商湯科技拿了一個比賽冠軍的目標檢測模型。調試環境調試了1個月,發現開源得還不徹底,作者只提供了他修改模型跑出的中間結果,就是RPN輸出的得分和座標,個人感覺復現有難度,後來就沒做了。最開始的blog寫了一些記錄。其實採用的很多策略被證明是很成功的,比如多尺度,GBD中的G是gate,門的意思。就是說,在同一層的神經元之間加入連接,這個連接是一個sigmoid函數,來控制門的開關程度。相當於借用了RNN的思想用於目標檢測。這個提升理論上很大,實際效果不是特別高。反而我覺得作者在ROI層多尺度的輸入是一個特別棒的點子。

intro: CVPR 2016. Cascade Region-proposal-network And FasT-rcnn. an extension of Faster R-CNNproject

page: http://byangderek.github.io/projects/craft.html

arxiv: https://arxiv.org/abs/1604.03239

paper: http://www.cvfoundation.org/openaccess/content_cvpr_2016/papers/Yang_CRAFT_Objects_From_CVPR_2016_paper.pdf

github: https://github.com/byangderek/CRAFT

有些部分要翻牆下載。

    之後老師的橫向需要專利,用傳統的SIFT特徵配準圖像,結合顏色特徵,膨脹和腐蝕,提出最近鄰區元融合的異物檢測方法去檢測異物,其實就是把分割得到的多個區域進行以下運算,把最近的融合在一起。之後開始寫北京自然科學基金。寫完之後寫了中科院的開放項目基金。到了年底這些縱向都中了。

    18年去北京參加了ADL93培訓,去了Valse,去了MLA,去了PRCV,去了CCKS知識圖譜與語義計算大會。每一次開會都會有新的感悟。慢慢的對目標檢測有了一個較爲全面的理解。

   簡單來講就是從給定信息中找到一個具有一定規律的信息子區域,在圖像裏,就是在一張圖片裏面找到目標,而基於圖像的目標查找,首先得搭建一個體系去描述目標,這個體系就是特徵空間。我們先嚐試用各種特徵提取算法,在特徵空間中找到目標比較穩定統一又精簡又專一的描述,然後把這個描述當成目標的定義。然後在其他圖像裏利用這個特徵去找目標。目標分割也是一樣,只不過他不僅僅找到目標的這個特徵,還把這個特徵之外的信息區域定義爲背景,全部不要或者變黑、白,就相當於將目標'浮'起來,分割出來了。傳統的特徵定義方式與現在常用的學習方法不一樣。傳統方法人爲的定義目標特徵,也就是手工特徵。學習方法我們只需要畫出目標區域,模型會根據自己的可學習結構,當數據一遍遍在裏面過的時候,它就會在目標函數的強迫下,將模型自身的參數擬合目標。所以其實目標通過會有很高的得分,而非目標通過得分就很低,就像濾波器一樣,卷積濾波因此來。

    關於傳統的目標檢測,其實是包含了目標分割。而在深度學習時代,這兩個分得就很清楚,因爲處理的結構和最後呈現的結果區別都很大,但兩者關係依然緊密。

    傳統做目標檢測比較傾向於直接做目標分割,因爲既然我已經手工把目標的特徵定義出來了,那我乾脆就直接把不是目標的信息丟掉,目標留下來就好了。所以其實我們可以發現,傳統的手工特徵的一個特點就是,目標的特徵是與圖片其他區域信息較爲完全的區分的。一方面,我們要佩服一下傳統特徵,但是另一方面,我們會發現基於傳統特徵的目標檢測侷限性很大,比如不能接受複雜背景、遮擋等等,可以去翻翻論文,傳統方法發的論文基本都是小圖像,清晰背景,目標明顯且規則的任務。既然錘子不大,就找軟柿子捏了的意思。後來深度學習方法構造了一個很高維度的特徵空間,然後又提供了在這個高維度特徵空間尋找目標特徵的學習結構,使得表達目標特徵的方法性能得到了飛躍,簡單實用易上手。

    到這裏,其實深度學習解決的是特徵表達問題。但是檢測問題其實是要考慮實際的,因爲圖片是將三維空間中的信息投影到二維存儲,本身就有很大的信息丟失,那麼同一個語義的目標,在不同二維平面上呈現出的視覺表徵,有可能是一樣的,也有可能是不一樣的。這種不一樣一方面表現爲特徵的不同,另一個方面表現爲大小的區別。所以其實我們希望深度模型通過我們喂進去的數據能夠學習到目標在三維空間中的特徵,雖然我們給的只是二維數據。所以如果我們把這些目標都標記爲一類,同一個語義,其實相當於描述一個三維空間中目標視覺特徵,也相當於N個二維空間中的目標視覺特徵。如果我們網路能夠有很高的準確率,我們可以反過來推斷,網絡學到的特徵是一種能夠包容多個從二維平面看長得可能非常不一樣的目標,就好像從一個人的頭頂看和從正面看,模型學習到的特徵都能把這個人檢測出來。這是我們常常看到別人說的“能夠學習到更本質的特徵刻畫”、“更好的特徵表達”的意思。對於人來說這個就很簡單了。但是相比於傳統算法,這兩者要單獨設計特徵,再把結果輸出爲一類。

    上面解釋了網絡強大的特徵表達能力。那麼對於目標大小呢?目標大小其實是一個很相對的問題,在一個白色背景上,檢測一顆黑色的芝麻。無論多小我都能檢測出來且100%確定我是對的。但是背景如果稍微沒那麼理想一點,就無法了。比如在地上掉了一顆芝麻,我們會說:啊,太小了,我找不出來。所以目標的大小至少是一個和背景相關的相對的問題對吧。

    那麼通常一點的目標大小問題是指什麼呢?看了很多論文,加上自己的思考。我有了很多定義,但最想跟大家分享的,還是把其當成一個絕對的問題來研究,就是相當於無論什麼背景而言,都有對的,比較廣義的描述:像素能夠描述出目標的基本結構。這個定義意味着如果我們單獨把這個目標從圖片從剪切出來,不依賴場景的推理和提問,我們也能知道他是什麼。在目標檢測標註的過程中,對於小目標的標註,在輸電線路這個數據庫看來,很多是人潛意識依賴場景推斷標註的,比如他看到這個位置以前有螺栓,那麼這張圖片他就會下意識的標個螺栓,哪怕那個框裏面僅僅是4個像素的黑塊,剪切下來一看都不知道是什麼。所以我的定義是從目標本身視覺結構來定義的,在幾乎所有問題中都通用的目標大小定義。不過其實也有程度問題,有些人想象力好,看四個黑塊也能說是螺栓也不一定是吧。所以這還是一個模糊原則,不能給出每一種目標多大叫大多小叫小,但是在做目標檢測數據集的時候是一個很有用的原則。

    上面問題的兩個大方向,下面說說上面兩點在實際研究中對應的問題。一個類,包含了多個差別很大的視覺狀態,在視覺表徵上區別就很明顯,明顯的差異,明顯的不相似,這是我們想在二維空間解決三維空間中目標檢測問題必然會遇到的---相似性問題。一類目標的相似性差,就容易誤檢,會衍生出很多解決提高相似性的模型和策略。另一類小目標的問題,就複雜一點,分爲絕對小目標和相對小目標,絕對小目標是幾乎沒法解決的。除非是白紙找芝麻這類任務。相對小目標就常見一點,同樣也會衍生出很多模型和策略,比如多尺度特徵。

    上面對問題的分析是不考慮模型的。我們得到這麼好的視覺特徵,得益於模型層層深入的特徵學習以及分佈式的特徵表達,但這帶也是一種特徵提取方式,也是有適用範圍的。對於小目標,如果一個模型輸入resize太小,如ssd的312x312,或者池化太多、層數太深,那麼最後一層的特徵往往是語義特徵(語義特徵就是高度抽象的跟一個詞彙相關的特徵,區別與輪廓、顏色、形態、邊緣紋理等視覺特徵。相當於我們看到一隻狗最後腦海裏會出現一個狗字,而不會出現這個狗的毛是什麼顏色的、多高多大公的母的,毛長,毛亮等等視覺特徵。)。出現語義特徵的原因很簡單,因爲我們的標籤是語義啊。我們學習的時候,也是媽媽、老師告訴我們萬事萬物的名字。所以其實可以這樣說,小目標經過這個網絡,也有語義特徵,但是相對於大目標而言,這個語義非常的模糊,就是說,這個模型結構不適應這種大小的目標。簡單的適應有一個很簡單的思路,就是把模型的感受野調小,生成的proposals都小一點,用比較前面的特徵層的特徵去分類。但這樣計算量就會大很多。所以我們可以得到一個結論,現有模型,並不是一個固定死的算法,而是對於某一種數據的適應結構,這個數據就是Imagenet,裏面大目標居多。就像我們每家每戶會定做衣櫃一樣,如果我們家小一點,定做的衣櫃也可以小一點。這解釋了兩點,爲什麼現在搞深度學習就業工資這麼高,就是因爲實際上還是比較靈活的,它提供的是一些基本組件,根據問題,我們要靈活組裝,再加上各種自己的trick。

    上面從加入了模型這一變量重新考慮小目標問題,小目標問題就變成了具體在模型某個地方的問題,也有了改進的思路。現在再深入的說一下目標檢測的模型。其實本質就是在圖片上剪出一個個的框,丟入深度卷積神經網絡提取特徵,然後用特徵分類。two-stage順便用深度卷積神經網絡將前景和背景先分一下,這樣少點框丟到分類器,也少了很多學習的負樣本,然後再對前景細分,所以是兩級結構。One-stage就沒有了前面篩選的過程,所以快了很多。從圖像的角度講,分類器還是分類器,主要是特徵提取換成卷積神經網絡,特徵換成了深度卷積特徵。現在的分類器爲了擬合這種結構,以前的svm用得少了,直接用softmax,實際來說softmax只是一個score轉概率的層,並不是分類器,加上整個DCNN構成了分類效果。這樣與另外設置一個SVM的區別我沒分析過。

    從目標檢測問題到模型實際問題,到模型結構,我們一層層深入了。接下來再深一點吧。模型很複雜,參數很多,拋開那些跟目標檢測不直接相關的Backbone研究,做目標檢測的會考慮網絡結構和參數對目標的影響,比如base anchor,reshape大小,anchor 長寬,特徵選擇等等。從內部上,試着從各個方面讓模型更適應數據,這樣做往往是有效的。因爲模型是通用的,所以在專業數據集上調參是會有提升的。從外部上,有的加算法,加反饋,加自適應,加注意力機制,加知識,加一些層,加傳統特徵,加特徵融合,增加預處理層,增加後處理層(比如對檢測出來的結果再進行處理)等等。每一個方向都能提升性能。

    開會的時候,發現目標檢測的研究報告少了很多,我覺得有很多原因。一方面是目標檢測因爲偏向應用,其實很多比賽都做得很好很極致了,限制在於任務本身、數據、模型性能本身限制。反而模型的可解釋性、元學習、遷移學習、圖像生成等等對模型本身的結構研究是個更大的反向,因爲那裏面可能性還是太多了。最主要的是,實驗週期長,所以還有很多可以挖掘的。做目標檢測的我們基本不會去大改模型對吧,不然我們就去做深度模型結構優化研究了,可以去搞結構,也可以去搞理論。

    今年寫了很多跑模型過程中使用的代碼共享,我自己是覺得很好用,現在開始寫寫複雜點的。最近在最一個基於遷移學習的目標聚類,將目標先進行形態的區分,再丟如模型裏面訓練,這樣主要是利用遷移學習拉近目標的類內相似性,不像一類就分兩類的思路。提出一種基於形態比分佈的無參數k-means聚類算法,並且結合形態比來優化深度特徵使得我們能不設計類數的使用k-means,很好的將同一類進行形態的區分,然後將結果以標籤的形式打回xml上,在後面加後綴,再去學習。最後呢,就用我之前寫過的大類合併AP檢測代碼。我試了一下提升是有的。

再往下深入的話,就是具體的模型如Yolo\RFCN\Faster\SSD等,一個結論:Two-stage準確率>One-stage。具體很多,可以看看這個:

https://github.com/amusi/awesome-object-detection

從事輸電線路航拍圖像目標檢測應用研究(生)。真的有人看的話,歡迎討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章