主流網(wǎng)絡(luò)模型之目標(biāo)檢測

1.概述

1.2 目標(biāo)檢測的任務(wù)

目標(biāo)檢測任務(wù)就是找到圖片中有哪些物體(分類)及它們的位置(坐標(biāo)回歸)

1.3 目標(biāo)檢測的分類

1.one-stage和two-stage

one-stage直接輸出物體的類別概率和坐標(biāo),速度快,準(zhǔn)確度較two-stage低。two-stage第一步是通過RPN(Region Proposal Network)生成候選區(qū)域,第二步對每個候選區(qū)域進(jìn)行分類和回歸得到最終結(jié)果。

出處:yolov4

2.anchor-based和anchor-free

對于anchor-based模型來說,anchor的形狀是一般是通過對數(shù)據(jù)集內(nèi)的框進(jìn)行K-means聚類得到。anchor代表了數(shù)據(jù)集一種統(tǒng)計(jì),相當(dāng)于一種先驗(yàn)。

3種聚合方式的特點(diǎn):Mean,反映分布;Max,忽略重復(fù);Sum:單射。??這句話可以忽略

出處:yolov3

anchor-based模型的缺點(diǎn):

1.anchor的質(zhì)量影響模型效果;

2.大部分的在圖上的anchor都是負(fù)樣本,正負(fù)樣本不均勻的問題。

3.NMS的計(jì)算

對于anchor-free模型來說,以FCOS為例,直接對特征圖上每個像素點(diǎn)進(jìn)行預(yù)測。

出處:FOCS。其他anchor free的還有Reppoints ,CornerNet等

2.R-CNN系列


two-stage

2.1?R-CNN(Region with CNN features)

R-CNN是2014年提出的,RCNN具體原理解析

整體結(jié)構(gòu)如下:

網(wǎng)絡(luò)分為四個部分:區(qū)域劃分、特征提取、區(qū)域分類、邊框回歸

區(qū)域劃分:使用selective search算法畫出2k個左右候選框,送入CNN

特征提取:使用imagenet上訓(xùn)練好的模型,進(jìn)行finetune

區(qū)域分類:從頭訓(xùn)練一個SVM分類器,對CNN出來的特征向量進(jìn)行分類

邊框回歸:使用線性回歸,對邊框坐標(biāo)進(jìn)行精修

優(yōu)點(diǎn)

ss算法比滑窗得到候選框高效一些;使用了神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),準(zhǔn)確率比傳統(tǒng)檢測提高了

缺點(diǎn)

1、ss算法太耗時(shí),每張圖片都分成2k,并全部送入CNN,計(jì)算量很大,訓(xùn)練和inference時(shí)間長

2、四個模塊基本是單獨(dú)訓(xùn)練的,CNN使用預(yù)訓(xùn)練模型finetune、SVM重頭訓(xùn)練、邊框回歸重頭訓(xùn)練。微調(diào)困難,可能有些有利于邊框回歸的特征并沒有被CNN保留

GPU上13s/image(Nvidia的,具體沒說什么型號),CPU上53s/imge。??

2.2?Fast R-CNN

Fast R-CNN是R-CNN的同一個作者(Ross Girshick)在2015年提出的。

Fast-RCNN具體原理解析



具體做法如下:

step1:輸入是整張圖片和候選區(qū)域(Selective Search得到)的集合,經(jīng)過CNN(VGG16)后得到特征圖

step2:使用RoI pooling將特征圖采樣(RoI pooling layer+ FC)為一個定長的特征向量;

step3:對于每個RoI特征向量進(jìn)行兩個任務(wù)1)softmax輸出類別;2)bbox回歸

ROI Pooling具體操作如下:

根據(jù)輸入image,將ROI映射(projection)到feature map對應(yīng)位置;

將映射后的區(qū)域劃分為相同大小的sections(sections數(shù)量與輸出的維度相同);

對每個sections進(jìn)行max pooling操作;

相對RCNN,準(zhǔn)確率和速度都提高了,具體做了以下改進(jìn)

1、依舊使用了selective search算法對原始圖片進(jìn)行候選區(qū)域劃分,但送入CNN的是整張?jiān)紙D片,相當(dāng)于對一張圖片只做一次特征提取,計(jì)算量明顯降低

2、在原圖上selective search算法畫出的候選區(qū)域?qū)?yīng)到CNN后面輸出的feature map上,得到2k個左右的大小長寬比不一的候選區(qū)域,然后使用RoI pooling將這些候選區(qū)域resize到統(tǒng)一尺寸,繼續(xù)后續(xù)的運(yùn)算

3、將邊框回歸融入到卷積網(wǎng)絡(luò)中,相當(dāng)于CNN網(wǎng)絡(luò)出來后,接上兩個并行的全連接網(wǎng)絡(luò),一個用于分類,一個用于邊框回歸,變成多任務(wù)卷積網(wǎng)絡(luò)訓(xùn)練。這一改進(jìn),相當(dāng)于除了selective search外,剩余的屬于端到端,網(wǎng)絡(luò)一起訓(xùn)練可以更好的使對于分類和回歸有利的特征被保留下來

4、分類器從SVM改為softmax,回歸使用平滑L1損失

缺點(diǎn):因?yàn)橛衧elective search,所以還是太慢了,一張圖片inference需要3s左右,其中2s多耗費(fèi)在ss上,且整個網(wǎng)絡(luò)不是端到端

在nvidia k40 GPU上最快0.06s/image。??

2.3?Faster R-CNN

Faster R-CNN是2016年提出的模型,作者中包括R-CNN的作者。

Fseter-RCNN具體原理解析 1

Fseter-RCNN具體原理解析 2

重點(diǎn):RPN(Region Proposal Network),anchor

Faster R-CNN將整個框架分為了2個部分1)RPN;2)detector

Our object detection system, called Faster R-CNN, is composed of two modules. The first module is a deep fully convolutional network that proposes regions, and the second module is the Fast R-CNN detector that uses the proposed regions.

具體做法如下:

step1:卷積層對輸入的圖像進(jìn)行特征提取得到特征圖;

step2:RPN網(wǎng)絡(luò)使用先驗(yàn)anchor輸出帶有objectness socre的矩形候選區(qū)域(通過先驗(yàn)anchor產(chǎn)生)集合

objecness socre:二分類,表示是背景類和有目標(biāo);

倘若特征圖大小為W × H ,使用k個先驗(yàn)anchor,則總共有W H k個矩形候選區(qū)域;

k表示使用k個anchor;2k:表示二分類數(shù)量,4k:是坐標(biāo)數(shù)量

用下面一張圖更容易理解:

特征圖通過一個3 × 3的卷積核遍歷整個特征圖,然后以特征圖上的每個像素為中心生成k個anchor,然后利用全連接對anchors進(jìn)行分類(上面的分支)和初步的bbox回歸(下面的分支)。

step3:將RPN的輸出經(jīng)過ROI Pooling后進(jìn)行bbox回歸和分類

引入RPN,F(xiàn)aster-RCNN相當(dāng)于Fast-RCNN+RPN,準(zhǔn)確率和速度進(jìn)一步提高,主要做了以下改進(jìn):

1、移除selective search算法,還是整張?jiān)紙D片輸入CNN進(jìn)行特征提取,在CNN后面的卷積不再使用ss算法映射過來的候選區(qū)域,而是采用新的網(wǎng)絡(luò)RPN,使用神經(jīng)網(wǎng)絡(luò)自動進(jìn)行候選區(qū)域劃分

2、RPN通過生成錨點(diǎn),以每個錨點(diǎn)為中心,畫出9個不同長寬比的框,作為候選區(qū)域,然后對這些候選區(qū)域進(jìn)行初步判斷和篩選,看里面是否包含物體(與groundtruth對比IoU,大于0.7的為前景,小于0.3的為背景,中間的丟棄),若沒有就刪除,減少了不必要的計(jì)算

3、有效的候選區(qū)域(置信度排序后選取大概前300個左右)進(jìn)行RoI pooling后送入分類和邊框回歸網(wǎng)絡(luò)

優(yōu)點(diǎn):端到端網(wǎng)絡(luò),整體進(jìn)行優(yōu)化訓(xùn)練;使用神經(jīng)網(wǎng)絡(luò)自動生成的候選區(qū)域?qū)Y(jié)果更有利,比ss算法好;過濾了一些無效候選區(qū),較少了冗余計(jì)算,提升了速度

RPN網(wǎng)絡(luò)和錨點(diǎn)具體原理和訓(xùn)練過程

RPN訓(xùn)練

1、加載預(yù)訓(xùn)練模型,訓(xùn)練RPN

2、訓(xùn)練fast-rcnn,使用的候選區(qū)域是RPN的輸出結(jié)果,然后進(jìn)行后續(xù)的bb的回歸和分類

3、再訓(xùn)練RPN,但固定網(wǎng)絡(luò)公共的參數(shù),只更新RPN自己的參數(shù)

4、根據(jù)RPN,對fast-rcnn進(jìn)行微調(diào)訓(xùn)練

在k40 GPU上最快17fps(ZF+Fast R-CNN)??


2.4.1 R-FCN

R-FCN具體原理解析

在Faster-RCNN基礎(chǔ)上,進(jìn)一步提高了準(zhǔn)確率,主要以下改進(jìn)

1、使用全卷積層代替CNN basenet里面的全連接層

2、CNN得到的feature map在RoI pooling之后變成3x3大小,把groundtruth也變成3x3大小,對9宮格每個區(qū)域分別比較和投票

2.4.2?Mask R-CNN(201703)

Mask R-CNN是何凱明在2017年提出的實(shí)例分割模型。

Mask-RCNN具體原理解析1

Mask-RCNN具體原理解析2

Mask-RCNN具體原理解析3(RoI Align解釋)

主要改進(jìn)1)Faster R-CNN加了一個輸出mask的分支;2)將RoI Pooling改為了RoI Align


RoI Pooling的缺點(diǎn)?RoI pooling是在fast-rcnn里提出的,用于對大小不同的候選框進(jìn)行resize之后送入后面的全連接層分類和回歸,但RoI pooling計(jì)算時(shí)存在近似/量化,即對浮點(diǎn)結(jié)果的像素直接近似為整數(shù),這對于分類來說影響不大(平移不變性),但新引入的Mask分割來說,影響很大,造成結(jié)果不準(zhǔn)確,所以引入了RoI Align,對浮點(diǎn)的像素,使用其周圍4個像素點(diǎn)進(jìn)行雙線性插值,得到該浮點(diǎn)像素的估計(jì)值,這樣使結(jié)果更加準(zhǔn)確

RoI Align的具體做法?如下圖所示,虛線是特征圖,黑實(shí)線是RoI區(qū)域??梢钥吹剑琑oI是保留小數(shù)的。然后將RoI的分為4個區(qū)域(本例為2 × 2 2,原文叫bin,倉),每個區(qū)域設(shè)立4個采樣點(diǎn)。RoI Align通過從特征圖上附近的網(wǎng)格點(diǎn)進(jìn)行雙線性插值來計(jì)算每個采樣點(diǎn)的值。對RoI、其bin或采樣點(diǎn)所涉及的任何坐標(biāo)不進(jìn)行量化。

3.YOLO系列

官方網(wǎng)站:https://pjreddie.com/publications/

yolo->v2->v3:https://github.com/pjreddie/darknet

└->v4:https://github.com/AlexeyAB/darknet

│ │?https://github.com/Tianxiaomo/pytorch-YOLOv4???

│ └->scaled-v4:https://github.com/WongKinYiu/ScaledYOLOv4??? ?? ??

└->v5:https://github.com/ultralytics/yolov5?????

關(guān)于yolov5:https://github.com/pjreddie/darknet/issues/2198???

??表示python實(shí)現(xiàn);??表示新提出的模型(2020年)

YOLO具體原理解析1

YOLO具體原理解析2

3.1?YOLOv1

yolov1是發(fā)表于2016年的一種anchor-free模型。

YOLOv1論文理解

yolov1的模型如上圖,有24個卷積層和2個全連接層組成,輸出形狀為7 × 7 × 30。其中7 × 7表示網(wǎng)絡(luò)將原圖劃分為了7 × 7 個區(qū)域;30 = ( 4 + 1 ) × 2 + 20,4表示( w , h , x , y ),1表示置信度c cc,2表示預(yù)測兩個矩形框;20代表預(yù)測20個類。當(dāng)然,最后輸出也可以是其他值,滿足S × S × ( B ? 5 + C )規(guī)則。


yolov1的做法如下:

圖像輸入網(wǎng)絡(luò)后,輸出?S × S × ( B ? 5 + C )的特征圖;?S × S特征圖中的每個格子負(fù)責(zé)預(yù)測一個類,輸出一個置信度c 加上bbox回歸的值5 55,類別信息C,如果每個格子負(fù)責(zé)預(yù)測兩個,則乘一個B。最后使用NMS去重。

顯然,yolov1最多只能預(yù)測S × S 個目標(biāo)且對小目標(biāo)不敏感。

YOLO缺點(diǎn):

1、對小目標(biāo)和密集型目標(biāo)檢測的效果差,如一群小鴨子(因?yàn)閳D片劃分為7x7個grid cell,而每個cell只產(chǎn)生兩個bounding box,意思就是每個grid cell的區(qū)域最多只會預(yù)測兩個object)(是否可以用裁剪方法得到原圖的局部放大圖?每個grid cell預(yù)測多個bounding box?最后的卷積使用14x14x20?)

2、YOLO的物體檢測精度低于其他state-of-the-art的物體檢測系統(tǒng)。

3、YOLO容易產(chǎn)生物體的定位錯誤

YOLO優(yōu)點(diǎn):

1、YOLO檢測物體非??欤?5-155FPS)

2、YOLO可以很好的避免背景錯誤,產(chǎn)生false positives(可以看到全局圖像,有上下文信息)


3.2?YOLOV2/YOLO9000

yolov2是2017年提出,首次引入了Faster RCNN的anchor及其他的trick。

YOLO9000的論文標(biāo)題為:YOLO9000: Better, Faster, Stronger

Better:

BN

高精度與訓(xùn)練

Anchor

使用聚類選anchor

使用相對坐標(biāo)進(jìn)行預(yù)測(相對于格子)

passthrough層(將26 × 26 × 1 特征圖變?yōu)榱?3 × 13 × 4 的特征圖)

多尺度訓(xùn)練(32的倍數(shù){ 320 , 352 , … , 608 })

Faster

Darknet-19

bottleneck結(jié)構(gòu)


Stronger

使用WordTree進(jìn)行層次分類(預(yù)測9000類的技術(shù),從大類往小類預(yù)測,層次)

3.3?YOLOv3

YOLOv3是YOLO原作者(Joseph Redmon)最后參與的、2018年發(fā)布的模型。

主要改進(jìn)在網(wǎng)絡(luò)結(jié)構(gòu)上。

Backbone:DarkNet53! ??

殘差;更深了


Neck:FPN:

出處:Feature Pyramid Networks for Object Detection;上采樣使用最近鄰插值


FPN接受3個尺度的特征圖32 × 32 ,16 × 16 ,8 × 8,分別對應(yīng)小、中、大尺度的目標(biāo)。每個預(yù)測分支使用3種anchor,共9個anchor。

3.4?YOLOv4

我的翻譯:https://blog.csdn.net/kobayashi_/article/details/109361339

yolov4是現(xiàn)在的darknet的維護(hù)者Alexey Bochkovskiy于今年(2020年4月)提出的模型,即對模型進(jìn)行了優(yōu)化也對數(shù)據(jù)預(yù)處理進(jìn)行了優(yōu)化!????

YOLOv4由下列組成:

Backbone:CSPDarknet53

Neck:SPP,PAN

Head:YOLOv3

YOLOv4使用了:

在Backbone上使用的BoF:CutMix和Mosaic數(shù)據(jù)增強(qiáng),DropBlock正則化,類標(biāo)簽平滑(Class label smoothing)

在Backbone上使用的BoS:Mish激活,跨階段部分連接(CSP),多輸入殘差連接加權(quán)(MiWRC)

在探測器上使用的BoF:CIoU-loss,CmBN,DropBlock正則化,Mosaic數(shù)據(jù)增強(qiáng),自對抗訓(xùn)練,使用對單個ground truth用對各anchor來消除網(wǎng)格敏感性,余弦退火scheduler,最優(yōu)超參數(shù),隨機(jī)訓(xùn)練形狀

在探測器上使用的BoS:Mish激活,SPP塊,SAM塊,PAN路徑聚合塊,DIoU-NMS

3.4.1?scaled YOLOv4

我的翻譯:https://blog.csdn.net/kobayashi_/article/details/109960073

scaled-yolov4是今年(2020年11月)在yolov4的基礎(chǔ)上提出的,將yolov4使用的CSP技術(shù)進(jìn)一步擴(kuò)展到了Neck層。提高了網(wǎng)絡(luò)的速度,最高能跑到1774FPS(YOLOV4-tiny)!??

3.5?YOLOv5

至今為止沒有論文,預(yù)計(jì)于2020年年底出,代碼還在更新中。模型沒啥大改動,數(shù)據(jù)集處理的亮點(diǎn)是馬賽克(Mosaic)數(shù)據(jù)增強(qiáng),不過v4也用了。具體等論文。

關(guān)于yolov5論文:?https://github.com/ultralytics/yolov5/issues/1333

4.其他模型

4.1?SSD

SSD是2016年提出的模型。

SSD具體原理解析

SSD和yolov1的對比:

對比上圖可知,SSD使用了多尺度的特征圖進(jìn)行檢測,這樣做的好處是可以利用多種尺度的特征圖來預(yù)測多種尺度的目標(biāo)。SSD對小目標(biāo)的檢測能力優(yōu)于yolov1。同時(shí),又因?yàn)镾SD生成的多尺度default box一定有更高概率找到更加貼近于 Ground Truth 的候選框,所以模型的訓(xùn)練穩(wěn)定性是肯定比yolov1強(qiáng)。

SSD算法的核心:

1、對于每個feature map cell都使用多種橫縱比的default boxes,所以算法對于不同橫縱比的object的檢測都有效

2、對default boxes的使用來自于多個層次的feature map,而不是單層,所以能提取到更多完整的信息

優(yōu)點(diǎn):

1、檢測速度很快

2、檢測準(zhǔn)確率比faster-rcnn和yolo高

缺點(diǎn):

文中作者提到該算法對于小的object的detection比大的object要差,還達(dá)不到Faster R-CNN的水準(zhǔn)。作者認(rèn)為原因在于這些小的object在網(wǎng)絡(luò)的頂層所占的信息量太少,另外較低層級的特征非線性程度不夠,所以增加輸入圖像的尺寸對于小的object的檢測有幫助。另外增加數(shù)據(jù)集對于小的object的檢測也有幫助,原因在于隨機(jī)裁剪后的圖像相當(dāng)于“放大”原圖像,所以這樣的裁剪操作不僅增加了圖像數(shù)量,也放大了圖像。不過這樣速度很慢。

4.1.1?FPN(CVPR2017)——對于小目標(biāo)難檢測問題的解決

FPN具體原理解析

低層的特征語義信息比較少,但是目標(biāo)位置準(zhǔn)確;高層的特征語義信息比較豐富,但是目標(biāo)位置比較粗略。對圖像feature的利用有以下四個方法:

1)輸入網(wǎng)絡(luò)前進(jìn)行裁切,然后scale,縮放圖像,這種方法會增加網(wǎng)絡(luò)訓(xùn)練和預(yù)測的時(shí)間

2)類似于faster-rcnn和fast-rcnn,對卷積網(wǎng)絡(luò)最后一層的feature map進(jìn)行利用

3)類似于SSD,在網(wǎng)絡(luò)中間,抽取一些卷積層產(chǎn)生的feature map進(jìn)行利用

4)RPN

FPN類似于SSD+FCN+RPN,先自底向上進(jìn)行正常的網(wǎng)絡(luò)前向傳播,每個階段生成空間尺寸不斷縮小的feature map,然后再從頂部的feature map(空間尺寸最小的那個)開始,進(jìn)行2倍上采樣,倒數(shù)第二層的feature map進(jìn)行1x1卷積后(通道數(shù)匹配),兩個feature map進(jìn)行加和,然后再用3x3的卷積對新的feature map進(jìn)行卷積融合,去除上采樣加和的混疊。之后就按照這個思路不斷上采樣加和到前一個stage(前向傳播中空間尺寸一致的當(dāng)做一個stage),每一個stage生成的新feature map都獨(dú)立進(jìn)行預(yù)測。這里的預(yù)測可以是把生成的feature map送入RPN中,進(jìn)行滑窗生成錨點(diǎn)和對應(yīng)的bounding box,總共有15種不同的錨點(diǎn)。

4.2?RetinaNet/Focal Loss

RetinaNet在2018提出,主要是為了驗(yàn)證一個更為重要的技術(shù)——Focal Loss。

Focal Loss的是在cross entropy損失函數(shù)上改進(jìn)的:

FL=?(1?p_{t} )^γ   log(p_{t} )

γ \gammaγ是對于容易學(xué)習(xí)樣本的懲罰,γ \gammaγ越大,越容易學(xué)習(xí)到的樣本計(jì)算后的loss越小。

一般來說,網(wǎng)絡(luò)對容易樣本的擬合能力強(qiáng),具體體現(xiàn)在輸出層的輸出的概率值接近于1。(1?p_{t} )^γ在這里的作用是將概率值大的loss變?。◤臋M軸看),將loss大的概率值變?。◤目v軸看),具體體現(xiàn)在γ越大,小概率值區(qū)間的梯度越大。

Focal loss主要解決的是one-stage類模型的正負(fù)樣本不均衡問題(we discover that the extreme foreground-background class imbalance encountered during training of dense detectors is the central cause)

4.3?EfficientDet

EfficientDet是2019年年底提出的模型,它使用EfficientNet作為backbone,并提出了BiFPN結(jié)構(gòu)。

BiFPN:Bi-directional FPN,雙向FPN

各種類型的FPN:

[FPN:自頂向下

PANet:先自頂向下再自地向上(雙向)]->簡單的多尺度特征融合方式

[NAS-FPN:NAS(神經(jīng)網(wǎng)絡(luò)架構(gòu)搜索)出來的結(jié)構(gòu)

BiFPN:雙向,重復(fù),殘差結(jié)構(gòu)]->復(fù)雜的融合方式

4.4?MTCNN

MTCNN不同于上面所有的模型,它于2016年提出,使用了**級聯(lián)(Cascade)**的思想。


MTCNN的結(jié)構(gòu)如上圖所示,由3個網(wǎng)絡(luò)構(gòu)成:1)P-Net:負(fù)責(zé)輸出候選區(qū)域;2)R-Net:負(fù)責(zé)對候選區(qū)域進(jìn)行進(jìn)一步調(diào)整;3)O-Net:負(fù)責(zé)對R-Net調(diào)整之后的區(qū)域又進(jìn)一步調(diào)整,然后輸出。有了這種級聯(lián)的思想,甚至可以根據(jù)任務(wù)需要在O-Net后面再加n個!

?MTCNN的數(shù)據(jù)處理流程如下圖:


P-Net:首先對輸入圖片使用金字塔,每縮放一次傳入P-Net得到候選區(qū)域,直至圖片縮放的12 × 12(這樣做可以檢測到多尺度的目標(biāo))。然后根據(jù)P-Net的輸出反算回原圖,得到目標(biāo)在圖片上的坐標(biāo);

R-Net:R-Net接受到P-Net輸出的目標(biāo)在原圖的候選區(qū)域(縮放到24 × 24尺度大?。┻M(jìn)行分類和調(diào)整,根據(jù)輸出反算回原圖得到目標(biāo)在圖片上的區(qū)域;

O-Net: O-Net接受到R-Net輸出的目標(biāo)在原圖的候選區(qū)域(縮放到48 × 48尺度大小)進(jìn)行分類和調(diào)整,根據(jù)輸出反算回原圖得到目標(biāo)在圖片上的區(qū)域;

NMS:NMS根據(jù)反算回原圖的坐標(biāo)結(jié)果進(jìn)行去重處理。

總結(jié)

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

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

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