Yolo系列其一:Yolo_v1

介紹

當(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值)更高,但其速度較慢,很難滿足圖片或視頻實時性處理要求;單階段的檢測框架相對準(zhǔn)確率較低,但卻能在保證一定準(zhǔn)確率的情況下,擁有更快、甚至實時的推理速度,因此在現(xiàn)實工程實踐中也獲得了較多的應(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等層對特征進一步融合、整理,然后由后接的兩個fc層來直接生成圖片上每個位置節(jié)點所涵蓋的潛在目標(biāo)的類別、位置及置信度等信息。最后再對這些潛在的目標(biāo)以其置信度信息來進行過濾(即傳說中的極大值抵制,non-maximum suppression,NMS),以減少重復(fù)、冗余的目標(biāo)框數(shù)目進而加速并改良后須的loss值計算。總之它是一個由圖片輸入到圖片之上目標(biāo)輸出的端到端回歸模型。下圖是Yolo目標(biāo)檢測框架的概括描述。

Yolo檢測系統(tǒng)框架

Yolo詳解

  • 模型流水過程

Yolo會將輸入的圖片劃分為SxS的空間區(qū)域。然后模型會在每個空間節(jié)點(i,j; 0 <= i <= S, 0 <= j <= S)上檢測固定大小/分辨率的B個boxes。檢測的東西共有三樣:1)此節(jié)點上每個box所可能包含潛在目標(biāo)的概率大小即置信度(Pr(Object) ? IOUpredtruth);2)此節(jié)點上每個box所具有的位置(即中心點x,y與box的h,w);3)每個節(jié)點上潛在目標(biāo)歸屬類別的概率分步(即Pi,0 <= i <= C,C為所有可能的類別數(shù)目)。
在部署訓(xùn)練好的模型時,結(jié)合網(wǎng)絡(luò)前向推理后生成的每個節(jié)點上的此三樣信息就能得到最終的檢測目標(biāo)。下圖可看出此一詳細(xì)流水過程。

Yolo具體模型
  • 模型網(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模型。

Darknet網(wǎng)絡(luò)結(jié)構(gòu)

論文中作者使用了S=7,B=2,而PASCAL VOC數(shù)據(jù)集共有20類,所以最終預(yù)測的模型輸出為(7x7x(2x5 + 20)的Tensor。

  • 模型訓(xùn)練

訓(xùn)練與推理的最大區(qū)別,在于我們需要提出一個合理的loss,才能讓模型得以按照我們的想法去進行迭代優(yōu)化。如下為Yolo的loss計算公式。

Yolo的loss函數(shù)公式

跟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來人為對之做出糾正。這確實是它非常丑的地方,畢竟每一個需要手動調(diào)節(jié)的超參的加入都會直接導(dǎo)致一個模型的使用難度加大。

  • 模型推理

Yolo這種單階段目標(biāo)檢測模型的推理異常簡單,只需要對train好的模型作一次前向推理即能得到輸入圖片之上的目標(biāo)類別及其位置。

在VOC數(shù)據(jù)集上,一次前向推理每張圖片可得到98個目標(biāo)檢測框及它們所對應(yīng)的類別概率分布。在模型輸出的最后一般我們會對生成的多個boxes進行NMS處理以減少重復(fù)、冗余的目標(biāo)框數(shù)目。此方法在R-CNN系列模型中亦得到過檢驗,可以有效地提升模型性能及準(zhǔn)確度。

  • Yolo的缺陷

由于Yolo通過直接在image level上劃分grid區(qū)域,然后每個區(qū)域指定固定數(shù)目的boxes,再對這些boxes作回歸檢測、分析,這可能會導(dǎo)致它不大能處理不同scales的目標(biāo)。實驗表明它在處理很小的群體目標(biāo)時性能極差。同時它對那些固定數(shù)目boxes之外的其它新的分辨率模型檢測效果也不好。顯然加大每個Grid上不同size/aspect ratio的boxes數(shù)目可以比較有效地解決此一問題,但如此以來又會導(dǎo)致其引以為傲的速度性能大打折扣。

此外因為它僅使用最后一層的抽象CNN特征來得到目標(biāo)框的位置、類別等信息,因此生成出的目標(biāo)框不夠細(xì)化。

最后它的training loss計算中對不同大小的目標(biāo)框一視同仁,不加區(qū)分。這導(dǎo)致它不能較好的對待小尺度的目標(biāo)框。實驗表明localization error較大是它精度相對于Faster-FCNN模型不高的主要因素。

Yolo與其它檢測模型的比較

與Faster-RCNN等兩階段檢測框架相比,Yolo檢測性能不如,但勝在速度較快,可滿足實時性要求。與其它的號稱實時檢測框架如DPM等相比,Yolo在速度不落下風(fēng)的同時,性能又可保持較高。下表為Yolo與其它檢測模型的實驗結(jié)果比較。

Yolo與其它檢測模型的實驗結(jié)果比較

代碼分析

在cfg/yovov1.cfg里面作者定義了darknet及yovov1 network head的結(jié)構(gòu)。若我們只關(guān)注模型本身,那么只看此配置文件即可,沒必要去費精力了解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)特點。此外較為特殊的是它的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ò)進行遷移學(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

參考文獻

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容