目標檢測(Object Detection)的前世與此生(一)

目標檢測(Object Detection)的前世與此生(一)

首先說點題外話,上一篇的實時人臉識別中我說要把mtcnnfacenet的論文和代碼好好解釋解釋,並談談本身的理解,可是當我準備寫的時候,發現仍是我太年輕了,我發現若是想要將其解釋的通俗易懂,而且能在之後的項目中用的駕輕就熟的話,那麼它的發展歷程就不得不說說了,否則會以爲好多東西都很突兀,本次就說說這object detection,那麼各位老爺瞧好吧。html

簡介

Object Detection與Target Recognition是兩個不一樣的概念,這個各位老爺應該都知道。Object Detection的目的是在目標圖中將目標用一個框框框出來,而且識別出這個框中的是啥,並且最好的話是可以將圖片的全部物體都框出來,這樣作的目的是爲了下一步的Target Recognition。因此了,咱們接下來要作的就是用一些好辦法將這個框框找出來(其實就是找出來這個框的座標位置了),而在這個過程當中技術和方法也是在不斷的進步拉,從RCNN->SppNET->Fast-RCNN->Faster-RCNN,固然如今還有更棒的,可是我如今不寫,準備留在下一篇再寫(我也還沒學...),可是若是不搞定這個技術演進,後面技術中的各類新東西會讓人痛不欲生的算法

神經網絡是如何工做的

答案是:我也不知道 markdown

這個問題太大,可是對於不只僅是追求運用的人來講,這實際上是一個挺讓人困惑的問題(至少我是如此) 說一些各位爺都知道的,神經網絡經過一系列的節點將數據中最直接的特徵==>抽象的特徵,使得抽象後的數據逼近目標,從而纔有的可比性(衡量的尺度是loss) 網絡

舉個例子,卷積網絡奏效的過程(好像容易理解一點),經過不一樣的卷積核,提取圖像不一樣的特徵(抽象),再通過組合(進一步抽象),最終達到獲得一系列的高緯度的抽象特徵,當輸入的圖片符合的時候,纔可以從其中抽取出相似的高緯度特徵,從而達到了目的(網上一大堆的圖,也不知道貼啥好,下面是隨便找的圖)機器學習

cnn.jpg

能夠看出來,一開始提取出來的是一些不一樣方向的線條特徵,接下來繼續抽象組合,最後達到目標要求,這就是一個朝着目標不斷抽象出來更高級特徵的過程,這個看着很好理解,是由於符合人類的認知,而之前的研究人員也是這樣作的,他們各類辦法尋找應該抽取的特徵,從而能達到更好的效果,可是效率低小,不少時候效果也很差。 別急,讓我再舉一個例子,若是看過吳恩達老師的機器學習課程,應該知道其中有一節課是識別手寫數字,當時用的不是卷積,而是直接將28*28的手寫數字圖片展成一維,每個像素都當成輸入的特徵,最後也達到了預期效果。這裏不由該思考了,神經網絡起初看到的東西是一堆「在人類看來」毫無關係的像素值,處理的手段也是讓人看不懂了,因此又回到了最開始的問題了,咱們並不瞭解神經網絡的行爲,咱們知道的只是其在進行特徵提取,提取不一樣的特徵,提取更高維度的特徵,而且這種特徵早已超出了人類的認知,因此它才能夠高效的工做,完成一些人類沒法完成的工做,好比剛纔說的早期人工設定卷積核,尋找更好的目標特徵,這些目前都已經被深度神經網絡取代了,由於網絡能夠尋找到更高層次,更抽象(抽象到人類沒法理解)的特徵函數

說到這裏,有時候又會感慨,這是否有些太玄學了,好像機器跳出了人類由於多年的天然進化和社會閱歷的固有認知,尋找到了最直接的 現象與結果之間的聯繫,就好像若是占卜是正確的話,那麼是否是其方法是以一種人類不理解的方式尋找到了因雨果的聯繫,固然我說這些不是爲了玄學,而是爲了讓各位爺認識到這個問題,不少事情因束縛於人類的軀殼而沒法去理解,如四維空間或者更高維度的空間是不可想象通常,祖母悖論等各類問題,都是認識論與真理論的不統一而致使的,生而爲人是渴望追求真理的,但不少咱們作不到,因此這也是我喜歡深度神經網絡的緣由,它有機會讓我領略到更多的東西,好,廢話講完學習

RCNN->SppNET->Fast-RCNN->Faster-RCNN

在Object Recognition以前進行Object Detection的目的是爲了減小沒必要要因素的干擾(好比從背景很複雜的圖片識別出一個小動物,那樣準確率會大大的下降),此外還能同時獲得目標在圖片中的位置(還包括寬度,高度)。測試

當決定要進行Object Detection的時候,你們想法都是差很少的,窗口掃描嘛,不一樣大小的窗口從左到右,從上到下的,不用想,這樣是超級浪費時間的,絕大部分的掃描都是沒有用的,由於框住的根木不是目標,因此繼續想,要是我能直接框住圖片中的目標,而不框那些無關的背景,並且也不要框的特別準確,就好啦。 當年絕對有不少人有這樣的想法,你們都知道目前的窗口掃描辦法不少掃描是徹底沒有意義的,可是要怎麼作哦,這種感受有點像作題目的時候,有了一點思路,可是卻想不到好辦法,解決辦法是什麼呢?在RCNN裏就用到了優化

RCNN(regions with CNN)

SS(selective search)

在RCNN中使用了一個叫作SS(selective search 選擇性搜索)的方法,這個算法也算是爲Object Recognition打開了一個新的大門(同時也要吐槽在此算法上太多的博文都是在水,啥也說,貼個論文截圖就完事,固然也多是我太水,理解不了其中的深邃思想,但我就是要說)spa

我來簡單說說這個算法,在遇到上一段所說的問題,該論文做者發現,圖片中的目標(好比人,汽車,小貓...)與背景是有區別的,好比顏色區別,紋理區別、大小區別等

ss.png

如上圖所示(截自原論文),圖片中的大量天空背景是無效的,而咱們想要檢測的奶牛在顏色紋理方面很類似,能夠與背景區分開來

論文的思想是

  • 首先經過利用顏色的類似性(畢竟若是顏色很類似,那麼極有多是一個總體),造成一些小的區域(上圖左邊最下面一層),具體算法是將整張圖當作一個無向圖,節點之間的距離就是像素的距離(在這裏使用RGB計算距離並很差,最好轉換如下色彩空間,好比HSV等),而後設定一個閾值,從其中尋找最小生成樹,造成最初的感興趣區域(region of interest ROI)(若是沒有學過離散,能夠看如下這篇文章基於圖的圖像分割)
  • 而後對ROl進行再次的合併(如上圖),可是合併要遵循一些規則--相鄰區域的類似度

    • 顏色類似度(color similarity):比較兩個區域的顏色直方圖
    • 紋理類似度(texture similarity):比較兩個區域的梯度直方圖(這個會有點難理解,其實紋理的形狀表如今其輪廓上,全部用梯度直方圖能夠很好的表示出紋理之間的差別)
    • 尺寸類似度(size similarity):防止大的區域和小的區域合併,要遵循先小的合併(由於圖片中存在包含關係,好比輪子和汽車都很容易被框選出來,而輪子是屬於汽車的,若是直接大的和小的合併,那麼不少細節會被丟失掉)
    • 交疊類似度(shape compatibility measure):這個不太好描述(見下圖),當兩個區域合併後,合併造成的新圖形佔其邊框矩形面積的多少 表明着這樣合併的合理性,好比圖中的右側,合併後它們只佔了框定他們矩形的很小的一部分,當咱們把這樣的一個區域投入cnn中識別的時候,效果依然不好,仍是存在大量的背景信息,因此這樣是不合理的

jd.png

  • 類似度是上一步驟的計算獲得的各類類似度的加權和,而後利用這個類似度做爲合併的標準,而後重複這個步驟,直到最終合併爲一個區域,而在這個合併過程當中,獲得的大大小小的區域的邊界框,都將做爲咱們的侯選框

ss1.png

更多具體的算法細節能夠看選擇性搜索這篇文章(我也用了博主的一張圖...)

R-CNN

(詳情參看https://www.cnblogs.com/skyfs...,我下面的內容將會有不少都是這篇文章的,會穿插說一些本身的理解)

  • 使用ss選出2000個侯選框,將候選框拉伸爲227*227統一大小(拉伸方式爲padding=16,直接拉伸,通過實驗這樣效果最好),再選用一個分類CNN(好比AlexNet或者其餘),將分類數從1000改成20,並做fine-tuning

    11.jpg
    22.png

    其實我以爲上面的這個圖畫得有點不太直觀,AlexNet的網絡結構爲

    5個卷積層(conv1+conv2+conv3+conv4+conv5) + 3全鏈接(fc6+fc7+fc8)

    (因此上面這張圖中最後一層就是softmax loss,而不是什麼全鏈接層)

    這裏要說一下fine-tuning,你們都知道通常的圖片分類訓練,人工在進行數據標註時候較容易,因此訓練數據不少,而目標檢測的gt(ground truth)框標註起來很費事,因此訓練數據不多,這種大型的網絡訓練是很浪費時間的,由於使用的CNN,其中大部分作的工做都是將圖像中的特徵抽象出來,因此其中的大部分參數是能夠直接拿來使用的(至少是很接近咱們預期的目標的),在這裏使用的的AlexNet,其已經實現了1000對象的分類,而RCNN中要實現檢測的20個類別也在其中,這時候確定有人會想,既然這樣,還不如不要作fine-tuning了,又不是不能識別(不斷的質疑、思考將會促使咱們進步),RCNN做者RBG大神對此進行了研究測試,發現效果並很差,具體的緣由我先賣個官子。

    這時候停下來思考一下整個目標檢測步驟該是怎麼樣的

    1. ss獲得侯選框
    2. 檢測侯選框中的是不是目標的得分狀況
    3. 按照得分狀況對侯選框進行排序,而後按照某種規則篩除一些框
    4. 對最後剩下的框作一個邊框迴歸(將框位置和大小微調一下))

乍看好像挺合理的,直接用AlexNet計算預選框爲目標的機率(softmax輸出爲機率)就行了啊,而後按照上面步驟進行下去,那麼這樣的話,最終的準確率會讓你大大的失望了,研究人員的一直在作的事情就是想不斷的提升正確率以致於想出了各類巧妙的辦法,而咱們這裏的作法不以爲太粗魯了嗎?爲何呢?這和咱們的數據有很大的關係,AlexNet訓練用的數據或者說不少其餘的圖片分類網絡使用的訓練圖片每每是圖片中間是事物的主體,並且幾乎沒什麼噪音,而咱們這裏使用ss獲得的2000個預選框狀況真的是慘不忍睹,絕大部分都是背景不說,就算框中有主體存在,那也每每是殘缺不全的(只框到了部分),因此這樣的網絡是不能直接用的,咱們要用本身的數據fine-tuning一下(訓練一下CNN)

  • fine-tuning

    首先咱們標註數據,用於訓練CNN,使用SS得到的2000個預選框,IoU(不懂的本身查下吧,10s就懂)>0.5的標記爲正樣本,反之爲副樣本,以前說過去掉最後一層(去掉fc8,其原來爲1000),改成20,而後隨機初始化這一層的參數,其餘層參數不變,採用SGD,學習速率設置爲0.001(由於原AlexNet使用的是0.01,這樣設置的好處是不會爲原來網絡的參數形成大的影響,只是在微調),batch size爲128(32個正樣本,96個副樣本),你可能還會想,使用這樣的數據進行訓練,最後獲得的結果會好嗎

    其實這樣有點像是被牽着鼻子走的感受,可是不要着急,學習的過程原本就是會有好多突然想不明白的地方,畢竟是在用短短几天的時間去感悟別人辣麼久的研究成果
  • 訓練SVM

    在作完上一步的fine-tuning後,咱們並非要使用其來預測預選框中內容爲目標的機率,而是要使用fc7層(20分類的softmax前一層)的特徵來訓練SVM(由於是20分類,因此訓練20個SVM),負樣本爲IoU<0.3(包含徹底沒框住目標的,好比背景,以及框住了目標一點點部分的,這樣的預選框並無意義,因此將其認定爲負樣本),正樣本爲將目標徹底框住的預選框

    那麼先使用CNN+softmax進行fine-tuning,而後再使用SVM的意義在哪裏呢?爲何不直接單獨使用softmax進行預測,或者單獨使用SVM進行訓練預測呢?爲何要使用不一樣的定義正負樣本的策略呢?其實這一切的緣由其實都是因爲咱們的訓練數據致使的。 首先咱們知道CNN+softmax訓練是十分容易過擬合的,由於softmax loss計算的是機率,這樣的損失函數對於精度的追求是無止境的,只要繼續訓練,很容易就會產生過擬合的狀況,每每的解決辦法是使用大量的數據,而目標檢測缺乏的就是大量的數據。SVM使用的是打分策略,一旦分數超過那個delta,就不會再繼續調整了,因此其使用小樣本訓練效果也會很好。因此咱們天然而然的就想到了直接使用SVM(不進行fine-tuning,直接抽取fc7的特徵進行訓練),可是效果慘不忍睹,緣由是什麼我上面也解釋過,由於不合適,事實上RBG大神在訓練的時候,試過直接使用conv五、fc六、fc7進行SVM訓練,可是準確度實在是過低(精度上不去),甚至其中結果最好的是使用conv5,因此他想到了仍是必需要進行fine-tuning,因而便使用CNN+softmax測試了一下,並且爲了防止過擬合的問題,特地的將loU設置爲0.5,達到了沒有‘’過擬合‘’,而後使用fine-tuning後的conv5,fc6,fc7進行了SVM測試,發現fc7的準確率爆棚。

    那麼爲何SVM的正負樣本閾值要那樣設置呢? 關於負樣本的閾值設定,做者測試了IoU閾值各類方案數值0,0.1,0.2,0.3,0.4,0.5。最後經過訓練發現,若是選擇IoU閾值爲0.3效果最好(選擇爲0精度降低了4個百分點,選擇0.5精度降低了5個百分點),即當重疊度小於0.3的時候,咱們就把它標註爲負樣本。而正樣本確定是要設定爲將目標徹底框住的預選框了,這樣訓練後的結果是,可以很是逼近目標的預選框將會獲得高分。

  • NMS(Non-Maximum Suppression 非極大值抑制)

    當SVM訓練完畢後,咱們將一張圖片的2000個預選框輸入,最終獲得2000*20的矩陣(2000表明預選框的數量,20表明每一個預選框在每一個類別的得分(置信度)),而後使用NMS篩除絕大部分的多餘的預選框,具體作法以下

    1. 首先從每一個預選框中找出最高得分類,肯定預選框的預測結果
    2. 一共20個類別,從第一個類別開始,將全部屬於這個類別的預選框放到一個集合Bi(i表明第幾個類別)中,按照分數進行排序,從高到低,使用最高分如下的全部預選框和最高分預選框計算IoU,若是IoU大於設定的閾值,則將這些符合的條件的預選框刪除(目的是對於同一個目標只保留一個得分最高的預選框),而後將最高分預選框放入目標集合Di中,剩下的預選框繼續重複這個過程,直到這個集合爲空。

      舉慄:當前排序爲 A B C D E F G,A得分最高,使用 B C D E F G和A計算IoU,結果B D E都符合,則從集合中去掉B D E,此外將A放入另外一個目標集合中,這時候當前集合只剩下C F G,F和C的IoU值符合,去掉F,C加入目標集合,此時集合中只剩下G,將G放入目標集合,當前集合爲空,而後進行下一個類別的判斷
  • Bounding box regression(邊框迴歸)

    (邊框迴歸終於來啦,此真乃神來之筆,之前歷來沒想過迴歸還能這麼用,真的是長見識了,也但願各位能感覺到其精髓之處,還有就是邊框迴歸在後面還會一直使用,必定要搞懂了)

    網上關於邊框迴歸的介紹少之又少,我也不知道個人解釋會不會讓大夥滿意,先看着吧,有什麼不理解的留言就行了

    在上一步NMS後,咱們獲得了一些預選框(以下圖所示,圖是盜來的...)

bbox.png

咱們獲得的篩選後的預選框多數狀況是如圖中紅框所示,雖然框住了主體部分,可是和gt依然有些出入,咱們須要使用邊框迴歸將其微調一下,具體作法以下所示

bbox1.png

* p爲篩選後的預選框
* G^爲咱們進行邊框迴歸後的目標
* G爲gt

邊框迴歸想作的事情很簡單也很容易想到,描述一個預選框的信息有 (x,y,w,h),x,y表明其中心點的座標,w表明寬,h表明高,想要實現預選框與gt之間的變換,咱們只要可以將(x,y)平移到gt的中心,而後對w和h進行伸縮變換就行了(即進行一個平移變換和一個伸縮變換)

先看論文給出的公式(markdown不知道怎麼打這公式,我就截圖了截圖來源,侵刪)

bbox2.png

從上面公式中能夠看出,在進行迴歸訓練的時候,咱們輸入的是預選框的pool5層的特徵(AlexNet的第五個卷積層後跟着一個max pooling,就是這裏的咱們預選框的輸入,pool5的特徵信息中包含了預選框抽象後的一些特徵),gt的(x,y,w,h)做爲‘’標籤‘’來進行監督訓練,下面我來講一下本身對這些的理解

首先我第一次看到這裏的時候以爲很詫異,一個迴歸是如何作到 僅僅輸入一個預選框的信息 就能獲得校訂信息的?要知道咱們在測試的時候,僅僅只輸入預選框的數據,整個迴歸是對全圖絕不知情的,感受這樣的過程很難以想象,因而對其特別感興趣

每當我遇到本身沒法理解的東西時候,都會提醒本身是否是陷入思惟誤區了,並且這僅僅是一個線性迴歸,這不像是深度神經網絡這樣的黑盒子,讓人徹底摸不到頭腦。試想一下,人類在見到半個小貓的身體的時候,是大概可以猜想出來小貓頭的位置的,這裏應該也是相似的,咱們經過對預選框pool5層數據進行訓練,讓其對一個目標的‘’總體‘’敏感,從而當咱們輸入的預選框沒有徹底框中目標的時候,它知道這個預選框與真是的目標相差了多少,從而給咱們以反饋

咱們但願學習到平移量和伸縮量,有的人會想,既然已經作的是迴歸了,爲何不直接返回具體的平移量和伸縮量,使得Px ,Py直接加上,Pw Ph直接乘上,這固然是不行的,想象一下歸一化,由於輸入的圖片大小是不同的,因此平移的值有大有小,當咱們不想讓網絡學習到大小差別的時候,通常作法都是歸一化(即將有量綱轉爲無量綱),因此咱們這裏除以Pw,Ph

而至於爲何在進行伸縮計算處理的時候要加上log形式,我認爲是由於在Loss函數中,tx,ty是有正負之分的,因此也要將其處理爲相同的形式,將原來的(0,+無窮)映射到(-無窮,正無窮)(固然不會無窮這個誇張了...)

上面的優化函數你們應該都看得懂,最後加入了L2正則

2018-08-24 10-09-31屏幕截圖.png
2018-08-24 10-09-44屏幕截圖.png

最後訓練完畢後,按照上面式子便可獲得結果(d(P)表明pool5特徵通過變換後)

哇,RCNN終於說完啦,不得不說,RCNN想法巧妙,做者真的奇思妙想,可是確實是太複雜了,徹底沒有端到端的那種爽感,像是在東拼西湊,不過有了這些基礎打底,後面的看起來會很輕鬆的,若是以爲這裏有哪些不懂的或者一時間難以接受的,不要着急,慢慢理解嘛或者留言,畢竟我光寫就寫了很久的了,拜了個拜~


Fast R-CNN

在談Fast RCNN以前,先介紹在RCNN後的新技術

SPP Net

SPP Net由如下兩部分組成

SPP (Spatial Pyramid Pooling 空間金字塔池化)

在RCNN中,預選框大小不一,而圖片輸入CNN後通過卷積,還須要進行全鏈接,很顯然輸入不一樣大小的圖片將會致使全鏈接層沒法工做,因此全部的預選框在輸入CNN以前都通過了crop(剪裁)或者warp(拉伸扭曲),以固定的大小輸入,雖然RCNN做者嘗試了使用不一樣的變形操做從而使得精度較高,但無論怎樣都不能否認的是圖片確實變形了,在必定程度上使得圖片失真,從而影響到了最終的效果,而SPP的思想即是不管你輸入的圖片大小是多少,使用不一樣尺度的池化層將其變爲固定大小的特徵(詳情見下圖)

ssp.png

假設我輸入的圖片經層層卷積處理後,到達SSP層,當前大小爲40*60*256

  • 金字塔第一池化層,將輸入特徵切分爲140*60*256特徵,對其池化,獲得1個256維度特徵
  • 金字塔第二池化層,將輸入特徵切分爲420*30*256特徵,對其池化,獲得4個256維度特徵
  • 金字塔第三池化層,將輸入特徵切分爲1610*15*256特徵,對其池化,獲得16個256維度特徵

將上面的到的256+4*256+16*256特徵疊加起來,做爲全鏈接層的輸入,就是這麼簡單啦,可是效果是出奇的好,這個算法也是何凱明大神提出的

ROI映射到feature map

ROI(region of interest)即咱們以前提到的預選框,這個想法的具體內容是,經過SS選擇出來的2000個預選框輸入CNN計算特徵速度太慢,爲何不把整張圖直接輸入CNN,獲得一整張圖的特徵,而後根據各個預選框的位置從那個一整張圖的特徵中crop對應的特徵,再輸入SPP進行運算呢,後來通過這般改進後,準確度沒有受影響,而速度提升了好多好多(示意圖在下面)

ROI.png

在RCNN的基礎上加上以上兩項技術,即組成了SPP Net,可是即使這樣,依然是存在些許問題的,而Fast RCNN即解決了不少問題

ok,下面說一下Fast RCNN的改進之處


RCNN.png

RCNNloss.png

上圖即是Fast RCNN的網絡結構了,其相對於RCNN的更改之處在於,將原來的pool5層替換爲Rol池化層,在原來的全鏈接層後又加上了一個bbox迴歸

Rol池化層是簡化版的SPP,它只進行一次池化,即將輸入的預選框的映射特徵分割爲r*r塊區域,再進行池化

分類不在是之前的先softmax分類進行fine tuning,而後svm再使用分類,而後再bbox迴歸,如今而是分類bbox迴歸同時進行,即完成了端到端

若是是一直看下來的同窗,確定會有疑惑,大概的疑惑應該是如下幾點

  • RCNN中說若是不fine tuning準確度會大大降低,這裏這樣作效果會好嗎
  • RCNN中說由於數據少,直接使用softmax分類會致使過擬合,那爲何還要用softmax呢,svm爲何不用了呢?
  • 不進行fine-tuning而直接進行bbox迴歸,準確率會高嗎?

上面應該是一些直觀的問題,我說一下本身的理解,具體的分析推薦你們看一篇博文,裏面說的已經很詳細了

先說說做者爲何再也不使用原來的RCNN和SPP那種結合模式,其一,分步的訓練很繁瑣,一個環節出問題,步步出問題,前面步驟一旦肯定就再也不改動了,很死板。 其二,不管是訓練仍是測試的時候,由於要使用到pool5和fc7的特徵,須要佔用磁盤存儲空間,致使速度變慢,其三,由於訓練是分步驟的,使得後面svm的訓練和bbox迴歸的反饋沒法傳遞迴CNN,也就沒法進行訓練調整,阻礙了準確率的進一步的提高,其四,spp由於使用的是金字塔池化,致使反向傳播的時候效率低下,或者說很難反向傳播
說到這裏,大概應該能有一點感受,Fast RCNN的這種採用multi-task loss將會相輔相成的訓練網絡,並且訓練的數據也要按照要求處理,具體的細節請看下面博文,遇到不理解的地方,能夠留言

Fast R-CNN學習筆記


Faster RCNN

哇,終於寫到Faster ECNN了,原本覺得學習目標檢測的演進會是一件很快的事情,結果拖了那麼久了...想玩徹底理解真的是一件很費時的事情啊

在這篇中,我還寫寫如何在caffe下訓練Faster RCNN以及對代碼作一些註釋說明,還會再作一個基於Faster RCNN的小項目吧,let's begin

(aaaaaaaaaa,今天寫的一天的東西丟掉了。。。。。。。。好難受啊,我之後寫東西的時候不再走神了,我決定直接代碼開始了,今晚要是讓我再寫一遍,我會崩潰了,等那天心情好了再從新寫好了,說不定那時候會有更深入的認識呢)

相關文章
相關標籤/搜索