【目標識別】Yolov3細緻詳解,從作者的角度出發慢慢推理模型,小白都能看得懂的框框框
Yolov3
是
2018年
發明提出的,這成為了目標檢測
one-stage
中非常經典的演算法,包含
Darknet-53網路結構、anchor錨框、FPN
等非常優秀的結構。
Yolov3的論文地址:
先說一段閒話:對於自動駕駛的感知演算法我也在探索,目標識別也絕對是感知演算法中不可缺少的一份子,但是看了很多Yolov3的文章,覺得都沒說清楚,於是決定自己寫一篇。
單目標識別
我們先從單目標開始看。我們有三個類別(狗,貓,鼠),現在我有一張狗的圖片,那它的標籤是什麼樣的?
先看標籤都需要些什麼?
1。圖中是否存在我們要找的目標(狗,貓,鼠);
2。標出目標的框的資訊(這裡我們把影象看作是單元格,左上角為(0,0),右下角為(1,1));
3。框出的是哪一個目標(目標的類別);
首先用標籤
來區分前景與背景,
表示影象上是否含有目標物件,這裡指的是我們提到的三個類別狗,貓,鼠。有記為1,沒有記為0。
紅框表示目標的位置資訊,用以下4個引數標出:
指目標框中心點的x座標,
指目標框中心點的y座標,
指目標框的高度,
指目標框的寬度。
最後要有類別資訊,我們有3個類,格式就寫成
(依次指的是狗,貓,鼠)。
那對於上圖我們寫出標籤:
多目標識別
這是對於單目標,但要是有多個目標呢?比如下圖又有人又有鷹還有馬怎麼辦呢?
那我們就不把它當成一張圖片,把它切成小塊,如下圖所示(對不起了我畫圖就這水平,將就著看吧)。
我們把圖片切成不同的塊,將每一塊看成單元格,圖中的三個目標的中心點就落到了不同的單元格里面了,我們可以為每一個網格都制定一個目標標籤y。我們取出有馬中心點(深綠色點)的單元格為例。既然是單元格,我們把左上角看作(0,0)點,右下角看作(1,1)點。
表示此時的單元格中是否含有目標的中心點;(這裡有馬的中心點,所以是1)
指目標框中心點在單元格內的x座標;(中心點距離單元格左側大概有0。4的距離,所以這裡
是0。4)
指目標框中心點在單元格內的y座標;(中心點距離單元格上側大概有0。8的距離,所以這裡
是0。8)
指目標框的高度相對於單元格高度的比例;(馬的框的高度大概等於2。4個單元格高,所以這裡
是2。4)
指目標框的寬度相對於單元格寬度的比例;(馬的框的寬度大概等於3。2個單元格寬,所以這裡
是3。2)
對於這個分類如果是四個類別(馬,人,鷹,車),那類別向量就是
(依次為馬,人,鷹,車)(這裡我們寫為
)。
由此可得這個單元格的標籤為:
如果單元格里沒有任何中心點該怎麼辦呢?那我們把標籤寫成:
?代表沒有意義了,就是這對我們而言沒用了。
同單元格多目標識別,Anchor box的引入
那問題又來了,萬一一個單元格內落了兩個中心點,這怎麼辦?
對,確實存在這種情況。
圖中模特和車的中心點就在同一個單元格中,那怎麼填寫標籤都會忽視另一個,這時候我們就需要引入
Anchor box(錨框)
。Anchor box是什麼呢?我們想一想為什麼我們要把影象切成好多塊?單個影象想識別多個目標,影象的單位是1,從1想識別多是不可能的,只能拆成多個塊,從多識別多。那現在多個塊還是不夠用,那怎麼辦?繼續得把一個塊變成多個,但也不能按照老方法切塊啊,這就用到了錨框。我給每個塊畫好幾個框,這不就又變成多個了嗎?
比如,這裡的模特和車的中心點擠到了一個塊裡,那我就給塊畫兩個框,
那我對於每個Anchor box都有標籤
當然,實際中肯定不止兩個,可能會到達6,7個。本來格子切的就細,每個格子錨框又多,如果一個小格子塞了7,8箇中心點,我覺得人也很難看出來吧,我一直主張機器學習只能完成人可以完成的任務,人都做不到就不要強求機器去做了。
框框框(錨框、真實框、預測框)
我們有了錨框,透過錨框算出我們需要的預測框,再根據預測框與真實框的差距最佳化模型。思路終於浮現了。
那我們如何得到預測框呢?上面我們提到,預測框都是從錨框得到的。
先看我們想要預測的標籤
其中
都與框無關,只與識別有關,就不多說了,不會的去看看影象分類。
而
這四個值在Yolov3中又有什麼意義呢?
表示預測框中心點距離影象最左邊的距離
表示預測框中心點距離影象最右邊的距離
表示預測框的高度
表示預測框的寬度
透過錨框我們需要預測四個數值,分別為:
1。與x座標偏移量有關的
2。與y座標偏移量有關的
3。高度的尺度縮放:
4。寬度的尺度縮放:
從圖中我們能看到各個引數的對應關係。
我們看到
是在單元格之中的,它們不能大於1,但是預測的數值可不是我們能控制的,我希望它不大於1它就不大於1了嗎?所以這裡我們用一個sigmod函式來限制主數值的範圍,把
寫成:
這樣就束縛住了
的範圍了。但還有一個問題,這個比例係數
得大於0啊,邊長不能小於0吧,那我們把
寫成:
這樣對應關係就變成了論文裡的格式了
好傢伙,寫了這麼多才把論文第一小節的公式推出來。還好後面就快了。順帶一提,標籤是按照單元格寫的,不是按照錨框寫的,這意味著本來我們的標籤長度是(1+4+類別數),但是現在一個單元格里有n個錨框,那這個單元格的標籤就是各個錨框標籤的拼接,長度為(1+4+類別數)*n,比如:
我們知道了錨框怎麼生成預測框,但是我來識別一個目標,那每一個錨框都要出一個預測框嗎?當然不是,我們只用這麼多錨框中的一個就行。
圖中有三個黃色錨框和一個紅色真實框,那我們用哪一個錨框呢?很簡單,計算所有錨框和真實框的IOU(交集面積比並集面積,不會可以查查,太簡單了我都沒寫帖子),選IOU最大的那個即可。方法上我們都說完了,該看看網路結構和公式了。
網路結構
它這個網路講究合久必分,分久必合。為什麼這麼說呢,看下它的網路結構,想看,看不到,論文裡都沒有,借大白大佬的圖解釋一下。
先弄清楚輸入輸出,輸入是圖片,輸出是我們的標籤,這都沒有問題。
從結構看我的目標並不是單純的一個輸出,而是不同尺寸的輸出,但關鍵是他用了darknet-53的特徵提取網路結構。我們看一下darknet-53的網路細節。
這裡第一列是每層的型別,第二列是每層卷積核的數量,第三列是卷積核的尺寸,最後一列表是輸入輸出矩陣的大小。這裡的層數有點多,我們慢慢看。
先看size裡面有一些有/2的,指的是步長為2的卷積操作,可以將輸入的特徵圖的長寬都縮小一半,從而進行下采樣(下采樣:是輸入圖片的尺寸變小,上取樣:是輸入圖片的尺寸變大)這樣相比於最大池化可以減少特徵資訊的損失。
左邊的
表示重複當前層。看看被重複的層都是一個結構
都是由兩個卷積層和一個殘差層構成,那步長為1的有47層,步長為2的有5層,加上一層全連線層一共53層。darknet-53在Imagenet上精確度與Resnet-101,甚至resnet-152精度差不多,毒素卻快很多,層數也少。
殘差層是參照Resnet的殘差層設計的,透過跨層連線,來緩解梯度爆炸,梯度消失等問題。
為了方便理解,我們將下采樣和歩長為1的重複操作看為一個整體,記作Res
上圖就看成一個完整的結構,記為Res8。同樣還有Res1,Res2和Res4。
而網路中的Convolutuon實際上是由卷積(Conv)+BN+Leakyrelu組成,記為CLB。
那現在整個網路可以畫成
這是一個分類網路,但是Yolov3可不僅僅是為了分類,還要做目標定位,一時我們可以將池化,全連線,softmax砍掉,接上我們的三種尺寸的特徵圖,就得到如下結構。這也是完整的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就是我們之前提到的標籤。
訓練過程
我們知道了當前網路的輸入和輸出。得到
,透過我們上面講的錨框算出預測框,就可以透過這組結果配合錨框生成預測框、前景機率(obj也是前文的
)和類別(cls)。
Yolov3可是有監督學習,對應的還有我們的樣本
得到不同尺寸下真實樣本的標籤。這樣我們就將預測框與真實框關聯起來。
透過這種方法就可以訓練Yolov3的網路。
測試過程
先將圖片透過網路算出
,得到了預測框的資訊,再計算得分
obj就是我們的前景機率,cls就是我們的分類機率。併為conf_score其設定閾值,過濾掉分數過低的框。然後將所有尺寸的框回映到原圖上。不過此時還是會有很多的框。所以我們透過nms非極大值抑制消除重疊框。這樣就得到了最終的預測框。
參考
參考了大白大大影片,講的挺好,推薦大家看看。
下一篇:【使用者答疑】掘金寶能上市麼?