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