1.概述
目標(biāo)檢測任務(wù)就是找到圖片中有哪些物體(分類)及它們的位置(坐標(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é)果。
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:單射。??這句話可以忽略
anchor-based模型的缺點(diǎn):
1.anchor的質(zhì)量影響模型效果;
2.大部分的在圖上的anchor都是負(fù)樣本,正負(fù)樣本不均勻的問題。
3.NMS的計(jì)算
對于anchor-free模型來說,以FCOS為例,直接對特征圖上每個像素點(diǎn)進(jìn)行預(yù)測。
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。??
Fast R-CNN是R-CNN的同一個作者(Ross Girshick)在2015年提出的。


具體做法如下:
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。??
Faster R-CNN是2016年提出的模型,作者中包括R-CNN的作者。
重點(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
在Faster-RCNN基礎(chǔ)上,進(jìn)一步提高了準(zhǔn)確率,主要以下改進(jìn):
1、使用全卷積層代替CNN basenet里面的全連接層
2、CNN得到的feature map在RoI pooling之后變成3x3大小,把groundtruth也變成3x3大小,對9宮格每個區(qū)域分別比較和投票
Mask R-CNN是何凱明在2017年提出的實(shí)例分割模型。
主要改進(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)行量化。
官方網(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年)
yolov1是發(fā)表于2016年的一種anchor-free模型。
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(可以看到全局圖像,有上下文信息)
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
Stronger
使用WordTree進(jìn)行層次分類(預(yù)測9000類的技術(shù),從大類往小類預(yù)測,層次)
YOLOv3是YOLO原作者(Joseph Redmon)最后參與的、2018年發(fā)布的模型。
主要改進(jìn)在網(wǎng)絡(luò)結(jié)構(gòu)上。
Backbone:DarkNet53! ??
Neck:FPN:
FPN接受3個尺度的特征圖32 × 32 ,16 × 16 ,8 × 8,分別對應(yīng)小、中、大尺度的目標(biāo)。每個預(yù)測分支使用3種anchor,共9個anchor。
我的翻譯: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
我的翻譯: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)!??
至今為止沒有論文,預(yù)計(jì)于2020年年底出,代碼還在更新中。模型沒啥大改動,數(shù)據(jù)集處理的亮點(diǎn)是馬賽克(Mosaic)數(shù)據(jù)增強(qiáng),不過v4也用了。具體等論文。
關(guān)于yolov5論文:?https://github.com/ultralytics/yolov5/issues/1333
SSD是2016年提出的模型。
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)難檢測問題的解決
低層的特征語義信息比較少,但是目標(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)。
RetinaNet在2018提出,主要是為了驗(yàn)證一個更為重要的技術(shù)——Focal Loss。
Focal Loss的是在cross entropy損失函數(shù)上改進(jìn)的:
γ \gammaγ是對于容易學(xué)習(xí)樣本的懲罰,γ \gammaγ越大,越容易學(xué)習(xí)到的樣本計(jì)算后的loss越小。
一般來說,網(wǎng)絡(luò)對容易樣本的擬合能力強(qiáng),具體體現(xiàn)在輸出層的輸出的概率值接近于1。
在這里的作用是將概率值大的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)
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ù)雜的融合方式
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é)
