介紹
當(dāng)前主流的CNN目標(biāo)檢測框架可分為兩類:包含Region proposals提取階段的兩階段目標(biāo)檢測框架如R-CNN系列像R-CNN/Fast-RCNN/Faster-FCNN/R-FCN等;端到端的單階段目標(biāo)檢測框架如Yolo系列像Yolo-v1/Yolo-v2/Yolo-v3及SSD蒜魄,和最近Facebook提出的RetinaNet等。簡單說來兩階段的檢測框架相對準(zhǔn)確率(mAP值)更高,但其速度較慢,很難滿足圖片或視頻實(shí)時性處理要求痘昌;單階段的檢測框架相對準(zhǔn)確率較低闸氮,但卻能在保證一定準(zhǔn)確率的情況下,擁有更快钥星、甚至實(shí)時的推理速度,因此在現(xiàn)實(shí)工程實(shí)踐中也獲得了較多的應(yīng)用满着。
Yolo系列模型是比較典型的端到端的單階段目標(biāo)檢測模型谦炒。憑著較快的速度及輕便的特性已經(jīng)在端側(cè)目標(biāo)檢測領(lǐng)域中得到了較大規(guī)模的應(yīng)用。本系列文章里面我們將從最早的Yolo-v1開始风喇,逐步分析下此系列模型是如何逐漸迭代發(fā)展的宁改。
Yolo概述
如前文所講,Yolo是一種端到端的目標(biāo)檢測網(wǎng)絡(luò)魂莫。它以resize過后的圖片為輸入还蹲,經(jīng)過前端的CNN特征提取網(wǎng)絡(luò)后,在生成的feature maps之上再使用CNN/Average Pool等層對特征進(jìn)一步融合耙考、整理谜喊,然后由后接的兩個fc層來直接生成圖片上每個位置節(jié)點(diǎn)所涵蓋的潛在目標(biāo)的類別、位置及置信度等信息倦始。最后再對這些潛在的目標(biāo)以其置信度信息來進(jìn)行過濾(即傳說中的極大值抵制斗遏,non-maximum suppression,NMS)鞋邑,以減少重復(fù)诵次、冗余的目標(biāo)框數(shù)目進(jìn)而加速并改良后須的loss值計(jì)算账蓉。總之它是一個由圖片輸入到圖片之上目標(biāo)輸出的端到端回歸模型逾一。下圖是Yolo目標(biāo)檢測框架的概括描述铸本。
Yolo詳解
- 模型流水過程
Yolo會將輸入的圖片劃分為SxS的空間區(qū)域。然后模型會在每個空間節(jié)點(diǎn)(i,j; 0 <= i <= S, 0 <= j <= S)上檢測固定大小/分辨率的B個boxes遵堵。檢測的東西共有三樣:1)此節(jié)點(diǎn)上每個box所可能包含潛在目標(biāo)的概率大小即置信度(Pr(Object) ? IOUpredtruth)箱玷;2)此節(jié)點(diǎn)上每個box所具有的位置(即中心點(diǎn)x,y與box的h,w);3)每個節(jié)點(diǎn)上潛在目標(biāo)歸屬類別的概率分步(即Pi鄙早,0 <= i <= C汪茧,C為所有可能的類別數(shù)目)。
在部署訓(xùn)練好的模型時限番,結(jié)合網(wǎng)絡(luò)前向推理后生成的每個節(jié)點(diǎn)上的此三樣信息就能得到最終的檢測目標(biāo)。下圖可看出此一詳細(xì)流水過程呀舔。
- 模型網(wǎng)絡(luò)結(jié)構(gòu)
在Yolo模型中弥虐,作者采用了自己創(chuàng)造的Darknet作為其圖片特征處理主干網(wǎng)絡(luò)。它的思想有些借鑒Googlenet媚赖,即通過使用1x1的Conv層來減少filters數(shù)目并整合各個輸出channels的特征霜瘪。下圖為它的基本框架。此基本框架中共包含24個Conv層惧磺,其后又連接了兩個FC層來生成上文所提到的基本信息颖对。作者有試著減少Conv層的數(shù)目為9,并同時減少Conv層中所具有的filters的數(shù)目磨隘,最終生成了一個準(zhǔn)度稍降但速度更快的fast-Yolo模型缤底。
論文中作者使用了S=7,B=2番捂,而PASCAL VOC數(shù)據(jù)集共有20類个唧,所以最終預(yù)測的模型輸出為(7x7x(2x5 + 20)的Tensor。
- 模型訓(xùn)練
訓(xùn)練與推理的最大區(qū)別设预,在于我們需要提出一個合理的loss徙歼,才能讓模型得以按照我們的想法去進(jìn)行迭代優(yōu)化。如下為Yolo的loss計(jì)算公式鳖枕。
跟R-CNN一樣魄梯,它主要由兩部分組成即反映類別信息的Classification loss及反映目標(biāo)檢測框位置信息的localization loss。不過此外它還包含了反映目標(biāo)框置信度信息的loss(此部分loss與RPN網(wǎng)絡(luò)的confidential loss相似宾符,其的作用也大致相同)酿秸。為了抵制過多的background目標(biāo)框會使得那些真正有意義的、包含有明確物體的目標(biāo)框信息被湮沒吸奴,作者使用了外在的系數(shù)λcoord = 5 和 λnoobj = 0.5來人為對之做出糾正允扇。這確實(shí)是它非常丑的地方缠局,畢竟每一個需要手動調(diào)節(jié)的超參的加入都會直接導(dǎo)致一個模型的使用難度加大。
- 模型推理
Yolo這種單階段目標(biāo)檢測模型的推理異常簡單考润,只需要對train好的模型作一次前向推理即能得到輸入圖片之上的目標(biāo)類別及其位置狭园。
在VOC數(shù)據(jù)集上,一次前向推理每張圖片可得到98個目標(biāo)檢測框及它們所對應(yīng)的類別概率分布糊治。在模型輸出的最后一般我們會對生成的多個boxes進(jìn)行NMS處理以減少重復(fù)唱矛、冗余的目標(biāo)框數(shù)目。此方法在R-CNN系列模型中亦得到過檢驗(yàn)井辜,可以有效地提升模型性能及準(zhǔn)確度绎谦。
- Yolo的缺陷
由于Yolo通過直接在image level上劃分grid區(qū)域,然后每個區(qū)域指定固定數(shù)目的boxes粥脚,再對這些boxes作回歸檢測窃肠、分析,這可能會導(dǎo)致它不大能處理不同scales的目標(biāo)刷允。實(shí)驗(yàn)表明它在處理很小的群體目標(biāo)時性能極差冤留。同時它對那些固定數(shù)目boxes之外的其它新的分辨率模型檢測效果也不好。顯然加大每個Grid上不同size/aspect ratio的boxes數(shù)目可以比較有效地解決此一問題树灶,但如此以來又會導(dǎo)致其引以為傲的速度性能大打折扣纤怒。
此外因?yàn)樗鼉H使用最后一層的抽象CNN特征來得到目標(biāo)框的位置、類別等信息天通,因此生成出的目標(biāo)框不夠細(xì)化泊窘。
最后它的training loss計(jì)算中對不同大小的目標(biāo)框一視同仁,不加區(qū)分像寒。這導(dǎo)致它不能較好的對待小尺度的目標(biāo)框烘豹。實(shí)驗(yàn)表明localization error較大是它精度相對于Faster-FCNN模型不高的主要因素。
Yolo與其它檢測模型的比較
與Faster-RCNN等兩階段檢測框架相比萝映,Yolo檢測性能不如吴叶,但勝在速度較快,可滿足實(shí)時性要求序臂。與其它的號稱實(shí)時檢測框架如DPM等相比蚌卤,Yolo在速度不落下風(fēng)的同時,性能又可保持較高奥秆。下表為Yolo與其它檢測模型的實(shí)驗(yàn)結(jié)果比較逊彭。
代碼分析
在cfg/yovov1.cfg里面作者定義了darknet及yovov1 network head的結(jié)構(gòu)。若我們只關(guān)注模型本身构订,那么只看此配置文件即可侮叮,沒必要去費(fèi)精力了解darknet是如何解析其配置文件的。
如下為darknet在訓(xùn)練與推理時分別具有的輸入配置及其它超參數(shù)悼瘾。
[net]
# Testing
batch=1
subdivisions=1
# Training
# batch=64
# subdivisions=8
height=448
width=448
channels=3
momentum=0.9
decay=0.0005
saturation=1.5
exposure=1.5
hue=.1
learning_rate=0.0005
policy=steps
steps=200,400,600,20000,30000
scales=2.5,2,2,.1,.1
max_batches = 40000
以下為darknet特征提取網(wǎng)絡(luò)中間的若干conv層囊榜。审胸。可看出3x3與1x1網(wǎng)絡(luò)相互穿插的結(jié)構(gòu)特點(diǎn)卸勺。此外較為特殊的是它的activation函數(shù)用的都是leaky ReLu砂沛。另外1x1的conv也會使用pad(為1)。
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
darknet主干網(wǎng)絡(luò)的最后又添加了幾個Conv層曙求,用于特征細(xì)化碍庵,這對于pre-trained后的網(wǎng)絡(luò)進(jìn)行遷移學(xué)習(xí)非常有必要。
[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky
[convolutional]
batch_normalize=1
size=3
stride=2
pad=1
filters=1024
activation=leaky
[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky
[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky
[local]
size=3
stride=1
pad=1
filters=256
activation=leaky
最后就是最終的fc層及后須的位置悟狱、類別静浴、置信度等信息提取。
[dropout]
probability=.5
[connected]
output= 1715
activation=linear
[detection]
classes=20
coords=4
rescore=1
side=7
num=3
softmax=0
sqrt=1
jitter=.2
object_scale=1
noobject_scale=.5
class_scale=1
coord_scale=5
參考文獻(xiàn)
- You Only Look Once: Unified, Real-Time Object Detection, Joseph-Redmon, 2015
- https://pjreddie.com/darknet/yolov1/