您當前的位置:首頁 > 書法

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

作者:由 捲餅 發表于 書法時間:2021-10-22

Yolov3

2018年

發明提出的,這成為了目標檢測

one-stage

中非常經典的演算法,包含

Darknet-53網路結構、anchor錨框、FPN

等非常優秀的結構。

Yolov3的論文地址:

先說一段閒話:對於自動駕駛的感知演算法我也在探索,目標識別也絕對是感知演算法中不可缺少的一份子,但是看了很多Yolov3的文章,覺得都沒說清楚,於是決定自己寫一篇。

單目標識別

我們先從單目標開始看。我們有三個類別(狗,貓,鼠),現在我有一張狗的圖片,那它的標籤是什麼樣的?

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

先看標籤都需要些什麼?

1。圖中是否存在我們要找的目標(狗,貓,鼠);

2。標出目標的框的資訊(這裡我們把影象看作是單元格,左上角為(0,0),右下角為(1,1));

3。框出的是哪一個目標(目標的類別);

首先用標籤

P_{C}

來區分前景與背景,

P_{C}

表示影象上是否含有目標物件,這裡指的是我們提到的三個類別狗,貓,鼠。有記為1,沒有記為0。

紅框表示目標的位置資訊,用以下4個引數標出:

b_{x}

指目標框中心點的x座標,

b_{y}

指目標框中心點的y座標,

b_{h}

指目標框的高度,

b_{w}

指目標框的寬度。

最後要有類別資訊,我們有3個類,格式就寫成

[c_{1},c_{2},c_{3}]

(依次指的是狗,貓,鼠)。

那對於上圖我們寫出標籤:

y=\begin{bmatrix} P_{C}\\  b_{x}\\  b_{y}\\  b_{h}\\  b_{w}\\  c_{1}\\ c_{2} \\ c_{3}    \end{bmatrix} = \begin{bmatrix} 1\\  0.4\\  0.5\\  0.9\\  0.55\\  1\\  0\\  0 \end{bmatrix}\\

多目標識別

這是對於單目標,但要是有多個目標呢?比如下圖又有人又有鷹還有馬怎麼辦呢?

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

那我們就不把它當成一張圖片,把它切成小塊,如下圖所示(對不起了我畫圖就這水平,將就著看吧)。

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

我們把圖片切成不同的塊,將每一塊看成單元格,圖中的三個目標的中心點就落到了不同的單元格里面了,我們可以為每一個網格都制定一個目標標籤y。我們取出有馬中心點(深綠色點)的單元格為例。既然是單元格,我們把左上角看作(0,0)點,右下角看作(1,1)點。

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

P_{C}

表示此時的單元格中是否含有目標的中心點;(這裡有馬的中心點,所以是1)

b_{x}

指目標框中心點在單元格內的x座標;(中心點距離單元格左側大概有0。4的距離,所以這裡

b_{x}

是0。4)

b_{y}

指目標框中心點在單元格內的y座標;(中心點距離單元格上側大概有0。8的距離,所以這裡

b_{y}

是0。8)

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

b_{h}

指目標框的高度相對於單元格高度的比例;(馬的框的高度大概等於2。4個單元格高,所以這裡

b_{h}

是2。4)

b_{w}

指目標框的寬度相對於單元格寬度的比例;(馬的框的寬度大概等於3。2個單元格寬,所以這裡

b_{w}

是3。2)

對於這個分類如果是四個類別(馬,人,鷹,車),那類別向量就是

[c_{1},c_{2},c_{3},c_{4}]

(依次為馬,人,鷹,車)(這裡我們寫為

\left[ 1,0,0,0  \right]

)。

由此可得這個單元格的標籤為:

y=\begin{bmatrix} P_{C}\\  b_{x}\\  b_{y}\\  b_{h}\\  b_{w}\\  c_{1}\\ c_{2} \\ c_{3} \\ c_{4}   \end{bmatrix} = \begin{bmatrix} 1\\  0.4\\  0.8\\  2.4\\  3.2\\  1\\  0\\  0\\ 0 \end{bmatrix}\\

如果單元格里沒有任何中心點該怎麼辦呢?那我們把標籤寫成:

y=\begin{bmatrix} P_{C}\\  b_{x}\\  b_{y}\\  b_{h}\\  b_{w}\\  c_{1}\\ c_{2} \\ c_{3} \\ c_{4}   \end{bmatrix} = \begin{bmatrix} 0\\  ?\\  ?\\  ?\\  ?\\  ?\\  ?\\  ?\\ ? \end{bmatrix}\\

?代表沒有意義了,就是這對我們而言沒用了。

同單元格多目標識別,Anchor box的引入

那問題又來了,萬一一個單元格內落了兩個中心點,這怎麼辦?

對,確實存在這種情況。

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

圖中模特和車的中心點就在同一個單元格中,那怎麼填寫標籤都會忽視另一個,這時候我們就需要引入

Anchor box(錨框)

。Anchor box是什麼呢?我們想一想為什麼我們要把影象切成好多塊?單個影象想識別多個目標,影象的單位是1,從1想識別多是不可能的,只能拆成多個塊,從多識別多。那現在多個塊還是不夠用,那怎麼辦?繼續得把一個塊變成多個,但也不能按照老方法切塊啊,這就用到了錨框。我給每個塊畫好幾個框,這不就又變成多個了嗎?

比如,這裡的模特和車的中心點擠到了一個塊裡,那我就給塊畫兩個框,

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

那我對於每個Anchor box都有標籤

y(anchor box1)=\begin{bmatrix} P_{C}\\  b_{x}\\  b_{y}\\  b_{h}\\  b_{w}\\  c_{1}\\ c_{2} \\ c_{3}    \end{bmatrix} =\begin{bmatrix} 1\\  b_{x1}\\  b_{y1}\\  b_{h1}\\  b_{w1}\\  1\\ 0 \\ 0   \end{bmatrix}  \\y(anchor box2)=\begin{bmatrix} P_{C}\\  b_{x}\\  b_{y}\\  b_{h}\\  b_{w}\\  c_{1}\\ c_{2} \\ c_{3}    \end{bmatrix}=\begin{bmatrix} 1\\  b_{x2}\\  b_{y2}\\  b_{h2}\\  b_{w2}\\  0\\ 1 \\ 0  \end{bmatrix}

當然,實際中肯定不止兩個,可能會到達6,7個。本來格子切的就細,每個格子錨框又多,如果一個小格子塞了7,8箇中心點,我覺得人也很難看出來吧,我一直主張機器學習只能完成人可以完成的任務,人都做不到就不要強求機器去做了。

框框框(錨框、真實框、預測框)

我們有了錨框,透過錨框算出我們需要的預測框,再根據預測框與真實框的差距最佳化模型。思路終於浮現了。

那我們如何得到預測框呢?上面我們提到,預測框都是從錨框得到的。

先看我們想要預測的標籤

y=\begin{bmatrix} P_{C}

其中

P_{C}

都與框無關,只與識別有關,就不多說了,不會的去看看影象分類。

b_{x}

這四個值在Yolov3中又有什麼意義呢?

b_{x}

表示預測框中心點距離影象最左邊的距離

b_{y}

表示預測框中心點距離影象最右邊的距離

b_{h}

表示預測框的高度

b_{w}

表示預測框的寬度

透過錨框我們需要預測四個數值,分別為:

1。與x座標偏移量有關的

t_{x}

2。與y座標偏移量有關的

t_{y}

3。高度的尺度縮放:

t_{h}

4。寬度的尺度縮放:

t_{w}

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

從圖中我們能看到各個引數的對應關係。

b_{x}=h_{x}+c_{x}\\ b_{y}=h_{y}+c_{y}\\ b_{w}=p_{w}h_{w}\\ b_{h}=p_{h}h_{h}

我們看到

h_{x},h_{y}

是在單元格之中的,它們不能大於1,但是預測的數值可不是我們能控制的,我希望它不大於1它就不大於1了嗎?所以這裡我們用一個sigmod函式來限制主數值的範圍,把

h_{x},h_{y}

寫成:

h_{x}=\sigma(t_{x})\\ h_{y}=\sigma(t_{y})

這樣就束縛住了

h_{x},h_{y}

的範圍了。但還有一個問題,這個比例係數

h_{w},h_{h}

得大於0啊,邊長不能小於0吧,那我們把

h_{w},h_{h}

寫成:

h_{w}=e^{t_w}\\ h_{h}=e^{t_{y}}

這樣對應關係就變成了論文裡的格式了

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

好傢伙,寫了這麼多才把論文第一小節的公式推出來。還好後面就快了。順帶一提,標籤是按照單元格寫的,不是按照錨框寫的,這意味著本來我們的標籤長度是(1+4+類別數),但是現在一個單元格里有n個錨框,那這個單元格的標籤就是各個錨框標籤的拼接,長度為(1+4+類別數)*n,比如:

y=\begin{bmatrix} P_{C1}\\  b_{x1}\\  b_{y1}\\  b_{h1}\\  b_{w1}\\  c_{11}\\ c_{21} \\ c_{31} \\ ...\\ P_{Cn}\\  b_{xn}\\  b_{yn}\\  b_{hn}\\  b_{wn}\\  c_{1n}\\ c_{2n} \\ c_{3n} \\ \end{bmatrix}\\

我們知道了錨框怎麼生成預測框,但是我來識別一個目標,那每一個錨框都要出一個預測框嗎?當然不是,我們只用這麼多錨框中的一個就行。

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

圖中有三個黃色錨框和一個紅色真實框,那我們用哪一個錨框呢?很簡單,計算所有錨框和真實框的IOU(交集面積比並集面積,不會可以查查,太簡單了我都沒寫帖子),選IOU最大的那個即可。方法上我們都說完了,該看看網路結構和公式了。

網路結構

它這個網路講究合久必分,分久必合。為什麼這麼說呢,看下它的網路結構,想看,看不到,論文裡都沒有,借大白大佬的圖解釋一下。

先弄清楚輸入輸出,輸入是圖片,輸出是我們的標籤,這都沒有問題。

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

從結構看我的目標並不是單純的一個輸出,而是不同尺寸的輸出,但關鍵是他用了darknet-53的特徵提取網路結構。我們看一下darknet-53的網路細節。

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

這裡第一列是每層的型別,第二列是每層卷積核的數量,第三列是卷積核的尺寸,最後一列表是輸入輸出矩陣的大小。這裡的層數有點多,我們慢慢看。

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

先看size裡面有一些有/2的,指的是步長為2的卷積操作,可以將輸入的特徵圖的長寬都縮小一半,從而進行下采樣(下采樣:是輸入圖片的尺寸變小,上取樣:是輸入圖片的尺寸變大)這樣相比於最大池化可以減少特徵資訊的損失。

左邊的

1\times,2\times,8\times,4\times

表示重複當前層。看看被重複的層都是一個結構

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

都是由兩個卷積層和一個殘差層構成,那步長為1的有47層,步長為2的有5層,加上一層全連線層一共53層。darknet-53在Imagenet上精確度與Resnet-101,甚至resnet-152精度差不多,毒素卻快很多,層數也少。

殘差層是參照Resnet的殘差層設計的,透過跨層連線,來緩解梯度爆炸,梯度消失等問題。

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

為了方便理解,我們將下采樣和歩長為1的重複操作看為一個整體,記作Res

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

上圖就看成一個完整的結構,記為Res8。同樣還有Res1,Res2和Res4。

而網路中的Convolutuon實際上是由卷積(Conv)+BN+Leakyrelu組成,記為CLB。

那現在整個網路可以畫成

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

這是一個分類網路,但是Yolov3可不僅僅是為了分類,還要做目標定位,一時我們可以將池化,全連線,softmax砍掉,接上我們的三種尺寸的特徵圖,就得到如下結構。這也是完整的Yolov3的結構。

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

我們來看看各層傳遞的引數格式

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

看到我們從Backbone輸入到Neck中的尺寸分別為13*13,26*26,52*52。

先將13*13輸入經過一些列操作加上取樣變成26*26。在進行concat,得到的特徵圖大小任為26*26。cancat如圖左下所示,26*26*256與26*26*256concat之後變成了26*26*512大小。同樣可以得到53*53的輸出。最終得到各種尺寸*21的結果。這個21就是我們之前提到的標籤。

訓練過程

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

我們知道了當前網路的輸入和輸出。得到

(obj,t_{x},t_{y},t_{h},t_{w},cls)

,透過我們上面講的錨框算出預測框,就可以透過這組結果配合錨框生成預測框、前景機率(obj也是前文的

P_{C}

)和類別(cls)。

Yolov3可是有監督學習,對應的還有我們的樣本

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

得到不同尺寸下真實樣本的標籤。這樣我們就將預測框與真實框關聯起來。

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

透過這種方法就可以訓練Yolov3的網路。

測試過程

【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框

先將圖片透過網路算出

(obj,t_{x},t_{y},t_{h},t_{w},cls)

,得到了預測框的資訊,再計算得分

conf\_socre=obj*cls\\

obj就是我們的前景機率,cls就是我們的分類機率。併為conf_score其設定閾值,過濾掉分數過低的框。然後將所有尺寸的框回映到原圖上。不過此時還是會有很多的框。所以我們透過nms非極大值抑制消除重疊框。這樣就得到了最終的預測框。

參考

參考了大白大大影片,講的挺好,推薦大家看看。

標簽: 單元格  中心點  我們  標籤  錨框