目標檢測算法之 Yolo 系列
引入
R-CNN 基本結(jié)構(gòu)和原理
R-CNN 的不足與改進
SPP 和 ROI
Fast R-CNN
Faster R-CNN
YOLO V1
主要貢獻和優(yōu)勢
基本原理
Anchor box 的設(shè)計
Ground truth 的生成
confidence score
坐標值換算
類別概率
映射到 bounding box
推理過程
計算 loss
實用過程
網(wǎng)絡(luò)結(jié)構(gòu)
Yolo V2
主要貢獻
關(guān)鍵改進
重新定義 Anchor box
坐標變換方式
多尺度融合
Darknet-19
Yolo V3
引入
目標檢測算法是計算機視覺三大基礎(chǔ)任務(wù)之一,其包括目標定位和目標分類兩部分。
在 yolo 系列出來之前,主流的做法是分段式的 R-CNN 系列,主要包括 R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN 等。
R-CNN 基本結(jié)構(gòu)和原理
R-CNN 的基本結(jié)構(gòu)如下圖所示:
R-CNN 主要分為候選區(qū)提取和候選區(qū)分類兩個階段,并且兩階段分開訓練。其主要思想如下。
首先通過選擇性搜索(Selective Search)對輸入進行超像素合并,產(chǎn)生基礎(chǔ)的子區(qū)域。然后將小的子區(qū)域不斷合并成大區(qū)域,并從中找出可能存在物體的區(qū)域,這個過程即候選區(qū)提取(Region Proposal)。
提取出包含目標的候選區(qū)之后,需要對其進行分類,判定目標屬于哪一類??梢酝ㄟ^ SVM 或 CNN 等算法進行分類。
R-CNN 的不足與改進
SPP 和 ROI
要實現(xiàn)較為實用的 R-CNN 網(wǎng)絡(luò),往往需要對輸入樣張?zhí)崛∩锨€候選區(qū),并對每個候選區(qū)進行一次分類運算。于是,后續(xù)出現(xiàn)空間金字塔池化(SPP) 和 region of interest(`ROI)等方式進行改進。
其基本思想是,輸入圖片中的目標區(qū)域,經(jīng)過 CNN 后,得到的特征圖中,往往也存在著對應(yīng)的目標區(qū)域,此即 ROI。后續(xù)對該特征圖(多種尺度)上的 ROI 進行分類,此即 SPP。
通過這種方式,可以共用特征提取部分,只對最后的特征圖進行候選區(qū)提取和分類。這樣就可以極大地減少總的計算量,并提升性能。
Fast R-CNN
但是,SPP 和 ROI 方式,仍舊需要分段訓練。其不僅麻煩,同時還分割了 bounding box 回歸訓練與分類網(wǎng)絡(luò)的訓練。這使得整個函數(shù)的優(yōu)化過程不一致,從而限制了更高精度的可能。
于是,再次對其進行改進:
1.進行 ROI 特征提取之后,將兩種損失進行合并,統(tǒng)一訓練。這樣相對易于訓練,且效率更高
2.將 SPP 換做 ROI Pooling
3.對于 bounding box 部分的 loss,使用 Smooth l1 函數(shù),可以提升穩(wěn)定性
Faster R-CNN
在 Fast R-CNN 中,對 ROI 而非原圖的候選區(qū)進行分類,提升速度。因此,下一步可以對候選區(qū)提取部分進行優(yōu)化,提升性能。
因此,在 Faster R-CNN 中,不再對原圖進行候選區(qū)提取,而是直接對經(jīng)過 CNN 后的特征圖進行候選區(qū)提取,這部分網(wǎng)絡(luò),即 Region Proposal Networks(RPN)。
之后,將候選區(qū)分別送入兩個子網(wǎng)絡(luò),分別用與計算 bounding box 的坐標和候選區(qū)的類別。如圖 1 所示。
通過這種方式,可以進一步減少計算量,合并兩個階段,并提升精度。
YOLO V1
主要貢獻和優(yōu)勢
雖然 Fast R-CNN 已經(jīng)相當優(yōu)秀,但是其仍舊不是真正意義上的一體式目標檢測網(wǎng)絡(luò),其性能仍有提升的空間。
針對 R-CNN 系列的分段式設(shè)計的問題,YOLO 提出一種全新的 loss 計算方式,重新定義了目標檢測問題,將其定義為回歸問題進行訓練,同時進行定位和分類的學習。
YOLO 的核心,在于其損失函數(shù)的設(shè)計。其一體式架構(gòu)設(shè)計,計算量更少,速度更快,易于優(yōu)化,且滿足實時檢測的需求。
YOLO V1 具有以下優(yōu)勢:
1.速度極快,易于優(yōu)化:只需讀取一次圖像,就可進行端對端優(yōu)化,可滿足實時需求
2.背景誤識別率低:對全圖進行卷積學習,綜合考慮了全圖的上下文信息
3.泛化性能好:也是由于綜合考慮了圖片全局,因此能夠更好地學習數(shù)據(jù)集的本質(zhì)表達,泛化性能更好
4.識別精度高
當然,相較于 Faster R-CNN ,YOLO v1 存在明顯不足:
1.定位精度不夠,尤其是小目標
2.對密集目標的識別存在不足
3.異常寬長比的目標識別不佳
基本原理
深度學習任務(wù)中,合理的目標設(shè)定,是成功的關(guān)鍵因素之一。
Anchor box 的設(shè)計
在 R-CNN 系列中,需要先提取候選區(qū),然后再將候選區(qū)進行回歸微調(diào),使之更接近 groung truth。而 YOLO 直接將其合并為一步,即:回歸。但是,YOLO 保留了候選區(qū)的思想,只是將其演變?yōu)榱?anchor box。
在 YOLO V1 中,首先設(shè)定 B 個不同尺寸,寬長比的 anchor box。然后將每張圖片劃分成S×S的格點,每個格點對應(yīng)有 B 個 anchor box,共S×S×B個 anchor box,其粗略的覆蓋了整張圖片。
對于每張圖片,均存在初始的S×S×B 個 anchor box,作為初始 bounding box。現(xiàn)在需要做的是,通過學習,不斷判定哪些 bounding box 內(nèi)存在目標,存在什么樣的目標,同時不斷調(diào)整可能存在目標的 bounding box 的寬長比和尺寸,使之與 ground truth 更接近。
那么,ground truth 又是如何定義的呢?
Ground truth 的生成
目標檢測任務(wù),首先需要做的是判定是否包含目標,然后才是判定目標的位置以及類別。
以下圖為例,詳細講解從一張圖片,生成 ground truth 的過程。
confidence score
如上圖所示,首先要做的,就是判定哪些 bounding box 內(nèi)包含目標。我們可以通過一個置信度得分 confidence score,來判定某個 bounding box 內(nèi)是否包含目標。
對于上圖,我們設(shè)定目標中心所在的格點,包含目標。顯然,對于圖片中目標的 ground truth,該值為 1。
坐標值換算
對于不包含目標的 anchor box,不用計算其坐標。對于包含目標的 anchor box,需要獲取其坐標。
在 yolo 中,通過中心位置和尺寸表示坐標,即:(x,y,w,h)
圖片的 label 與 groung truth 之間,通過如下方式換算。
如上圖所示,狗狗的原始坐標(label)為?,F(xiàn)在需要將其變換為 ground truth。
x,y表示目標中心距離對應(yīng)格點邊界(左上角)的位置,數(shù)值相對于格點單元尺寸進行過歸一化。w,h為目標邊框的尺寸,相對于整圖尺寸進行過歸一化。
因此,上圖狗狗的坐標對應(yīng)的 ground truth 計算方式為(每個格點尺寸為 1):
類別概率
目標位置定義完畢后,需要定義目標的類別對應(yīng)的 ground truth。在 YOLO V1 中,存在如下設(shè)定:
每個格點最多只能預(yù)測一個目標,即使是共有 B 個 anchor box,因此最多只能包含一個類別。
這一設(shè)定,將會導致,對于密集的目標,YOLO 的表現(xiàn)較差。
對于每個目標(每個格點內(nèi)只允許存在一個),其對應(yīng)的類別 ground truth 為 one-hot 編碼。
映射到 bounding box
由于每張圖片初始對應(yīng)S×S×B個 bounding box,因此需要將上面的 ground truth 進行映射,使之與 bounding box 尺寸對應(yīng)一致,才能進行比較,計算誤差,進行優(yōu)化。步驟如下:
1.初始化每個格點上的 bounding box 為 0
2.對于存在目標的格點,將于 ground truth 之間 IOU 最大的 bounding box 對應(yīng)的 confidence score 填充為 1,表示包含目標
3.將包含目標的 bounding box ,填充對應(yīng)的的 ground box 的坐標和類別值
到這里,就從 label ,得到了用于比較的 target。
推理過程
推理過程較為簡單,輸入圖片,得到一個尺寸為 S×S的特征圖,通道數(shù)為B×(1+4)+C,其中,B 為每個格點的 bounding box 數(shù)目,C 為到預(yù)測的目標類別數(shù),1 和 4 分別表示包含目標的置信度和對應(yīng)的坐標。
由于每個格點只負責預(yù)測一個目標,因此只需要包含一個類別向量即可。
在原論文中,S=7,B=2,C=20,因此最后輸出尺寸為7×7×30 。
計算 loss
對于每張圖片,大多數(shù)格點單元不包含目標,其對應(yīng)的置信度得分為 0。這種目標存在與否的失衡,將會影響最后 loss 的計算,從而影響包含目標的格點單元的梯度,導致模型不穩(wěn)定,訓練容易過早收斂。
因此,我們增加 bounding box 坐標對應(yīng)的 loss,同時對于不包含目標的 box,降低其置信度對應(yīng)的 loss。我們用和
來實現(xiàn)這一功能,且: 。
同時,sum-squared error 還會同等看待 large boxes 和 small boxes 的 loss 。而同等的 loss 對于 large boxes 和 small boxes 的影響是不同的。
為了減緩這種空間上的不均衡,我們選擇預(yù)測 w 和 h 的平方根,可以降低這種敏感度的差異,使得較大的對象和較小的對象在尺寸誤差上有相似的權(quán)重。
綜上所述,完整的 loss 計算方式如下所示:
其中(以 ground truth 為判定依據(jù)):
?表示是否格點單元i中包含目標;
?表示格點單元i中,第j個預(yù)測的 bounding box 包含目標
?意思是網(wǎng)格 i 的第 j 個 bounding box 中不存在對象
因此,上面的 loss 中:
? 第一行表示:當?shù)?i 個格點中第 j 個 box 中存在目標 (IOU 比較大的 bounding box) 時,其坐標誤差
? 公示的第二行表示:第 i 個格點中第 j 個 box 中存在目標時,其尺寸誤差
? 公示的第三行表示:第 i 個格點中第 j 個 box 中存在目標時,其置信度誤差
? 公示的第四行表示:第 i 個格點中第 j 個 box 中不存在目標時,其置信度誤差
? 公示的第五行表示:第 i 個格點中存在目標時,其類別判定誤差
實用過程
在實際使用中,需要預(yù)測實際的邊框和類別。通常,可能存在多個 bounding box 預(yù)測一個目標,存在冗余,需要使用非極大抑制(MNS)來剔除冗余 bounding box。其核心思想是:選擇置信度得分最高的作為輸出,去掉與該輸出重疊較高的預(yù)測框,不斷重復(fù)這一過程直到處理完所有備選框(共 S×S×B個)。
具體步驟如下所示:
1. 過濾掉 confidence score 低于閾值的 bounding box
2. 遍歷每一個類別
1. 找到置信度最高的 bounding box,將其移動到輸出列表
2. 對每個 Score 不為 0 的候選對象,計算其與上面輸出對象的 bounding box 的 IOU
3. 根據(jù)預(yù)先設(shè)置的 IOU 閾值,所有高于該閾值(重疊度較高)的候選對象排除掉
4. 當剩余列表為 Null 時, 則表示該類別刪選完畢,繼續(xù)下一個類別的 NMS
3. 輸出列表即為預(yù)測的對象
網(wǎng)絡(luò)結(jié)構(gòu)
Yolo V2
主要貢獻
Yolo V2 的主要貢獻在于:
1. 利用 wordTree 設(shè)計,充分利用分類數(shù)據(jù)集,彌補目標識別類別數(shù)目的不足
2. 重新設(shè)計基礎(chǔ)網(wǎng)絡(luò) darknet-19,輸入尺寸可變,從而在同一套模型上,提供速度和精度之間的切換
3. 重新設(shè)計 anchor box 和坐標變換格式,使的瘦臉更快,精度更高
關(guān)鍵改進
這篇論文進行了較多的改進優(yōu)化,主要分為新設(shè)計的基礎(chǔ)網(wǎng)絡(luò) darknet-19,以及新設(shè)計 anchor box 等。至于其他改進,詳見論文。
重新定義 Anchor box
在 Yolo V2 中,輸入尺寸變?yōu)?16×416,網(wǎng)絡(luò)整體縮放倍數(shù)為 13,最后得到尺寸為13×13的特征圖,并在改尺寸上進行推理預(yù)測。
此外,較為重要的是,v2 中,每個 bounding box 負責預(yù)測一個目標,因此一個格點內(nèi)可以預(yù)測多個目標,解決了密集目標的預(yù)測問題。
此外,不再通過手工選擇 anchor box,而是針對特定數(shù)據(jù)集,通過 k-means 算法進行選擇,詳見論文。
坐標變換方式
在 yolo v1 中,使用全連接層來直接預(yù)測目標的 bounding box 的坐標。訓練過程不夠穩(wěn)定,主要來自(x,y)的預(yù)測。
而在 Faster R-CNN 中,使用全卷積網(wǎng)絡(luò) RPN 來預(yù)測 bounding box 相對于 anchor box 的坐標的偏移量。由于預(yù)測網(wǎng)絡(luò)是卷積網(wǎng)絡(luò),因此 PRN 在 feature map 網(wǎng)絡(luò)的每個位置預(yù)測這些 offset。
相比于直接預(yù)測坐標,預(yù)測 offset 更簡單,誤差更小,可以簡化問題,使得網(wǎng)絡(luò)更容易學習。
原始方案中,預(yù)測值和(x,y)之間,計算方式如下:
該方式下,對坐標沒有限制,因此預(yù)測的 bounding box 可能出現(xiàn)在任意位置,導致訓練不穩(wěn)定。因此,在 V2 內(nèi)改為預(yù)測偏移量,其計算方式如下所示:
其中,表示格點單元相對于圖像左上角的坐標;表示先驗框的尺寸 (bounding box prior),預(yù)測值為。
? 對于預(yù)測的 bbox 的中心,需要壓縮到 0-1 之間,再加上 anchor 相對于grid 在 x 和 y 方向上的偏移。這一點,和 yolo v1 是一致的
? 對于預(yù)測的 bbox 的寬高,這個和 faster RCNN 一樣,是相對于 anchor 寬高的一個放縮。exp(w) 和 exp(h) 分別對應(yīng)了寬高的放縮因子
? 對于預(yù)測的 bbox 的置信度,則需要用 sigmoid 壓縮到 0-1 之間。這個很合理,因為置信度就是要0-1之間。
? 對于預(yù)測的每個類別,也是用你 sigmoid 壓縮到0-1之間。這是因為類別概率是在0-1之間
最后通過換算得到的為在當前特征圖尺寸上的坐標和尺寸,需要乘以整體縮放因子(32),方可得到在原圖中的坐標和尺寸。
這種參數(shù)化的方式,使得神經(jīng)網(wǎng)絡(luò)更加穩(wěn)定。
多尺度融合
13×13的輸出特征圖,可以很好的預(yù)測較大尺寸的目標,但是對于小尺寸的目標,可能并不太好。
因此,在 YOLO v2 中,除了使用13×13的特征圖,還使用其之前層尺寸為26×26和52×52的特征圖,并進行多尺度融合。不同尺寸之間,通過如下形式,進行特征融合。
例如,26×26×256通過這種方式,將變?yōu)?3×13×1024的 tensor。
具體融合形式,詳見圖 9。
Darknet-19
大多數(shù) detection 系統(tǒng)以 VGG-16 作為基礎(chǔ)的特征提取器 (base feature extractor)。但是 vgg-16 較為復(fù)雜,計算量較大。
Yolo V2 使用一個定制的神經(jīng)網(wǎng)絡(luò)作為特征提取網(wǎng)絡(luò),它基于 Googlenet 架構(gòu),運算量更小,速度更快,然而其精度相較于 VGG-16 略微下降,稱之為 darknet-19。
與 VGG 模型類似,大多數(shù)使用3×3的卷積層,并在每一次 pooling 后,通道數(shù)加倍。此外,使用全局池化 ( GAP,global average pooling ) 來進行預(yù)測。同時,在3×3的卷積層之間,使用1×1的卷積層來壓縮特征表達。此外,使用 batch normalization 來穩(wěn)定訓練,加速收斂以及正則化模型。
完整的網(wǎng)絡(luò)層如下所示:
Yolo V3
Yolo V3 只是對 Yolo v2 進行了一次較小的優(yōu)化,主要體現(xiàn)在網(wǎng)絡(luò)結(jié)構(gòu)上,提出了 darknet-53 結(jié)構(gòu),作為特征提取網(wǎng)絡(luò)。最后,Yolo V3 在小目標的識別上改善較大,但是中等目標和大目標的識別方面,表現(xiàn)略微下降。
網(wǎng)絡(luò)結(jié)構(gòu)如下所示:
最后附上一張性能表現(xiàn)圖:
參考
- https://arxiv.org/abs/1506.02640
- https://arxiv.org/pdf/1612.08242.pdf
- https://pjreddie.com/media/files/papers/YOLOv3.pdf
- https://pjreddie.com/darknet/yolo/
- https://github.com/BobLiu20/YOLOv3_PyTorch
- https://www.jianshu.com/p/d535a3825905
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。