在深度學(xué)習(xí)領(lǐng)域中,圖像分類,目標(biāo)檢測和目標(biāo)分割是三個相對來說較為基礎(chǔ)的任務(wù)了。再加上圖像生成(GAN,VAE,擴散模型),keypoints關(guān)鍵點檢測等等,基本上涵蓋了圖像領(lǐng)域大部分場景了。
尤其是在目標(biāo)檢測,一直是各大比賽(Pascal VOC, COCO, ImageNet)
的主要任務(wù)。與此同時,檢測任務(wù)中的兩大流派:one-stage、two-stage
一直是熱議的話題。同時,也是面試官最喜歡問的話題。
早期的物體檢測多使用滑動窗口與分類器配合行動。在兩步方案中,R-CNN首先在第二階段使用卷積神經(jīng)網(wǎng)絡(luò)極大的提升了準(zhǔn)確率,開啟了物體檢測的新紀(jì)元。RPN的出現(xiàn)則將兩步方案統(tǒng)一在一個神經(jīng)網(wǎng)絡(luò)中,得名Faster R-CNN。單步檢測器的出現(xiàn)極大的提升了檢測速度,但是卻以準(zhǔn)確率下降為代價。
單步檢測器面臨的最大問題:在于訓(xùn)練過程中正負(fù)(positive and negative)樣本的極端不均衡。每張圖像成千上萬個待檢對象中,只有數(shù)個包含了有效物體(positive)。這造成兩個不利后果:
- 訓(xùn)練的效率下降。大部分位置極易被歸為負(fù)樣本,對有效的學(xué)習(xí)沒有幫助。
- 大量的容易負(fù)樣本主導(dǎo)了訓(xùn)練過程,造成模型退化。
穩(wěn)健的損失函數(shù)一直是研究的熱點之一。例如Huber loss
降低異常樣本(困難樣本)的權(quán)重。而Focal loss
則注重降低常規(guī)樣本(簡單樣本)的權(quán)重,集中精力在困難樣本上。
針對本文的這個問題,我也幫你們提前問了chatGPT,也給出了一個較為總結(jié)性的回答,如下所示。你們覺得它回答的如何呢?
chatGPT已經(jīng)對本節(jié)的內(nèi)容,給出了一個大體的概括,總結(jié)下,包括
算法模型呢:
-
one stage
的算法包括SSD、yolo、Retina Net
等等 -
two stage
的算法包括fast RCNN
系列,和用于分割的Mask RCNN
系列
優(yōu)點呢:
1. one stage
的算法速度非??欤m合做實時檢測的任務(wù),比如視頻;
2. two stage
的算法速度慢,但是檢測效果更佳;
缺點呢?
-
one stage
的算法通常相比于two stage
的算法,效果不太好 -
two stage
的算法經(jīng)過了一步初篩,通常效果會更好,更準(zhǔn)確
目標(biāo)檢測算法綜述截圖,展示了隨時間發(fā)展,one- stage
和two- stage
的發(fā)展分枝。從2014年RCNN
開始,再到后來SSD和YOLO
的橫空出世,基本上奠定了兩條路的主基調(diào)。
一、two stage
two stage
的代表faster RCNN
的模型結(jié)構(gòu)圖。稍微簡述下:
- 特征提取模塊
backbone
,主要用于對輸入圖像進行特征抽取,輸出特征圖Feature Map
,一般會采用resnet、VGG,GoogLeNet
的主干部分(去掉全連接層)作為backbone
. - 第一階段的
RPN(region proposal network)
區(qū)域推薦網(wǎng)絡(luò),主要就是基于backbone
輸出的Feature Map
,篩選目標(biāo)候選框,給出進一步判斷的Proposal
- 在
RPN
完成后,得到的候選框還只是區(qū)分出它是前景positive
和背景negative
,還不能區(qū)分是貓,還是狗 - 于是,就有了第二階段,對第一階段提議的
陽性positive
候選框Proposal
,與backbone
輸出的Feature Map
,裁剪出區(qū)域,經(jīng)過ROI Pooling
,統(tǒng)一到一致的尺寸,進入到ROI Head
階段。 - 經(jīng)過卷積和全連接層,區(qū)分出具體的
類別cls和bbox coor(cx, cy, pw, ph)
的偏移量(tx, ty, tw, th)
,進一步修正目標(biāo)框,得到最終的位置(bx=σ(tx)+cx, by=σ(ty)+cy, bw=pw*tw, bh=ph*th)
。
如下圖所示,這樣看,是不是真的把預(yù)測目標(biāo)檢測的任務(wù),給拆分成兩個階段分段的來進行預(yù)測的呢?更多內(nèi)容推薦閱讀這里:一文讀懂Faster RCNN
1.1、訓(xùn)練和驗證階段
其實,要理解faster RCNN
的整理工作方式,需要區(qū)分成訓(xùn)練階段train
和推理階段inference
,區(qū)別對待。
先說簡單的推理階段inference
。
推理階段與訓(xùn)練階段最大的不同,就是推理階段沒有金標(biāo)準(zhǔn)target
, 也就沒有計算損失,更沒有辦法更新網(wǎng)絡(luò)模型:
-
backbone
的特征提取階段,接觸不到target,所以這個階段沒有損失值,兩個階段都是一樣的,就是負(fù)責(zé)把輸入圖像,轉(zhuǎn)成特征圖; -
RPN
階段就不同了,因為這個階段是要為最后的分類,提供proposal的。這個proposal需要引入anchor box,所有的proposal都會被傳入ROI Pooling層進行分類和回歸; - 在
ROI Head
階段,RPN推薦的proposal會經(jīng)過ROI Pooling層,調(diào)整到統(tǒng)一大小,例如7x7。經(jīng)過兩個fc層,輸出具體的類別+背景,和坐標(biāo)框。 - RPN階段返回的proposal相互之間是高度重疊的,采用了
NMS
降低數(shù)量。
然后是訓(xùn)練階段train
。
訓(xùn)練階段就要計算損失了,就要更新模型了,這塊都是與推理階段不一樣的:
- backbone的特征提取階段,一樣;
- RPN階段就不同了,因為這個階段,需要區(qū)分
positive
還是negative
。咋知道這個anchor是陽性,還是陰性呢?那就需要使用標(biāo)記target進行區(qū)分。在這個階段,有了IOU
,就是PD與GT計算IOU。如何區(qū)分陽性還是陰性呢?
-
IOU值大于0.7
的是陽性, -
IOU值小于0.3
的是陰性, -
其他
丟棄掉;
we randomly sample 256 anchors in an image to compute the loss function of a mini-batch, where the sampled positive and negative anchors have a ratio of up to 1:1. If there are fewer than 128 positive samples in an image, we pad the mini-batch with negative ones.
上段部分來自于論文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 的Training RPNs部分。
翻譯過來的意思就是:在RPN
階段計算一個mini batch的loss function
時候,我們隨機的在一張圖片中選擇256個anchor
,陽性和陰性的樣本比例1:1
。如果一種圖片中的陽性anchor少于128個,就用negative補上。
- 此時,RPN階段的損失,也是由
2分之一(0.5)
的positive和2分之1
的negative組成的,參與損失計算,包括陽性or陰性類別損失和位置偏移損失; - 最后,在
ROI Head
階段,輸出具體的類別,和坐標(biāo)框,這兩塊都要參與到損失的計算,比較的好理解。 - NMS在訓(xùn)練階段,不參與。(我理解是因為在訓(xùn)練階段,NMS會去除掉很多的正樣本,使得正負(fù)樣本就更加的不均衡了)
問:在訓(xùn)練train
階段,會有哪些損失值?(面試中常被提及的問題)
-
RPN 損失函數(shù)
:在 RPN 階段,會使用 RPN 模型生成一系列 anchor,并根據(jù)這些 anchor 來進行目標(biāo)檢測。RPN 損失函數(shù)一般包括兩個部分:- 分類損失(交叉熵?fù)p失):分類損失用于判斷 anchor 是否為前景(即是否包含目標(biāo))
- 回歸損失(Smooth L1 ):回歸損失用于計算anchor和gt bounding box的誤差。
-
Fast R-CNN (ROI Head)損失函數(shù)
:在 Fast R-CNN 階段,會使用 RoI Pooling 對 RPN 生成的 proposal 進行特征提取,并對提取的特征進行分類和回歸。Fast R-CNN 損失函數(shù)同樣包括分類損失和回歸損失:- 分類損失(交叉熵?fù)p失):經(jīng)過softmax后,各個類別對應(yīng)的損失;
- 回歸損失(Smooth L1 ):回歸損失用于計算roi和gt bounding box的誤差。
-
總損失函數(shù):在訓(xùn)練過程中,RPN 和 Fast R-CNN 的損失函數(shù)需要同時進行優(yōu)化。因此,一般會將 RPN 和 Fast R-CNN 的損失函數(shù)合并為一個總損失函數(shù)(當(dāng)然,也可以分別進行回歸調(diào)整),并使用反向傳播算法來進行優(yōu)化。
損失圖;
兩個階段的位置損失都是 Smooth L1
,同樣一個位置,為啥需要計算兩次損失呢?然后回歸兩次位置呢?
-
RPN 階段和 Fast R-CNN 階段中的位置都是反映在原圖上的同一塊像素區(qū)域,都是表示物體的位置偏移量。
-
對于RPN階段,先對
anchor
進行一次位置回歸,得到一組粗略的預(yù)測框,再利用這些預(yù)測框去RoI pooling得到RoI,最后對RoI進行第二次位置回歸,得到最終的目標(biāo)框位置。 -
在 RPN 階段中,每個 anchor 與其對應(yīng)的 ground-truth bbox 之間的位置偏移量會被計算,并通過 Smooth L1 損失函數(shù)來度量它們之間的差異。這個損失函數(shù)的計算僅涉及到對 anchor 的位置回歸。
-
在 Fast R-CNN 階段中,由于每個
RoI
的形狀都是不同的,所以每個 RoI 與其對應(yīng)的 ground-truth bbox 之間的位置偏移量也需要被計算,并通過 Smooth L1 損失函數(shù)來度量它們之間的差異。這個損失函數(shù)的計算涉及到對 RoI 的位置回歸。 -
因此,F(xiàn)aster R-CNN 中需要計算兩次位置損失,是因為兩個階段都需要對物體的位置進行回歸。需要注意的是,這兩個階段的位置回歸所針對的對象是不同的:
- RPN 階段中的位置回歸是針對 anchor 的;
- 而 Fast R-CNN 階段中的位置回歸是針對 RoI 的。
-
兩次位置回歸的目的都是為了使目標(biāo)框的位置預(yù)測更加準(zhǔn)確。
1.2、RCNN、fast RCNN、faster RCNN橫評
1.2.1、RCNN(Region-based Convolutional Neutal Network)
- 目標(biāo)框的獲取方式:select search(選擇性搜索算法)來生成候選區(qū)域,從原圖裁剪出ROIs
- 分類方式:SVM
- 目標(biāo)位置:bounding-box regressor
缺點:
- 訓(xùn)練是多階段的:先fine tunes目標(biāo)proposal;再訓(xùn)練SVM分類器;再訓(xùn)練bounding box回歸器
- 訓(xùn)練再內(nèi)存空間和時間上開銷大:分階段訓(xùn)練,不同階段的輸出需要寫入內(nèi)存
- 目標(biāo)檢測很慢
1.2.2、 fast RCNN
- 目標(biāo)框的獲取方式:input image和region of interest(ROIs)在特征層階段相遇、裁剪,經(jīng)過RoI max pooling,調(diào)整成一致尺寸(學(xué)習(xí)了SPP Net,例如7x7大?。?,送入fully convolutional network.
- 分類方式:分類分支,經(jīng)過softmax輸出類別,
- 目標(biāo)位置:Bbox regressor輸出位置偏移
缺點:候選區(qū)域的生成仍然采用選擇性搜索算法,速度仍有提升空間
1.2.3、faster RCNN
- 目標(biāo)框的獲取方式:基于anchor base的RPN階段,用于輸出候選的proposal,和特征層相遇、經(jīng)過
RoI max pooling
,調(diào)整成一致尺寸,送入fully convolutional network.
- 分類方式:分類分支,經(jīng)過
softmax
輸出類別, - 目標(biāo)位置:
Bbox regressor
輸出位置偏移
1.3、mask RCNN
mask RCNN
是在faster RCNN
的基礎(chǔ)上,增加了一個mask預(yù)測分值
。其中為了得到更好的mask精細(xì)分割結(jié)果,在fast rcnn head
階段,將之前目標(biāo)檢測的roi pooling,替換成roi align
。
在分類和Bbox預(yù)測,均和faster RCNN
是一樣的,在mask預(yù)測有差別
,其中:
- 在分類部分,輸出的
shape為(N, num_classes)
,其中N為RoI的數(shù)量,num_classes為類別數(shù)量(包括背景類)。每個RoI對應(yīng)著num_classes個概率值,分別表示該RoI屬于不同類別的概率。 - 在Bbox回歸部分,輸出的shape也為
(N, 4 x num_classes)
,其中每個RoI對應(yīng)著4 x num_classes
個偏移量,分別表示該RoI相對于目標(biāo)框的水平偏移量、垂直偏移量、寬度縮放比例和高度縮放比例。 - binary mask預(yù)測部分,每個RoI對應(yīng)的特征圖塊上應(yīng)用一個
全卷積網(wǎng)絡(luò)(Fully Conv Network, FCN)
,輸出的shape為(N, mask_height, mask_width, num_classes)
,其中:- N為RoI的數(shù)量
- mask_height和mask_width為輸出mask的高度和寬度,
- num_classes為類別數(shù)量,
- 輸出的每個元素表示該RoI屬于對應(yīng)類別時,每個像素點經(jīng)過
per-pixel sigmoid
操作,輸出為前景(即目標(biāo)物體)的概率, - mask 采用
binary cross-entropy loss
(only defined on the k-th mask ,other mask outputs do not contribute to the loss.)
問:為什么在分類階段,已經(jīng)對roi的類別進行了預(yù)測,在mask預(yù)測階段,還要對每一個classes進行mask預(yù)測呢?
答:在傳統(tǒng)的目標(biāo)檢測中,通常是先使用分類器對目標(biāo)進行分類,然后使用回歸器對目標(biāo)的位置進行精確定位,最后再使用分割模型對目標(biāo)進行像素級別的分割。這種做法將分類、定位和分割三個任務(wù)放在了不同的階段進行,每個任務(wù)都需要單獨地訓(xùn)練模型,而且彼此之間存在一定的耦合關(guān)系。
相比之下,Mask R-CNN 將分類、定位和分割三個任務(wù)整合到了同一個網(wǎng)絡(luò)中進行聯(lián)合訓(xùn)練,通過共享網(wǎng)絡(luò)層來解耦三個任務(wù)之間的關(guān)系。
具體來說,Mask R-CNN 在 RoI pooling 的基礎(chǔ)上增加了一個分割分支,該分支由一個全卷積網(wǎng)絡(luò)組成,負(fù)責(zé)對每個 RoI 中的像素進行分類,并生成相應(yīng)的掩碼。因此,分類、定位和分割三個任務(wù)可以在同一個網(wǎng)絡(luò)中共享特征,同時也能夠互相影響和優(yōu)化。
Mask R-CNN
的這種設(shè)計方式可以使不同任務(wù)之間的關(guān)系更加松散,同時也能夠提高網(wǎng)絡(luò)的訓(xùn)練效率和泛化能力,使得網(wǎng)絡(luò)更加容易學(xué)習(xí)到目標(biāo)的語義信息,從而提高目標(biāo)檢測和分割的準(zhǔn)確率。
二、one stage
one stage的開山之作yolo v1
(論文地址:you only look once)。其中下面是一張網(wǎng)絡(luò)模型的簡圖,可以看到:
- 輸入圖像,經(jīng)過一連串的卷積層操作
(24 convolutional layers)
,得到了一個channel=1024
維的向量; - 得到下采樣特征圖后,連接
2個 fully connected layers
。 - 直接得到預(yù)測輸出的
output
,大小是:7x7x30,S ×S×(B?5+C) tensor。For evaluating YOLO on PASCAL VOC, we use S = 7, B =2. PASCAL VOC has 20 labelled classes so C = 20. Our final prediction is a 7 × 7 × 30 tensor.
可以看出來,yolo v1
將目標(biāo)檢測問題,轉(zhuǎn)化為了回歸問題。把中間網(wǎng)絡(luò)模型學(xué)習(xí)做的事情,都當(dāng)做了一個黑箱,就是輸入圖像,輸出目標(biāo)。具體中間網(wǎng)絡(luò)是如何辦到的?這個不管,全部交由網(wǎng)絡(luò)模型的監(jiān)督信號,自己擬合。
2.1、訓(xùn)練和驗證階段
要理解單階段YOLO V1
的整體工作方式,需要區(qū)分成訓(xùn)練階段train
和推理階段inference
,區(qū)別對待。
訓(xùn)練階段train:損失函數(shù)定義如下:
要想要看到上面的損失函數(shù)公式,首先要了解這些字母,都表示是什么?其中:
-
S, grid cell size
,論文里面是7 -
B, bounding box
個數(shù),論文里面是2 -
x, y, w, h
, 分別表示bounding box
的中心點坐標(biāo),和寬、高 -
C, Confidence
,是否有目標(biāo)的概率 -
p, Pr(Classi|Object)
,有目標(biāo)下類別的條件概率 -
obj,noobj
,表示有物體的權(quán)重和沒有物體 -
λcoord = 5 ,λnoobj = .5
,有物體的權(quán)重和沒有物體的權(quán)重
每兩項之間,都是算距離的,都是按照回歸的方式進行求損失的。其他的建議參考這里:YOLO(You Only Look Once)算法詳解。那包括了哪些損失呢?
問:YOLO V1
損失函數(shù),包括(面試中常被提及的問題):
-
confidence loss
(C) 目標(biāo)置信度損失,框內(nèi)是有目標(biāo)的損失; -
classification loss
(pc) 在有目標(biāo)下,分類的損失 -
localization loss
(x, y, w, h) 定位損失,預(yù)測框和真實框之間的誤差
(在YOLO系列的損失函數(shù)中,經(jīng)過被忘記的就是目標(biāo)置信度損失,表示有目標(biāo)的置信度;因為后面預(yù)測具體類別的概率,其實是一個條件概率,也就是有目標(biāo)情況下的概率,這塊后面會展開)
問:在yolo系列中,為什么要把分類任務(wù),給拆分為是否有目標(biāo)的概率,和目標(biāo)下類別的條件概率呢?為什么不能像其他目標(biāo)檢測任務(wù)一樣,直接對類別進行預(yù)測呢?
在YOLO系列中,將分類任務(wù)拆分為是否有目標(biāo)的概率和目標(biāo)下類別的條件概率是為了解決兩個問題:
-
目標(biāo)檢測中的類別不平衡問題(具體的各個類,數(shù)量不等,不是有目標(biāo)和無目標(biāo)的數(shù)量):在目標(biāo)檢測任務(wù)中,不同類別的目標(biāo)可能具有不同的頻率。如果直接對類別進行預(yù)測,那些出現(xiàn)頻率較低的類別可能會被忽視或預(yù)測不準(zhǔn)確。通過將分類任務(wù)拆分為是否有目標(biāo)的概率和目標(biāo)下類別的條件概率,可以更好地處理類別不平衡問題。模型可以更容易地學(xué)習(xí)到是否存在目標(biāo)的信息,并獨立地預(yù)測每個類別的條件概率。
-
目標(biāo)多樣性問題:目標(biāo)檢測任務(wù)中的目標(biāo)可能具有不同的尺寸、形狀和外觀。將分類任務(wù)拆分為是否有目標(biāo)的概率和目標(biāo)下類別的條件概率可以更好地適應(yīng)目標(biāo)的多樣性。通過預(yù)測是否有目標(biāo)的概率,模型可以快速過濾掉圖像中沒有目標(biāo)的區(qū)域,從而減少計算量。而目標(biāo)下類別的條件概率可以更準(zhǔn)確地預(yù)測每個目標(biāo)的類別,而不受其他類別的干擾。
怎么理解呢?
- 模型通過預(yù)測每個anchor是否包含目標(biāo)的概率來確定感興趣的區(qū)域。
- 對于那些被預(yù)測為沒有目標(biāo)的anchor,可以忽略它們,無需進行進一步的處理和計算。這樣做可以減少對這些區(qū)域的特征提取、分類和回歸等計算步驟,從而降低整體的計算量。
- 通過減少對沒有目標(biāo)的區(qū)域的處理,模型可以更高效地進行目標(biāo)檢測,并在處理大量候選區(qū)域時提高速度。這對于處理大尺寸圖像或在實時場景中進行目標(biāo)檢測尤為重要,可以提升模型的實用性和效率。
因此,將分類任務(wù)拆分為是否有目標(biāo)的概率和目標(biāo)下類別的條件概率,可以提高目標(biāo)檢測的準(zhǔn)確性和魯棒性,同時解決類別不平衡和目標(biāo)多樣性等問題。
在inference階段,步驟如下:
- 對于輸入圖像,
resize
為一個正方形(416x416)
- split the image into grid,大小為7x7
- 每一個grid cell 都預(yù)測B各bounding box框,論文里面B=2
- 每一個grid cell 只預(yù)測一個類。B=2兩個網(wǎng)格,那一個grid cell就是2個網(wǎng)格,兩個類
- 每一個bounding box框,有
4個位置參數(shù)(x_c,y_c,w,h)
和1個置信度P(Object)
,表示有物體的概率,用于區(qū)分存在目標(biāo)物體,還是背景 - 到這里,就有了
7x7x2=98個bounding box框
,每一個框都包含5個參數(shù)(x_c,y_c,w,h,confidence)
- 每個
bounding box
框的中心點,都在對應(yīng)的grid cell
像素內(nèi)。一個grid cell
預(yù)測2個bounding box
,就是10個參數(shù),再加上目標(biāo)條件概率20個類,每一個類都有一個條件概率P(Car|Object)
。在該階段,最后對應(yīng)類的概率=P(Car|Object) x P(Object)
。 - 這樣一個grid cell對應(yīng)的輸出向量就是
2x5+20=30
個。再加上一張輸入圖像被劃分為7x7個grid cell
,最后的輸出就是7x7x30
個張量大小。 - 至此,我們就預(yù)測得到了一堆框框,個數(shù)是
7x7x2=98
。最后經(jīng)過NMS
,去掉用于的框,得到最終的預(yù)測結(jié)果。
(在沒有理解清楚這段之前,我一直在疑惑:
為什么2個bounding box已經(jīng)有了一個概率,這個概率是什么?后面20個類,是可以區(qū)分具體這個bounding
box屬于哪個類的,他們之間又是什么關(guān)系。不知道你到這里,是否理解清楚了)
這塊視頻詳解,參考這里:【精讀AI論文】YOLO V1目標(biāo)檢測,看我就夠了-同濟子豪兄
一步到位,沒有two stage
的先預(yù)測出前景還是背景,然后在預(yù)測具體類別的過程,簡化了很多,端到端的過程。
YOLO v1算法的缺點:
1、位置精確性差,對于小目標(biāo)物體以及物體比較密集的也檢測不好(grid cell的原因,因為只能預(yù)測98個框),比如一群小鳥。
2、YOLO雖然可以降低將背景檢測為物體的概率,但同時導(dǎo)致召回率較低。
2.2、YOLOv1、 YOLOv2、 YOLOv3、橫評
YOLOv2
進行了許多改進,包括以下幾個方面:
- 使用 batch normalization:YOLOv2 在卷積層后加入 Batch Normalization,可以加速訓(xùn)練,提高模型的精度和魯棒性。
- 改進網(wǎng)絡(luò)結(jié)構(gòu):YOLOv2 采用了更深的網(wǎng)絡(luò)結(jié)構(gòu),引入了殘差網(wǎng)絡(luò)(ResNet)的結(jié)構(gòu),和NIN結(jié)構(gòu),增加了網(wǎng)絡(luò)層數(shù)
- anchor boxes: 替代了之前的固定網(wǎng)格grid cell來提高物體檢測的精度,kmean聚類確定anchor尺寸。
- passthrough layer 細(xì)粒度特征
- 采用了多尺度訓(xùn)練和預(yù)測: 引入了多尺度訓(xùn)練方法,可以提高模型對不同尺度物體的檢測能力。(不同于FPN,他是在訓(xùn)練階段每10個batch,會重新選擇一個新的圖像尺寸,包括{320,352,…,608}等等32倍數(shù)的尺寸)
YOLOv3
的改進主要集中在以下幾個方面:
- 使用了更深的 Darknet-53 網(wǎng)絡(luò):YOLOv3 使用了一個名為 Darknet-53 的更深的卷積神經(jīng)網(wǎng)絡(luò),相較于之前的 Darknet-19 網(wǎng)絡(luò),它具有更強的特征提取能力,可以提高目標(biāo)檢測的準(zhǔn)確性。
- 引入了 FPN 特征金字塔:YOLOv3 引入了 FPN(Feature Pyramid Network)特征金字塔,可以利用不同層級的特征信息進行目標(biāo)檢測(predicts boxes at 3 different scales. predict 3 boxes at each scale),從而提高檢測的準(zhǔn)確性。
- 使用更多的 Anchor Boxes:YOLOv3 使用了更多的 Anchor Boxes,可以更好地適應(yīng)不同大小和形狀的目標(biāo)物體,依舊使用 k-means clustering。
- 首次binary cross-entropy loss 用于分類
yolo v3之后,作者就不在更新YOLO系列了,再之后的改版,都是其他人或者團隊繼續(xù)更新的。YOLOv5再YOLOv4更新的沒多久就出來了,且是pytorch的開源代碼,所以相比于YOLOv4的C版本,受眾更多。
YOLOv5
(沒有論文)的改進主要集中在以下幾個方面:
- 自適應(yīng)anchor:在訓(xùn)練模型時,YOLOv5 會自己學(xué)習(xí)數(shù)據(jù)集中的最佳 anchor boxes,而不再需要先離線運行 K-means 算法聚類得到 k 個 anchor box 并修改 head 網(wǎng)絡(luò)參數(shù)??偟膩碚f,YOLOv5 流程簡單且自動化了。
- 自適應(yīng)圖片縮放(letterBox)
- Focus結(jié)構(gòu)
結(jié)構(gòu)圖:
在Focus
結(jié)構(gòu)中:
- 原始的
640 × 640 × 3
的圖像輸入Focus
結(jié)構(gòu),采用切片操作。 - 具體操作是在一張圖片中每隔一個像素拿到一個值,類似于鄰近下采樣。
- 將一個channel上,W、H信息就集中到了通道空間,輸入通道擴充了
4倍
;RGB 3個
通道,就變成了12個channel
。 - 先變成
320 × 320 × 12
的特征圖,再經(jīng)過一次卷積操作,最終變成320 × 320 × 32
的特征圖。 - 最終得到了沒有信息丟失情況下的二倍下采樣特征圖。
- 目的是:減少傳統(tǒng)下采樣帶來的信息損失。
- 切片操作如下:
詳盡內(nèi)容建議參考這里:yolov5中的Focus模塊的理解
YOLOv5
4個大結(jié)構(gòu),分別是:
- 輸入端:
Mosaic
數(shù)據(jù)增強(對于小目標(biāo)的檢測效果好)、cutMix、MixUP。自適應(yīng)錨框計算、自適應(yīng)圖片縮放 - Backbone:
Focus結(jié)構(gòu)
(slice切片操作,把高分辨率的圖片(特征圖)拆分成多個低分辨率的圖片/特征圖,即隔列采樣+拼接,可以減少下采樣帶來的信息損失),CSP結(jié)構(gòu) - Neck:FPN+
PAN
結(jié)構(gòu) - Prediction:GIOU_Loss
(YOLOv5
不分給的創(chuàng)新點,很多是在YOLOv4
階段就有的,這里就沒有分開說了,細(xì)節(jié)的可以參考下面這個文章)
更多詳細(xì)的部分,建議參考這里:深入淺出Yolo系列之Yolov3&Yolov4&Yolov5&Yolox核心基礎(chǔ)知識完整講解
問:了解為什么要進行Mosaic數(shù)據(jù)增強呢?
答:在平時項目訓(xùn)練時,小目標(biāo)的AP一般比中目標(biāo)和大目標(biāo)低很多。而Coco數(shù)據(jù)集中也包含大量的小目標(biāo),但比較麻煩的是小目標(biāo)的分布并不均勻。主要有幾個優(yōu)點:
- 豐富數(shù)據(jù)集:隨機使用4張圖片,隨機縮放,再隨機分布進行拼接,大大豐富了檢測數(shù)據(jù)集,特別是隨機縮放增加了很多小目標(biāo),讓網(wǎng)絡(luò)的魯棒性更好。
- 減少GPU:可能會有人說,隨機縮放,普通的數(shù)據(jù)增強也可以做,但作者考慮到很多人可能只有一個GPU,因此Mosaic增強訓(xùn)練時,可以直接計算4張圖片的數(shù)據(jù),使得Mini-batch大小并不需要很大,一個GPU就可以達到比較好的效果。
三、性能對比
下面是在論文centerNet中,作者對普遍常用的目標(biāo)檢測、分割模型做了次系統(tǒng)的測試。其中,上部分是two stage的主要算法,下部分是one stage的主要算法??梢园l(fā)現(xiàn):
-
FPS
幀率這塊,one stage都是相對比較快的,尤其是yolo系列。two stage就慢了很多。 - two stage的
AP
就比較的高,最高能到48.4,低的也有46,而one stage的就比較低,最高才45。尤其是TridentNet
,幾乎是這些里面,各個領(lǐng)域都是最佳的。
四、總結(jié)
到這里,目標(biāo)檢測中one-stage、two-stage
算法的內(nèi)容基本上就結(jié)束了。但是,面試官是不會罷休的,他會沿著目標(biāo)檢測算法,繼續(xù)深入展開,比如:
-
anchor base
(anchor boxes)和anchor free
分別是什么?有什么區(qū)別和優(yōu)缺點?直達鏈接:【AI面試】Anchor based 、 Anchor free 和 no anchor 的辨析 -
faster RCNN
的ROI Pooling
和mask RCNN
的ROI Align
分別是什么?有什么有缺點? -
yolo
的損失函數(shù)式什么?faster RCNN
的損失函數(shù)又是什么? - 等等
所以說,目標(biāo)檢測是深度學(xué)習(xí)領(lǐng)域的一個重點,能夠考察的內(nèi)容很多,主要還是因為在各個企業(yè)里面,這塊的內(nèi)容,是真實可以落地的。所以,這塊內(nèi)容是真要吃透。
(上文內(nèi)容,比較的豐富,和比較的雜。是根據(jù)論文和一些網(wǎng)絡(luò)資料綜合記錄的。如果你對其中的內(nèi)容,存在異議或需要糾正的地方,歡迎評論區(qū)留言,一起進步,謝謝)
如果恰巧你也是在這個領(lǐng)域內(nèi)做研究的,并且恰好在準(zhǔn)備找工作,那么訂閱這篇面試專欄,就再好不過了,專欄鏈接:7天快速通過AI/CV面試
我想這個專欄提供的不僅僅是學(xué)習(xí)到了哪些面試過程中可能真實遇到的問題,更多的是返回來,思考自己簡歷中撰寫的研究可能會被問到的問題。預(yù)先思考,總比臨場發(fā)揮要好,這樣也幫助自己進步。文章來源:http://www.zghlxwxcb.cn/news/detail-519656.html
最后,如果您覺得本篇文章對你有幫助,歡迎點贊 ??,讓更多人看到,這是對我繼續(xù)寫下去的鼓勵。如果能再點擊下方的紅包打賞,給博主來一杯咖啡,那就太好了。??文章來源地址http://www.zghlxwxcb.cn/news/detail-519656.html
到了這里,關(guān)于【AI面試】目標(biāo)檢測中one-stage、two-stage算法的內(nèi)容和優(yōu)缺點對比匯總的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!