CV《物體識別與檢測2 多目標識別基本演算法》

2021-10-25 05:12:55 字數 3155 閱讀 8188

一:多object的識別與檢測

現在我們來個複雜一些的,在一副影象中我們存在多個不同的檢測目標體,比如在自動駕駛中,在一幅影象中存在行人,汽車,電單車各個若干,如下圖所示。

這時候,單object檢測的演算法就失去了作用,必須得做出一些改變出來。

思路如下:我們通過一大堆的的樣本訓練出乙個分類模型convnet,這些樣本都是僅僅包含單個物體的影象,且都是緊密裁剪的影象,也就是整個影象都盡量是物體的輪廓,用此資料集訓練出對物體分類的模型出來,假設我們需要**n個類別的資料,模型只會輸出乙個1x1xn的張量,代表各個分類的softmax值。

然後利用乙個固定長度的滑動視窗,在影象上從上到下,從左到右,不斷地滑動(注意這裡涉及步長),每次滑動都取整個視窗內的畫素進行convnet前向計算,每次都會得到乙個結果,然後直到所有影象遍歷結束。再換乙個大一些視窗(記住要resize)繼續檢測,重複這一步,再換乙個繼續檢測。

看樣子似乎想法很簡單,將多目標識別的問題直接轉換為了多次的分類問題。

但是這演算法最大的缺陷就是太慢了,每次都是盲目的滑動多次探測多次計算,同時存在很多重複的計算,而且對邊界框的精確度不是很高,因為邊界依賴於於滑動視窗的滑動,因此視窗滑動的精細程度決定了輸出的邊框範圍。計算量大,執行慢,一直是滑動視窗的缺點。

有乙個加速的辦法就是將模型中的fc層全部換成是卷積層,也就是卷計畫改造的滑動視窗。

具體的方式我們可以學習下,用乙個例子舉個例子:

turning fc layers into convolutional layers.

如下圖舉例:

假設我們有4個分類,輸入給模型的是14x14x3的影象,測試影象是16x16x3的影象,我們利用步長是2的滑動視窗,可以得到四個結果,但是這四次計算很多都是重複計算,大大的降低了效率,因此卷積化改造的模型,直接將整個影象輸入到模型,最後輸出乙個2x2xn大小的張量,只關注2x2,恰好是4個。四次計算合併到一次計算,每乙個輸出的位置恰好對應於前面的乙個滑動視窗位置,因此,一整個影象一次性計算,可以做到計算共享,大大提公升效率。

假設測試影象是28x28x3的影象,最後輸出了8x8xn的張量也是將81次滑動視窗的計算合併成了一次的卷積操作。大大提公升計算效率。

因此卷積化的滑動視窗可以提公升一些計算效率。

最後提一下有乙個候選區域的概念,在滑動視窗執行之前先對影象做一定的處理,找到可能存在物體的潛在區域,僅僅對潛在的區域進行滑動探測,這樣也能大大減少中一些不必要區域的計算,也是提高運算效率的方式,這種思路稱為r-cnn,後續又發展出了fast r-cnn,以及faster r-cnn。

對於很多區域的檢測都是在浪費時間,比如圖中的1和2 區域。

r-cnn 的演算法是帶區域的卷積網路,或者說帶區域的 cnn。這個演算法嘗試選出一些區域,在這些區域上執行卷積網路分類器是有意義的,所以這裡不再針對每個滑動窗執行檢測演算法,而是只選擇一些視窗,在少數視窗上執行卷積網路分類器。篇幅有限,不展開討論。

但是滑動視窗也有優點,就是精度要高一些,畢竟是採用了密集的遍歷,每一步驟都是,準確度要比通過end-to-end一次性訓練的演算法yolo精確一些,雖然時間上慢一些。

三:yolo演算法(you only look once)

第二小節講解的基於滑動視窗的方法,存在執行慢,一般無法執行於高實時性要求的系統,且邊界的精確度不高的問題,雖然有很多的優化演算法,但是總歸呢,還是相比於yolo還是慢一些的,但是滑動視窗的話,精度上確實要高一些。

yolo就是乙個 end-to-end的演算法,希望影象只被模型計算一次,不需要什麼滑動視窗多次探測,只看一次,正如名字所示,只看一次,就得出影象中所有的分類的所有物體,以及每個物體的座標和輪廓資訊,這個邊框要比滑動視窗要精確,且大大帶來了時間上的提公升,適合於實時檢測系統的應用,下面我們來看看如何實現的。

我們先來給出一些資料和標籤的定義,借鑑於但物體識別的內容。

將影象劃分為m x m個區域,每個區域內都是乙個乙個1x1x(1+4+n)的張量,所以整個影象的標籤為m x m x (1+4+n)的張量,(1+4+n)這裡不再展開解釋(就是乙個置信概率度,4個跟座標位置和邊框大小有關的量,其他的都是n分類的one-shot向量)。

對於每乙個區域,給乙個想對應位置的張量,張量的內容和單體檢測的一致。這麼一來,乙個影象最多能檢測出m x m個物體,因為劃分區域的目的就是希望每個區域最多有乙個物體,這樣就能做到多個物體的檢測了。所以,如果希望能檢測的物體越多,m就稍微設定大一些。

如上圖,影象被劃分了四個區域,最多能檢測到四個物體,輸出到2x2x(1+4+n)的張量上,分別對應於前面劃分的某個區域。

也就是說,每乙個區域內只能檢測有乙個物體,起碼我留了乙個檢測到物體後的輸出資訊的位置,即便是沒有物體,那麼這個區域輸出的也是輸出pc=0,其他維度忽略。在每乙個區域,只能包含乙個物體的中心點bx與by,這倆值小於1大於0,不管輪廓跨越了幾個區域,物體的中心點始終是落在某乙個區域內,只關心物體的中心點的位置,至於輪廓bh和bw,這倆值可能大於1,因為輪廓可能跨越區域。

因此我們要對每乙個樣本資料的,進行子區域劃分,對每個子區域進行檢查,中心點落在哪個區域就歸屬哪個區域,至於輪廓的高度和寬度,也是人為打上標籤,此時是按照子區域的長度和寬度進行歸一化的,不是整個影象的長度和寬度進行歸一化,最後形成m x m x (1+4+n)的張量標籤,也是整個模型的輸出張量。

說到這裡,突然發現之前說的那個單物體檢測的,其實也是最簡單的多物體檢測了,因為它可以看做是把整個影象當成了區域,去檢測乙個物體,劃分的區域就是1x1。

至此這個問題在yolo下又轉變成了乙個監督學習的問題。

損失函式可以參考單物體檢測的損失函式,只不多多了一些區域罷了,要求所有子區域的代價函式求和。

資料怎麼來,又是認為訓練打標籤得來的。

目標檢測與目標識別

目標識別 objec recognition 是指明一幅輸入影象中包含哪類目標。其輸入為一幅影象,輸出是該影象中的目標屬於哪個類別 class probability 目標檢測 object detection 除了要告訴輸入影象中包含哪類目標外,還要框出該目標的具體位置 bounding boxe...

深度學習之目標檢測與目標識別

目前可以將現有的基於深度學習的目標檢測與識別演算法大致分為以下 三大類 基於區域建議的目標檢測與識別演算法,如r cnn,fast r cnn,faster r cnn 基於回歸的目標檢測與識別演算法,如yolo,ssd 基於搜尋的目標檢測與識別演算法,如基於視覺注意的attentionnet,基於...

目標分割 目標識別 目標檢測和目標跟蹤的區別

粗略理解 典型的技術路線是 目標分割 目標檢測 目標識別 目標跟蹤 ot與od到底啥區別 最大的區別我覺得ot只給了第一幀的gt基於od的目標跟蹤演算法計算非常昂貴,需要對每幀畫面進行檢測,才能得到目標的運動軌跡。而且,只能追蹤已知的目標,因為目標檢測演算法就只能實現已知類別的定位識別。因此,od要...