1. 簡介
參考源于產業實踐的開源深度學習平臺 飛槳PaddlePaddle 的《零基礎實踐深度學習》?的 《目標檢測YOLOv3》
根據以上資料,簡化和重新梳理 YOLOv3 模型設計的基本思想
2. 基礎概念
2.1. 邊界框(bounding box)
目標檢測通常使用 邊界框(bounding box,bbox)來表示物體的位置
邊界框是正好能包含物體的矩形框
通常有兩種格式來表示邊界框的位置:
圖片坐標的原點在左上角,x軸向右為正方向,y軸向下為正方向
在檢測任務中,訓練數據集的標簽里會給出目標物體真實邊界框所對應的(x1,y1,x2,y2)
這樣的邊界框也被稱為真實框(ground truth box)
在預測過程中,模型會對目標物體可能出現的位置進行預測
由模型預測出的邊界框則稱為預測框(prediction box),如上圖所示
2.2. 錨框(Anchor box)
錨框與物體邊界框不同,是由人們假想出來的一種框
先設定好錨框的大小和形狀,再以圖像上某一個點為中心畫出矩形框
如圖中藍色框所示,其中錨框A1跟人像區域非常接近
在目標檢測任務中,通常會以某種規則在圖片上生成一系列錨框,將這些錨框當成可能的候選區域
模型對這些候選區域是否包含物體進行預測,如果包含目標物體,則還需要進一步預測出物體所屬的類別
還有更為重要的一點是,由于錨框位置是固定的,它不大可能剛好跟物體邊界框重合
所以需要在錨框的基礎上進行微調以形成能準確描述物體位置的預測框,模型需要預測出微調的幅度
在訓練過程中,模型通過學習不斷的調整參數
最終能學會如何判別出錨框所代表的候選區域是否包含物體,如果包含物體的話,物體屬于哪個類別,以及物體邊界框相對于錨框位置需要調整的幅度
2.3. 交并比(loU)
如何衡量這三個錨框跟真實框之間的關系呢?
在檢測任務中,使用交并比(Intersection of Union,IoU)作為衡量指標
這一概念來源于數學中的集合,用來描述兩個集合A和B之間的關系
為了直觀的展示交并比的大小跟重合程度之間的關系
下圖示意了不同交并比下兩個框之間的相對位置關系,從 IoU = 0.95 到 IoU = 0
3. 訓練思想
1.按一定規則在圖片上產生一系列的候選區域
2.根據這些候選區域與真實框之間的位置關系對候選區域進行標注正負樣本
跟真實框足夠接近的那些候選區域會被標注為正樣本,同時將真實框的位置作為正樣本的位置目標
偏離真實框較大的那些候選區域則會被標注為負樣本,負樣本不需要預測位置或者類別
3.使用卷積神經網絡提取圖片特征 C
4.使用卷積神經網絡 關聯圖片特征C 對應候選區域的位置和類別進行預測 ,形成 特征圖P
5.將網絡預測值和標簽值進行比較,就可以建立起損失函數
將每個預測框就看成是一個樣本,根據真實框相對它的位置和類別進行了標注而獲得標簽值
3. 產生候選區域
3.1. 生成錨框
將原始圖片劃分成m×n個區域,即 均分切塊
如原始圖片高度H=640, 寬度W=480,如果選擇小塊區域的尺寸為32×32
則m和n分別為:m=H/32=20,n=W/32=15
將原始圖像分成了20行15列小方塊區域
3.2. 生成預測框
錨框的位置都是固定好的,不可能剛好跟物體邊界框重合
需要在錨框的基礎上進行位置的微調以生成預測框
預測框相對于錨框會有不同的?中心位置和?大小
3.2.1. 預測框中心位置坐標
因此由上面公式計算出來的預測框的中心點總是落在第十行第四列的小區域內部
3.2.2. 預測框大小
錨框的大小是預先設定好的,在模型中可以當作是超參數
3.2.3. 求解預測框
3.3. 標注候選區域
每個區域可以產生3種不同形狀的錨框,每個錨框都是一個可能的候選區域
K=m×n×3=20×15×3=900個錨
對這些候選區域需要了解如下幾件事情:
?錨框是否包含物體,這可以看成是一個二分類問題,使用標簽objectness來表示
當錨框包含了物體時,objectness=1,表示錨框屬于正類
當錨框不包含物體時,objectness=0,表示錨框屬于負類
?如果錨框包含了物體,那么它對應的預測框的中心位置和大小應該是多少
?如果錨框包含了物體,那么具體類別是什么,這里使用變量label來表示其所屬類別的標簽
YOLOv3算法設置了一個IoU閾值 iou_threshold
當預測框的objectness不為1,但是其與某個真實框的IoU大于iou_threshold時,就將其objectness標簽設置為 -1,不參與損失函數的計算
所有其他的預測框,其objectness標簽均設置為0,表示負類
4. 卷積神經網絡提取特征
通過連續使用多層卷積和池化等操作,能得到語義含義更加豐富的特征圖
在檢測問題中,也使用卷積神經網絡逐層提取圖像特征
通過最終的 輸出特征圖 來表示 物體位置和類別等信息
4.1. 骨干網絡
YOLOv3算法使用的骨干網絡是 Darknet53
在檢測任務中,將圖中C0后面的平均池化、全連接層和Softmax去掉,保留從輸入到C0部分的網絡結構,作為檢測模型的基礎網絡結構,也稱為骨干網絡
YOLOv3模型會在骨干網絡的基礎上,再添加檢測相關的網絡模塊
這里將上圖中 特征 C0、C1、C2 所表示的輸出數據取出
指定輸入數據的形狀是 [1,3,640,640] 的話
查看它們的形狀分別是 C2 [1,256,80,80],C1 [1,512,40,40] 和 C0 [1,1024,20,20]
4.2. 根據輸出特征圖計算預測框位置和類別
對于一個預測框,網絡需要輸出(5+N)個實數來表示它是否包含物體、位置和形狀尺寸以及屬于N個類別的概率
由于在每個小方塊區域都生成了k kk個預測框
則所有預測框一共需要網絡輸出的預測值數目是:[k(5+N)]×m×n]
還有更重要的一點是網絡輸出必須要能區分出小方塊區域的位置來
不能直接將特征圖連接一個輸出大小為k(5+N)]×m×n 的全連接層
需要的是 建立輸出特征圖與預測框之間的關聯
現在觀察特征,經過多次卷積核池化之后,其步幅 stride=32
640×480大小的輸入圖片變成了20×15的特征圖
而小方塊區域的數目正好是20×15
也就是說可以讓特征圖上每個像素點分別跟原圖上一個小方塊區域對應
這也是為什么最開始將小方塊區域的尺寸設置為32的原因
這樣可以巧妙的將小方塊區域跟特征圖上的像素點對應起來,解決了空間位置的對應關系
骨干網絡的輸出?特征C,再對特征C進行多次卷積以得到跟預測框相關的?特征圖P
實際中,這幾個尺寸可以隨著任務數據分布的不同而調整
只要保證特征圖輸出尺寸(控制卷積核和下采樣)和輸出層尺寸(控制小方塊區域的大小)相同即可
5. 損失函數
5.1. 三種類型
是否包含目標物體的損失函數,通過pred_objectness和label_objectness計算
loss_obj = paddle.nn.fucntional.binary_cross_entropy_with_logits(pred_objectness, label_objectness)
二值交叉熵:
對m個樣本的損失函數求和然后除以m:
物體位置的損失函數,通過pred_location和label_location計算
loss_location_x = paddle.nn.fucntional.binary_cross_entropy_with_logits(pred_location_x, label_location_x) loss_location_y = paddle.nn.fucntional.binary_cross_entropy_with_logits(pred_location_y, label_location_y) loss_location_w = paddle.abs(pred_location_w - label_location_w) loss_location_h = paddle.abs(pred_location_h - label_location_h) loss_location = loss_location_x + loss_location_y + loss_location_w + loss_location_h
物體類別的損失函數,通過pred_classification和label_classification計算
loss_obj = paddle.nn.fucntional.binary_cross_entropy_with_logits(pred_classification, label_classification)
5.2. 三種尺度
目前計算損失函數是在特征圖P0的基礎上進行的,它的步幅stride=32
特征圖的尺寸比較小,像素點數目比較少,每個像素點的感受野很大,具有非常豐富的高層級語義信息,可能比較容易檢測到較大的目標
為了能夠檢測到尺寸較小的那些目標,需要在尺寸較大的特征圖上面建立預測輸出
如果在C2或者C1這種層級的特征圖上直接產生預測輸出
可能面臨新的問題,它們沒有經過充分的特征提取,像素點包含的語義信息不夠豐富,有可能難以提取到有效的特征模式
在目標檢測中,解決這一問題的方式是,將高層級的特征圖尺寸放大之后跟低層級的特征圖進行融合
得到的新特征圖既能包含豐富的語義信息,又具有較多的像素點,能夠描述更加精細的結構
在每個區域的中心位置產生3個錨框,在3個層級的特征圖上產生錨框的大小分別為
P2[(10×13),(16×30),(33×23)],P1[(30×61),(62×45),(59× 119)],P0[(116 × 90), (156 × 198), (373 × 326]
越往后的特征圖上用到的錨框尺寸也越大,能捕捉到大尺寸目標的信息
越往前的特征圖上錨框尺寸越小,能捕捉到小尺寸目標的信息
5.3. 總的損失函數
輸入圖片經過特征提取得到三個層級的輸出特征圖P0(stride=32)、P1(stride=16)和P2(stride=8)
相應的分別使用不同大小的小方塊區域去生成對應的錨框和預測框,并對這些錨框進行標注
?P0層級特征圖,對應著使用32×32大小的小方塊,在每個區域中心生成大小分別為 [116,90], [156,198], [373,326] 的三種錨框
?P1層級特征圖,對應著使用16×16大小的小方塊,在每個區域中心生成大小分別為 [30,61], [62,45], [59,119] 的三種錨框
?P2層級特征圖,對應著使用 8 × 8 大小的小方塊,在每個區域中心生成大小分別為 [10,13], [16,30], [33,23 ] 的三種錨框
將三個層級的特征圖與對應錨框之間的標簽關聯起來,并建立損失函數,總的損失函數等于三個層級的損失函數相加
通過極小化損失函數,可以開啟端到端的訓練過程
6. 非極大值抑制
預測過程可以分為兩步:
1.通過網絡輸出計算出預測框位置和所屬類別的得分
2.使用非極大值抑制來消除重疊較大的預測框
計算結果會在每個小方塊區域上生成多個預測框,而這些 預測框中很多都有較大的重合度
因此需要消除重疊較大的冗余檢測框
基本思想是,如果有多個預測框都對應同一個物體,則只選出得分最高的那個預測框,剩下的預測框被丟棄掉
如果兩個預測框的類別一樣,而且位置重合度比較大,則可以認為是在預測同一個目標
選出某個類別得分最高的預測框,然后看其余預測框跟它的IoU大于閾值,就把這些預測框給丟棄掉
這里IoU的閾值是超參數,需要提前設置,YOLOv3模型里面設置的是0.5
即丟棄與得分最高的預測框IoU較高的預測框
編輯:黃飛
?
評論