1.概述
目標檢測任務就是找到圖片中有哪些物體(分類)及它們的位置(坐標回歸)。
1.one-stage和two-stage
one-stage直接輸出物體的類別概率和坐標,速度快,準確度較two-stage低。two-stage第一步是通過RPN(Region Proposal Network)生成候選區域,第二步對每個候選區域進行分類和回歸得到最終結果。
2.anchor-based和anchor-free
對于anchor-based模型來說,anchor的形狀是一般是通過對數據集內的框進行K-means聚類得到。anchor代表了數據集一種統計,相當于一種先驗。
3種聚合方式的特點:Mean,反映分布;Max,忽略重復;Sum:單射。??這句話可以忽略
anchor-based模型的缺點:
1.anchor的質量影響模型效果;
2.大部分的在圖上的anchor都是負樣本,正負樣本不均勻的問題。
3.NMS的計算
對于anchor-free模型來說,以FCOS為例,直接對特征圖上每個像素點進行預測。
2.R-CNN系列
two-stage
2.1?R-CNN(Region with CNN features)
R-CNN是2014年提出的,RCNN具體原理解析
整體結構如下:
網絡分為四個部分:區域劃分、特征提取、區域分類、邊框回歸
區域劃分:使用selective search算法畫出2k個左右候選框,送入CNN
特征提取:使用imagenet上訓練好的模型,進行finetune
區域分類:從頭訓練一個SVM分類器,對CNN出來的特征向量進行分類
邊框回歸:使用線性回歸,對邊框坐標進行精修
優點:
ss算法比滑窗得到候選框高效一些;使用了神經網絡的結構,準確率比傳統檢測提高了
缺點:
1、ss算法太耗時,每張圖片都分成2k,并全部送入CNN,計算量很大,訓練和inference時間長
2、四個模塊基本是單獨訓練的,CNN使用預訓練模型finetune、SVM重頭訓練、邊框回歸重頭訓練。微調困難,可能有些有利于邊框回歸的特征并沒有被CNN保留
GPU上13s/image(Nvidia的,具體沒說什么型號),CPU上53s/imge。??
Fast R-CNN是R-CNN的同一個作者(Ross Girshick)在2015年提出的。
具體做法如下:
step1:輸入是整張圖片和候選區域(Selective Search得到)的集合,經過CNN(VGG16)后得到特征圖;
step2:使用RoI pooling將特征圖采樣(RoI pooling layer+ FC)為一個定長的特征向量;
step3:對于每個RoI特征向量進行兩個任務1)softmax輸出類別;2)bbox回歸
ROI Pooling具體操作如下:
根據輸入image,將ROI映射(projection)到feature map對應位置;
將映射后的區域劃分為相同大小的sections(sections數量與輸出的維度相同);
對每個sections進行max pooling操作;
相對RCNN,準確率和速度都提高了,具體做了以下改進:
1、依舊使用了selective search算法對原始圖片進行候選區域劃分,但送入CNN的是整張原始圖片,相當于對一張圖片只做一次特征提取,計算量明顯降低
2、在原圖上selective search算法畫出的候選區域對應到CNN后面輸出的feature map上,得到2k個左右的大小長寬比不一的候選區域,然后使用RoI pooling將這些候選區域resize到統一尺寸,繼續后續的運算
3、將邊框回歸融入到卷積網絡中,相當于CNN網絡出來后,接上兩個并行的全連接網絡,一個用于分類,一個用于邊框回歸,變成多任務卷積網絡訓練。這一改進,相當于除了selective search外,剩余的屬于端到端,網絡一起訓練可以更好的使對于分類和回歸有利的特征被保留下來
4、分類器從SVM改為softmax,回歸使用平滑L1損失
缺點:因為有selective search,所以還是太慢了,一張圖片inference需要3s左右,其中2s多耗費在ss上,且整個網絡不是端到端
在nvidia k40 GPU上最快0.06s/image。??
Faster R-CNN是2016年提出的模型,作者中包括R-CNN的作者。
重點: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:卷積層對輸入的圖像進行特征提取得到特征圖;
step2:RPN網絡使用先驗anchor輸出帶有objectness socre的矩形候選區域(通過先驗anchor產生)集合;
objecness socre:二分類,表示是背景類和有目標;
倘若特征圖大小為W × H ,使用k個先驗anchor,則總共有W H k個矩形候選區域;
k表示使用k個anchor;2k:表示二分類數量,4k:是坐標數量
用下面一張圖更容易理解:
特征圖通過一個3 × 3的卷積核遍歷整個特征圖,然后以特征圖上的每個像素為中心生成k個anchor,然后利用全連接對anchors進行分類(上面的分支)和初步的bbox回歸(下面的分支)。
step3:將RPN的輸出經過ROI Pooling后進行bbox回歸和分類
引入RPN,Faster-RCNN相當于Fast-RCNN+RPN,準確率和速度進一步提高,主要做了以下改進:
1、移除selective search算法,還是整張原始圖片輸入CNN進行特征提取,在CNN后面的卷積不再使用ss算法映射過來的候選區域,而是采用新的網絡RPN,使用神經網絡自動進行候選區域劃分
2、RPN通過生成錨點,以每個錨點為中心,畫出9個不同長寬比的框,作為候選區域,然后對這些候選區域進行初步判斷和篩選,看里面是否包含物體(與groundtruth對比IoU,大于0.7的為前景,小于0.3的為背景,中間的丟棄),若沒有就刪除,減少了不必要的計算
3、有效的候選區域(置信度排序后選取大概前300個左右)進行RoI pooling后送入分類和邊框回歸網絡
優點:端到端網絡,整體進行優化訓練;使用神經網絡自動生成的候選區域對結果更有利,比ss算法好;過濾了一些無效候選區,較少了冗余計算,提升了速度
RPN訓練:
1、加載預訓練模型,訓練RPN
2、訓練fast-rcnn,使用的候選區域是RPN的輸出結果,然后進行后續的bb的回歸和分類
3、再訓練RPN,但固定網絡公共的參數,只更新RPN自己的參數
4、根據RPN,對fast-rcnn進行微調訓練
在k40 GPU上最快17fps(ZF+Fast R-CNN)??
2.4.1 R-FCN
在Faster-RCNN基礎上,進一步提高了準確率,主要以下改進:
1、使用全卷積層代替CNN basenet里面的全連接層
2、CNN得到的feature map在RoI pooling之后變成3x3大小,把groundtruth也變成3x3大小,對9宮格每個區域分別比較和投票
Mask R-CNN是何凱明在2017年提出的實例分割模型。
主要改進1)Faster R-CNN加了一個輸出mask的分支;2)將RoI Pooling改為了RoI Align
RoI Pooling的缺點?RoI pooling是在fast-rcnn里提出的,用于對大小不同的候選框進行resize之后送入后面的全連接層分類和回歸,但RoI pooling計算時存在近似/量化,即對浮點結果的像素直接近似為整數,這對于分類來說影響不大(平移不變性),但新引入的Mask分割來說,影響很大,造成結果不準確,所以引入了RoI Align,對浮點的像素,使用其周圍4個像素點進行雙線性插值,得到該浮點像素的估計值,這樣使結果更加準確
RoI Align的具體做法?如下圖所示,虛線是特征圖,黑實線是RoI區域。可以看到,RoI是保留小數的。然后將RoI的分為4個區域(本例為2 × 2 2,原文叫bin,倉),每個區域設立4個采樣點。RoI Align通過從特征圖上附近的網格點進行雙線性插值來計算每個采樣點的值。對RoI、其bin或采樣點所涉及的任何坐標不進行量化。
官方網站: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?????
關于yolov5:https://github.com/pjreddie/darknet/issues/2198???
??表示python實現;??表示新提出的模型(2020年)
yolov1是發表于2016年的一種anchor-free模型。
yolov1的模型如上圖,有24個卷積層和2個全連接層組成,輸出形狀為7 × 7 × 30。其中7 × 7表示網絡將原圖劃分為了7 × 7 個區域;30 = ( 4 + 1 ) × 2 + 20,4表示( w , h , x , y ),1表示置信度c cc,2表示預測兩個矩形框;20代表預測20個類。當然,最后輸出也可以是其他值,滿足S × S × ( B ? 5 + C )規則。
yolov1的做法如下:
圖像輸入網絡后,輸出?S × S × ( B ? 5 + C )的特征圖;?S × S特征圖中的每個格子負責預測一個類,輸出一個置信度c 加上bbox回歸的值5 55,類別信息C,如果每個格子負責預測兩個,則乘一個B。最后使用NMS去重。
顯然,yolov1最多只能預測S × S 個目標且對小目標不敏感。
YOLO缺點:
1、對小目標和密集型目標檢測的效果差,如一群小鴨子(因為圖片劃分為7x7個grid cell,而每個cell只產生兩個bounding box,意思就是每個grid cell的區域最多只會預測兩個object)(是否可以用裁剪方法得到原圖的局部放大圖?每個grid cell預測多個bounding box?最后的卷積使用14x14x20?)
2、YOLO的物體檢測精度低于其他state-of-the-art的物體檢測系統。
3、YOLO容易產生物體的定位錯誤
YOLO優點:
1、YOLO檢測物體非常快(45-155FPS)
2、YOLO可以很好的避免背景錯誤,產生false positives(可以看到全局圖像,有上下文信息)
yolov2是2017年提出,首次引入了Faster RCNN的anchor及其他的trick。
YOLO9000的論文標題為:YOLO9000: Better, Faster, Stronger
Better:
BN
高精度與訓練
Anchor
使用聚類選anchor
使用相對坐標進行預測(相對于格子)
passthrough層(將26 × 26 × 1 特征圖變為了13 × 13 × 4 的特征圖)
多尺度訓練(32的倍數{ 320 , 352 , … , 608 })
Faster:
Darknet-19
Stronger
使用WordTree進行層次分類(預測9000類的技術,從大類往小類預測,層次)
YOLOv3是YOLO原作者(Joseph Redmon)最后參與的、2018年發布的模型。
主要改進在網絡結構上。
Backbone:DarkNet53! ??
Neck:FPN:
FPN接受3個尺度的特征圖32 × 32 ,16 × 16 ,8 × 8,分別對應小、中、大尺度的目標。每個預測分支使用3種anchor,共9個anchor。
我的翻譯:https://blog.csdn.net/kobayashi_/article/details/109361339
yolov4是現在的darknet的維護者Alexey Bochkovskiy于今年(2020年4月)提出的模型,即對模型進行了優化也對數據預處理進行了優化!????
YOLOv4由下列組成:
Backbone:CSPDarknet53
Neck:SPP,PAN
Head:YOLOv3
YOLOv4使用了:
在Backbone上使用的BoF:CutMix和Mosaic數據增強,DropBlock正則化,類標簽平滑(Class label smoothing)
在Backbone上使用的BoS:Mish激活,跨階段部分連接(CSP),多輸入殘差連接加權(MiWRC)
在探測器上使用的BoF:CIoU-loss,CmBN,DropBlock正則化,Mosaic數據增強,自對抗訓練,使用對單個ground truth用對各anchor來消除網格敏感性,余弦退火scheduler,最優超參數,隨機訓練形狀
在探測器上使用的BoS:Mish激活,SPP塊,SAM塊,PAN路徑聚合塊,DIoU-NMS
我的翻譯:https://blog.csdn.net/kobayashi_/article/details/109960073
scaled-yolov4是今年(2020年11月)在yolov4的基礎上提出的,將yolov4使用的CSP技術進一步擴展到了Neck層。提高了網絡的速度,最高能跑到1774FPS(YOLOV4-tiny)!??
至今為止沒有論文,預計于2020年年底出,代碼還在更新中。模型沒啥大改動,數據集處理的亮點是馬賽克(Mosaic)數據增強,不過v4也用了。具體等論文。
關于yolov5論文:?https://github.com/ultralytics/yolov5/issues/1333
SSD是2016年提出的模型。
SSD和yolov1的對比:
對比上圖可知,SSD使用了多尺度的特征圖進行檢測,這樣做的好處是可以利用多種尺度的特征圖來預測多種尺度的目標。SSD對小目標的檢測能力優于yolov1。同時,又因為SSD生成的多尺度default box一定有更高概率找到更加貼近于 Ground Truth 的候選框,所以模型的訓練穩定性是肯定比yolov1強。
SSD算法的核心:
1、對于每個feature map cell都使用多種橫縱比的default boxes,所以算法對于不同橫縱比的object的檢測都有效
2、對default boxes的使用來自于多個層次的feature map,而不是單層,所以能提取到更多完整的信息
優點:
1、檢測速度很快
2、檢測準確率比faster-rcnn和yolo高
缺點:
文中作者提到該算法對于小的object的detection比大的object要差,還達不到Faster R-CNN的水準。作者認為原因在于這些小的object在網絡的頂層所占的信息量太少,另外較低層級的特征非線性程度不夠,所以增加輸入圖像的尺寸對于小的object的檢測有幫助。另外增加數據集對于小的object的檢測也有幫助,原因在于隨機裁剪后的圖像相當于“放大”原圖像,所以這樣的裁剪操作不僅增加了圖像數量,也放大了圖像。不過這樣速度很慢。
4.1.1?FPN(CVPR2017)——對于小目標難檢測問題的解決
低層的特征語義信息比較少,但是目標位置準確;高層的特征語義信息比較豐富,但是目標位置比較粗略。對圖像feature的利用有以下四個方法:
1)輸入網絡前進行裁切,然后scale,縮放圖像,這種方法會增加網絡訓練和預測的時間
2)類似于faster-rcnn和fast-rcnn,對卷積網絡最后一層的feature map進行利用
3)類似于SSD,在網絡中間,抽取一些卷積層產生的feature map進行利用
4)RPN
FPN類似于SSD+FCN+RPN,先自底向上進行正常的網絡前向傳播,每個階段生成空間尺寸不斷縮小的feature map,然后再從頂部的feature map(空間尺寸最小的那個)開始,進行2倍上采樣,倒數第二層的feature map進行1x1卷積后(通道數匹配),兩個feature map進行加和,然后再用3x3的卷積對新的feature map進行卷積融合,去除上采樣加和的混疊。之后就按照這個思路不斷上采樣加和到前一個stage(前向傳播中空間尺寸一致的當做一個stage),每一個stage生成的新feature map都獨立進行預測。這里的預測可以是把生成的feature map送入RPN中,進行滑窗生成錨點和對應的bounding box,總共有15種不同的錨點。
RetinaNet在2018提出,主要是為了驗證一個更為重要的技術——Focal Loss。
Focal Loss的是在cross entropy損失函數上改進的:
γ \gammaγ是對于容易學習樣本的懲罰,γ \gammaγ越大,越容易學習到的樣本計算后的loss越小。
一般來說,網絡對容易樣本的擬合能力強,具體體現在輸出層的輸出的概率值接近于1。
在這里的作用是將概率值大的loss變小(從橫軸看),將loss大的概率值變小(從縱軸看),具體體現在γ越大,小概率值區間的梯度越大。
Focal loss主要解決的是one-stage類模型的正負樣本不均衡問題(we discover that the extreme foreground-background class imbalance encountered during training of dense detectors is the central cause)
EfficientDet是2019年年底提出的模型,它使用EfficientNet作為backbone,并提出了BiFPN結構。
BiFPN:Bi-directional FPN,雙向FPN
各種類型的FPN:
[FPN:自頂向下
PANet:先自頂向下再自地向上(雙向)]->簡單的多尺度特征融合方式
[NAS-FPN:NAS(神經網絡架構搜索)出來的結構
BiFPN:雙向,重復,殘差結構]->復雜的融合方式
MTCNN不同于上面所有的模型,它于2016年提出,使用了**級聯(Cascade)**的思想。
MTCNN的結構如上圖所示,由3個網絡構成:1)P-Net:負責輸出候選區域;2)R-Net:負責對候選區域進行進一步調整;3)O-Net:負責對R-Net調整之后的區域又進一步調整,然后輸出。有了這種級聯的思想,甚至可以根據任務需要在O-Net后面再加n個!
?MTCNN的數據處理流程如下圖:
P-Net:首先對輸入圖片使用金字塔,每縮放一次傳入P-Net得到候選區域,直至圖片縮放的12 × 12(這樣做可以檢測到多尺度的目標)。然后根據P-Net的輸出反算回原圖,得到目標在圖片上的坐標;
R-Net:R-Net接受到P-Net輸出的目標在原圖的候選區域(縮放到24 × 24尺度大小)進行分類和調整,根據輸出反算回原圖得到目標在圖片上的區域;
O-Net: O-Net接受到R-Net輸出的目標在原圖的候選區域(縮放到48 × 48尺度大小)進行分類和調整,根據輸出反算回原圖得到目標在圖片上的區域;
NMS:NMS根據反算回原圖的坐標結果進行去重處理。
總結