目標(biāo)檢測(cè)算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3,yoloV4,yoloV5,yoloV6,yoloV7)
1.引言
深度學(xué)習(xí)目前已經(jīng)應(yīng)用到了各個(gè)領(lǐng)域,應(yīng)用場(chǎng)景大體分為三類:物體識(shí)別,目標(biāo)檢測(cè),自然語言處理。 目標(biāo)檢測(cè)可以理解為是物體識(shí)別和物體定位的綜合,不僅僅要識(shí)別出物體屬于哪個(gè)分類,更重要的是得到物體在圖片中的具體位置。
為了完成這兩個(gè)任務(wù),目標(biāo)檢測(cè)模型分為兩類。一類是two-stage,將物體識(shí)別和物體定位分為兩個(gè)步驟,分別完成,這一類的典型代表是R-CNN, fast R-CNN, faster-RCNN家族。他們識(shí)別錯(cuò)誤率低,漏識(shí)別率也較低,但速度較慢,不能滿足實(shí)時(shí)檢測(cè)場(chǎng)景。為了解決這一問題,另一類方式出現(xiàn)了,稱為one-stage, 典型代表是Yolo, SSD, YoloV2等。他們識(shí)別速度很快,可以達(dá)到實(shí)時(shí)性要求,而且準(zhǔn)確率也基本能達(dá)到faster R-CNN的水平。下面針對(duì)這幾種模型進(jìn)行詳細(xì)的分析。
2 R-CNN
2014年R-CNN算法被提出,基本奠定了two-stage方式在目標(biāo)檢測(cè)領(lǐng)域的應(yīng)用。它的算法結(jié)構(gòu)如下圖:
算法步驟如下:
1,獲取輸入的原始圖片。
2,使用選擇性搜索算法(selective search)評(píng)估相鄰圖像之間的相似度,把相似度高的進(jìn)行合并,并對(duì)合并后的區(qū)塊打分,選出感興趣區(qū)域的候選框,也就是子圖。這一步大約需要選出2000個(gè)子圖。
3,分別對(duì)子圖使用卷積神經(jīng)網(wǎng)絡(luò),進(jìn)行卷積-relu-池化以及全連接等步驟,提取特征。這一步基本就是物體識(shí)別的范疇了。
4,對(duì)提取的特征進(jìn)行物體分類,保留分類準(zhǔn)確率高的區(qū)塊,以作為最終的物體定位區(qū)塊。
R-CNN較傳統(tǒng)的目標(biāo)檢測(cè)算法獲得了50%的性能提升,在使用VGG-16模型作為物體識(shí)別模型情況下,在voc2007數(shù)據(jù)集上可以取得66%的準(zhǔn)確率,已經(jīng)算還不錯(cuò)的一個(gè)成績(jī)了。其最大的問題是速度很慢,內(nèi)存占用量很大,主要原因有兩個(gè)
1,候選框由傳統(tǒng)的selective search算法完成,速度比較慢,。
2,對(duì)2000個(gè)候選框,均需要做物體識(shí)別,也就是需要做2000次卷積網(wǎng)絡(luò)計(jì)算。這個(gè)運(yùn)算量是十分巨大的
3 Fast R-CNN
針對(duì)R-CNN的部分問題,2015年微軟提出了Fast R-CNN算法,它主要優(yōu)化了兩個(gè)問題。
1,提出ROI pooling池化層結(jié)構(gòu),解決了候選框子圖必須將圖像裁剪縮放到相同尺寸大小的問題。 由于CNN網(wǎng)絡(luò)的輸入圖像尺寸必須是固定的某一個(gè)大?。ǚ駝t全連接時(shí)沒法計(jì)算),故R-CNN中對(duì)大小形狀不同的候選框,進(jìn)行了裁剪和縮放,使得他們達(dá)到相同的尺寸。這個(gè)操作既浪費(fèi)時(shí)間,又容易導(dǎo)致圖像信息丟失和形變。fast R-CNN在全連接層之前插入了ROI pooling層,從而不需要對(duì)圖像進(jìn)行裁剪,很好的解決了這個(gè)問題。 ROI pooling的思路是,如果最終我們要生成MxN的圖片,那么先將特征圖水平和豎直分為M和N份,然后每一份取最大值,輸出MxN的特征圖。這樣就實(shí)現(xiàn)了固定尺寸的圖片輸出了。ROI pooling層位于卷積后,全連接前。
2,提出多任務(wù)損失函數(shù)思想,將分類損失和邊框定位回歸損失結(jié)合在一起統(tǒng)一訓(xùn)練,最終輸出對(duì)應(yīng)分類和邊框坐標(biāo)。
4.Faster R-CNN
R-CNN和fast R-CNN均存在一個(gè)問題,那就是由選擇性搜索來生成候選框,這個(gè)算法很慢。而且R-CNN中生成的2000個(gè)左右的候選框全部需要經(jīng)過一次卷積神經(jīng)網(wǎng)絡(luò),也就是需要經(jīng)過2000次左右的CNN網(wǎng)絡(luò),這個(gè)是十分耗時(shí)的(fast R-CNN已經(jīng)做了改進(jìn),只需要對(duì)整圖經(jīng)過一次CNN網(wǎng)絡(luò))。這也是導(dǎo)致這兩個(gè)算法檢測(cè)速度較慢的最主要原因。
faster R-CNN 針對(duì)這個(gè)問題,提出了RPN網(wǎng)絡(luò)來進(jìn)行候選框的獲取,從而擺脫了選擇性搜索算法,也只需要一次卷積層操作,從而大大提高了識(shí)別速度。這個(gè)算法十分復(fù)雜,我們會(huì)詳細(xì)分析。它的基本結(jié)構(gòu)如下圖
主要分為四個(gè)步驟:
卷積層。原始圖片先經(jīng)過conv-relu-pooling的多層卷積神經(jīng)網(wǎng)絡(luò),提取出特征圖。供后續(xù)的RPN網(wǎng)絡(luò)和全連接層使用。faster
R-CNN不像R-CNN需要對(duì)每個(gè)子圖進(jìn)行卷積層特征提取,它只需要對(duì)全圖進(jìn)行一次提取就可以了,從而大大減小了計(jì)算時(shí)間。RPN層,region proposal networks。RPN層用于生成候選框,并利用softmax判斷候選框是前景還是背景,從中選取前景候選框(因?yàn)槲矬w一般在前景中),并利用bounding box regression調(diào)整候選框的位置,從而得到特征子圖,稱為proposals。
ROI層,fast R-CNN中已經(jīng)講過了ROI層了,它將大小尺寸不同的proposal池化成相同的大小,然后送入后續(xù)的全連接層進(jìn)行物體分類和位置調(diào)整回歸
分類層。利用ROI層輸出的特征圖proposal,判斷proposal的類別,同時(shí)再次對(duì)bounding box進(jìn)行regression從而得到精確的形狀和位置。
使用VGG-16卷積模型的網(wǎng)絡(luò)結(jié)構(gòu):
4.1卷積層
卷積層采用的VGG-16模型,先將PxQ的原始圖片,縮放裁剪為MxN的圖片,然后經(jīng)過13個(gè)conv-relu層,其中會(huì)穿插4個(gè)max-pooling層。所有的卷積的kernel都是3x3
的,padding為1,stride為1。pooling層kernel為2x2, padding為0,stride為2。
MxN的圖片,經(jīng)過卷積層后,變?yōu)榱?code>(M/16) x (N/16)的feature map了。
4.2 RPN層
faster R-CNN拋棄了R-CNN中的選擇性搜索(selective search)方法,使用RPN層來生成候選框,能極大的提升候選框的生成速度。RPN層先經(jīng)過3x3的卷積運(yùn)算,然后分為兩路。一路用來判斷候選框是前景還是背景,它先reshape成一維向量,然后softmax來判斷是前景還是背景,然后reshape恢復(fù)為二維feature map。另一路用來確定候選框的位置,通過bounding box regression實(shí)現(xiàn),后面再詳細(xì)講。兩路計(jì)算結(jié)束后,挑選出前景候選框(因?yàn)槲矬w在前景中),并利用計(jì)算得到的候選框位置,得到我們感興趣的特征子圖proposal。
4.2.1 候選框的生成 anchors
卷積層提取原始圖像信息,得到了256個(gè)feature map,經(jīng)過RPN層的3x3卷積后,仍然為256個(gè)feature map。但是每個(gè)點(diǎn)融合了周圍3x3的空間信息。對(duì)每個(gè)feature map上的一個(gè)點(diǎn),生成k個(gè)anchor(k默認(rèn)為9)。anchor分為前景和背景兩類(我們先不去管它具體是飛機(jī)還是汽車,只用區(qū)分它是前景還是背景即可)。anchor有[x,y,w,h]四個(gè)坐標(biāo)偏移量,x,y表示中心點(diǎn)坐標(biāo),w和h表示寬度和高度。這樣,對(duì)于feature map上的每個(gè)點(diǎn),就得到了k個(gè)大小形狀各不相同的選區(qū)region。
4.2.2 softmax判斷選區(qū)是前景還是背景
對(duì)于生成的anchors,我們首先要判斷它是前景還是背景。由于感興趣的物體位于前景中,故經(jīng)過這一步之后,我們就可以舍棄背景anchors了。大部分的anchors都是屬于背景,故這一步可以篩選掉很多無用的anchor,從而減少全連接層的計(jì)算量。
對(duì)于經(jīng)過了3x3的卷積后得到的256個(gè)feature map,先經(jīng)過1x1的卷積,變換為18個(gè)feature map。然后reshape為一維向量,經(jīng)過softmax判斷是前景還是背景。此處reshape的唯一作用就是讓數(shù)據(jù)可以進(jìn)行softmax計(jì)算。然后輸出識(shí)別得到的前景anchors。
4.2.3 確定候選框位置
另一路用來確定候選框的位置,也就是anchors的[x,y,w,h]坐標(biāo)值。如下圖所示,紅色代表我們當(dāng)前的選區(qū),綠色代表真實(shí)的選區(qū)。雖然我們當(dāng)前的選取能夠大概框選出飛機(jī),但離綠色的真實(shí)位置和形狀還是有很大差別,故需要對(duì)生成的anchors進(jìn)行調(diào)整。這個(gè)過程我們稱為bounding box regression。
假設(shè)紅色框的坐標(biāo)為[x,y,w,h], 綠色框,也就是目標(biāo)框的坐標(biāo)為[Gx, Gy,Gw,Gh], 我們要建立一個(gè)變換,使得[x,y,w,h]能夠變?yōu)閇Gx, Gy,Gw,Gh]。最簡(jiǎn)單的思路是,先做平移,使得中心點(diǎn)接近,然后進(jìn)行縮放,使得w和h接近。如下:
我們要學(xué)習(xí)的就是dx dy dw dh這四個(gè)變換。由于是線性變換,我們可以用線性回歸來建模。設(shè)定loss和優(yōu)化方法后,就可以利用深度學(xué)習(xí)進(jìn)行訓(xùn)練,并得到模型了。對(duì)于空間位置loss,我們一般采用均方差算法,而不是交叉熵(交叉熵使用在分類預(yù)測(cè)中)。優(yōu)化方法可以采用自適應(yīng)梯度下降算法Adam。
4.2.4 輸出特征子圖proposal
得到了前景anchors,并確定了他們的位置和形狀后,我們就可以輸出前景的特征子圖proposal了。步驟如下:
1,得到前景anchors和他們的[x y w h]坐標(biāo)。
2,按照anchors為前景的不同概率,從大到小排序,選取前pre_nms_topN個(gè)anchors,比如前6000個(gè)
3,剔除非常小的anchors。
4,通過NMS非極大值抑制,從anchors中找出置信度較高的。這個(gè)主要是為了解決選取交疊問題。首先計(jì)算每一個(gè)選區(qū)面積,然后根據(jù)他們?cè)趕oftmax中的score(也就是是否為前景的概率)進(jìn)行排序,將score最大的選區(qū)放入隊(duì)列中。接下來,計(jì)算其余選區(qū)與當(dāng)前最大score選區(qū)的IOU(IOU為兩box交集面積除以兩box并集面積,它衡量了兩個(gè)box之間重疊程度)。去除IOU大于設(shè)定閾值的選區(qū)。這樣就解決了選區(qū)重疊問題。
5,選取前post_nms_topN個(gè)結(jié)果作為最終選區(qū)proposal進(jìn)行輸出,比如300個(gè)。
經(jīng)過這一步之后,物體定位應(yīng)該就基本結(jié)束了,剩下的就是物體識(shí)別了。
4.3 ROI Pooling層
和fast R-CNN中類似,這一層主要解決之前得到的proposal大小形狀各不相同,導(dǎo)致沒法做全連接。全連接計(jì)算只能對(duì)確定的shape進(jìn)行運(yùn)算,故必須使proposal大小形狀變?yōu)橄嗤?。通過裁剪和縮放的手段,可以解決這個(gè)問題,但會(huì)帶來信息丟失和圖片形變問題。我們使用ROI pooling可以有效的解決這個(gè)問題。
ROI pooling中,如果目標(biāo)輸出為MxN,則在水平和豎直方向上,將輸入proposal劃分為MxN份,每一份取最大值,從而得到MxN的輸出特征圖。
4.4 分類層
ROI Pooling層后的特征圖,通過全連接層與softmax,就可以計(jì)算屬于哪個(gè)具體類別,比如人,狗,飛機(jī),并可以得到cls_prob概率向量。同時(shí)再次利用bounding box regression精細(xì)調(diào)整proposal位置,得到bbox_pred,用于回歸更加精確的目標(biāo)檢測(cè)框。
這樣就完成了faster R-CNN的整個(gè)過程了。算法還是相當(dāng)復(fù)雜的,對(duì)于每個(gè)細(xì)節(jié)需要反復(fù)理解。faster R-CNN使用resNet101模型作為卷積層,在voc2012數(shù)據(jù)集上可以達(dá)到83.8%的準(zhǔn)確率,超過yolo ssd和yoloV2。其最大的問題是速度偏慢,每秒只能處理5幀,達(dá)不到實(shí)時(shí)性要求。
5 Yolo:you only look once
主要分為三個(gè)部分:卷積層,目標(biāo)檢測(cè)層,NMS篩選層。
5.1 卷積層
采用Google inceptionV1網(wǎng)絡(luò),對(duì)應(yīng)到上圖中的第一個(gè)階段,共20層。這一層主要是進(jìn)行特征提取,從而提高模型泛化能力。但作者對(duì)inceptionV1進(jìn)行了改造,他沒有使用inception module結(jié)構(gòu),而是用一個(gè)1x1的卷積,并聯(lián)一個(gè)3x3的卷積來替代。(可以認(rèn)為只使用了inception module中的一個(gè)分支,應(yīng)該是為了簡(jiǎn)化網(wǎng)絡(luò)結(jié)構(gòu))
5.2 目標(biāo)檢測(cè)層
先經(jīng)過4個(gè)卷積層和2個(gè)全連接層,最后生成7x7x30的輸出。先經(jīng)過4個(gè)卷積層的目的是為了提高模型泛化能力。yolo將一副448x448的原圖分割成了7x7個(gè)網(wǎng)格,每個(gè)網(wǎng)格要預(yù)測(cè)兩個(gè)bounding box的坐標(biāo)(x,y,w,h)和box內(nèi)包含物體的置信度confidence,以及物體屬于20類別中每一類的概率(yolo的訓(xùn)練數(shù)據(jù)為voc2012,它是一個(gè)20分類的數(shù)據(jù)集)。所以一個(gè)網(wǎng)格對(duì)應(yīng)的參數(shù)為(4x2+2+20) = 30。如下圖
1,bounding box坐標(biāo): 如上圖,7x7網(wǎng)格內(nèi)的每個(gè)grid(紅色框),對(duì)應(yīng)兩個(gè)大小形狀不同的bounding box(黃色框)。每個(gè)box的位置坐標(biāo)為(x,y,w,h),x和y表示box中心點(diǎn)坐標(biāo),w和h表示box寬度和高度。通過與訓(xùn)練數(shù)據(jù)集上標(biāo)定的物體真實(shí)坐標(biāo)(Gx,Gy,Gw,Gh)進(jìn)行對(duì)比訓(xùn)練,可以計(jì)算出初始boundingbox平移和伸縮得到最終位置的模型。
2,bounding box置信度confidence:這個(gè)置信度只是為了表達(dá)box內(nèi)有無物體的概率,并不表達(dá)box內(nèi)物體是什么。
其中前一項(xiàng)表示有無人工標(biāo)記的物體落入了網(wǎng)格內(nèi),如果有則為1,否則為0。第二項(xiàng)代表bounding box和真實(shí)標(biāo)記的box之間的重合度。它等于兩個(gè)box面積交集,除以面積并集。值越大則box越接近真實(shí)位置。
分類信息:yolo的目標(biāo)訓(xùn)練集為voc2012,它是一個(gè)20分類的目標(biāo)檢測(cè)數(shù)據(jù)集。常用目標(biāo)檢測(cè)數(shù)據(jù)集如下表:
| Name | # Images (trainval) | # Classes | Last updated |
| --------------- | ------------------- | --------- | ------------ |
| ImageNet | 450k | 200 | 2015 |
| COCO | 120K | 90 | 2014 |
| Pascal VOC | 12k | 20 | 2012 |
| Oxford-IIIT Pet | 7K | 37 | 2012 |
| KITTI Vision | 7K | 3 | |
每個(gè)網(wǎng)格還需要預(yù)測(cè)它屬于20分類中每一個(gè)類別的概率。分類信息是針對(duì)每個(gè)網(wǎng)格的,而不是bounding box。故只需要20個(gè),而不是40個(gè)。而confidence則是針對(duì)bounding box的,它只表示box內(nèi)是否有物體,而不需要預(yù)測(cè)物體是20分類中的哪一個(gè),故只需要2個(gè)參數(shù)。雖然分類信息和confidence都是概率,但表達(dá)含義完全不同。
5.3 NMS篩選層
篩選層是為了在多個(gè)結(jié)果中(多個(gè)bounding box)篩選出最合適的幾個(gè),這個(gè)方法和faster R-CNN 中基本相同。都是先過濾掉score低于閾值的box,對(duì)剩下的box進(jìn)行NMS非極大值抑制,去除掉重疊度比較高的box(NMS具體算法可以回顧上面faster R-CNN小節(jié))。這樣就得到了最終的最合適的幾個(gè)box和他們的類別。
5.4 yolo損失函數(shù)
yolo的損失函數(shù)包含三部分,位置誤差,confidence誤差,分類誤差。具體公式如下
誤差均采用了均方差算法,其實(shí)我認(rèn)為,位置誤差應(yīng)該采用均方差算法,而分類誤差應(yīng)該采用交叉熵。由于物體位置只有4個(gè)參數(shù),而類別有20個(gè)參數(shù),他們的累加和不同。如果賦予相同的權(quán)重,顯然不合理。故yolo中位置誤差權(quán)重為5,類別誤差權(quán)重為1。由于我們不是特別關(guān)心不包含物體的bounding box,故賦予不包含物體的box的置信度confidence誤差的權(quán)重為0.5,包含物體的權(quán)重則為1。
yolo算法開創(chuàng)了one-stage檢測(cè)的先河,它將物體分類和物體檢測(cè)網(wǎng)絡(luò)合二為一,都在全連接層完成。故它大大降低了目標(biāo)檢測(cè)的耗時(shí),提高了實(shí)時(shí)性。但它的缺點(diǎn)也十分明顯:
1,每個(gè)網(wǎng)格只對(duì)應(yīng)兩個(gè)bounding box,當(dāng)物體的長(zhǎng)寬比不常見(也就是訓(xùn)練數(shù)據(jù)集覆蓋不到時(shí)),效果很差。
2,原始圖片只劃分為7x7的網(wǎng)格,當(dāng)兩個(gè)物體靠的很近時(shí),效果很差。
3,最終每個(gè)網(wǎng)格只對(duì)應(yīng)一個(gè)類別,容易出現(xiàn)漏檢(物體沒有被識(shí)別到)。
4,對(duì)于圖片中比較小的物體,效果很差。這其實(shí)是所有目標(biāo)檢測(cè)算法的通病,SSD對(duì)它有些優(yōu)化,我們后面再看。
6 SSD: Single Shot MultiBox Detector
Faster R-CNN準(zhǔn)確率mAP較高,漏檢率recall較低,但速度較慢。而yolo則相反,速度快,但準(zhǔn)確率和漏檢率不盡人意。SSD綜合了他們的優(yōu)缺點(diǎn),對(duì)輸入300x300的圖像,在voc2007數(shù)據(jù)集上test,能夠達(dá)到58 幀每秒( Titan X 的 GPU ),72.1%的mAP。
SSD網(wǎng)絡(luò)結(jié)構(gòu)如下圖:
和yolo一樣,也分為三部分:卷積層,目標(biāo)檢測(cè)層和NMS篩選層
6.1 卷積層
SSD論文采用了VGG16的基礎(chǔ)網(wǎng)絡(luò),其實(shí)這也是幾乎所有目標(biāo)檢測(cè)神經(jīng)網(wǎng)絡(luò)的慣用方法。先用一個(gè)CNN網(wǎng)絡(luò)來提取特征,然后再進(jìn)行后續(xù)的目標(biāo)定位和目標(biāo)分類識(shí)別。
6.2 目標(biāo)檢測(cè)層
這一層由5個(gè)卷積層和一個(gè)平均池化層組成。去掉了最后的全連接層。SSD認(rèn)為目標(biāo)檢測(cè)中的物體,只與周圍信息相關(guān),它的感受野不是全局的,故沒必要也不應(yīng)該做全連接。SSD的特點(diǎn)如下。
6.2.1 多尺寸feature map上進(jìn)行目標(biāo)檢測(cè)
每一個(gè)卷積層,都會(huì)輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進(jìn)行目標(biāo)位置和類別的訓(xùn)練和預(yù)測(cè),從而達(dá)到多尺度檢測(cè)的目的,可以克服yolo對(duì)于寬高比不常見的物體,識(shí)別準(zhǔn)確率較低的問題。而yolo中,只在最后一個(gè)卷積層上做目標(biāo)位置和類別的訓(xùn)練和預(yù)測(cè)。這是SSD相對(duì)于yolo能提高準(zhǔn)確率的一個(gè)關(guān)鍵所在。
如上所示,在每個(gè)卷積層上都會(huì)進(jìn)行目標(biāo)檢測(cè)和分類,最后由NMS進(jìn)行篩選,輸出最終的結(jié)果。多尺度feature map上做目標(biāo)檢測(cè),就相當(dāng)于多了很多寬高比例的bounding box,可以大大提高泛化能力。
6.2.2 多個(gè)anchors,每個(gè)anchor對(duì)應(yīng)4個(gè)位置參數(shù)和21個(gè)類別參數(shù)
和faster R-CNN相似,SSD也提出了anchor的概念。卷積輸出的feature map,每個(gè)點(diǎn)對(duì)應(yīng)為原圖的一個(gè)區(qū)域的中心點(diǎn)。以這個(gè)點(diǎn)為中心,構(gòu)造出6個(gè)寬高比例不同,大小不同的anchor(SSD中稱為default box)。每個(gè)anchor對(duì)應(yīng)4個(gè)位置參數(shù)(x,y,w,h)和21個(gè)類別概率(voc訓(xùn)練集為20分類問題,在加上anchor是否為背景,共21分類)。如下圖所示:
另外,在訓(xùn)練階段,SSD將正負(fù)樣本比例定位1:3。訓(xùn)練集給定了輸入圖像以及每個(gè)物體的真實(shí)區(qū)域(ground true box),將default box和真實(shí)box最接近的選為正樣本。然后在剩下的default box中選擇任意一個(gè)與真實(shí)box IOU大于0.5的,作為正樣本。而其他的則作為負(fù)樣本。由于絕大部分的box為負(fù)樣本,會(huì)導(dǎo)致正負(fù)失衡,故根據(jù)每個(gè)box類別概率排序,使正負(fù)比例保持在1:3。SSD認(rèn)為這個(gè)策略提高了4%的準(zhǔn)確率
另外,SSD采用了數(shù)據(jù)增強(qiáng)。生成與目標(biāo)物體真實(shí)box間IOU為0.1 0.3 0.5 0.7 0.9的patch,隨機(jī)選取這些patch參與訓(xùn)練,并對(duì)他們進(jìn)行隨機(jī)水平翻轉(zhuǎn)等操作。SSD認(rèn)為這個(gè)策略提高了8.8%的準(zhǔn)確率。
6.3 篩選層
和yolo的篩選層基本一致,同樣先過濾掉類別概率低于閾值的default box,再采用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個(gè)不同feature map上的目標(biāo)檢測(cè)輸出的default box。
SSD基本已經(jīng)可以滿足我們手機(jī)端上實(shí)時(shí)物體檢測(cè)需求了,TensorFlow在Android上的目標(biāo)檢測(cè)官方模型ssd_mobilenet_v1_android_export.pb,就是通過SSD算法實(shí)現(xiàn)的。它的基礎(chǔ)卷積網(wǎng)絡(luò)采用的是mobileNet,適合在終端上部署和運(yùn)行。
7 YoloV2, Yolo9000
針對(duì)yolo準(zhǔn)確率不高,容易漏檢,對(duì)長(zhǎng)寬比不常見物體效果差等問題,結(jié)合SSD的特點(diǎn),提出了yoloV2。它主要還是采用了yolo的網(wǎng)絡(luò)結(jié)構(gòu),在其基礎(chǔ)上做了一些優(yōu)化和改進(jìn),如下
網(wǎng)絡(luò)采用DarkNet-19:19層,里面包含了大量3x3卷積,同時(shí)借鑒inceptionV1,加入1x1卷積核全局平均池化層。結(jié)構(gòu)如下
1,去掉全連接層:和SSD一樣,模型中只包含卷積和平均池化層(平均池化是為了變?yōu)橐痪S向量,做softmax分類)。這樣做一方面是由于物體檢測(cè)中的目標(biāo),只是圖片中的一個(gè)區(qū)塊,它是局部感受野,沒必要做全連接。而是為了輸入不同尺寸的圖片,如果采用全連接,則只能輸入固定大小圖片了。
2,batch normalization:卷積層后加入BN,對(duì)下一次卷積輸入的數(shù)據(jù)做歸一化。可以在增大學(xué)習(xí)率的前提下,同樣可以穩(wěn)定落入局部最優(yōu)解。從而加速訓(xùn)練收斂,在相同耗時(shí)下,增大了有效迭代次數(shù)。
3,使用anchors:借鑒faster R-CNN和SSD,對(duì)于一個(gè)中心點(diǎn),使用多個(gè)anchor,得到多個(gè)bounding box,每個(gè)bounding box包含4個(gè)位置坐標(biāo)參數(shù)(x y w h)和21個(gè)類別概率信息。而在yolo中,每個(gè)grid(對(duì)應(yīng)anchor),僅預(yù)測(cè)一次類別,而且只有兩個(gè)bounding box來進(jìn)行坐標(biāo)預(yù)測(cè)。
4,pass through ayer:yolo原本最終特征圖為13x13x256。yoloV2還利用了之前的26x26的特征圖進(jìn)行目標(biāo)檢測(cè)。26x26x256的feature map分別按行和列隔點(diǎn)采樣,得到4幅13x13x256的feature map,將他們組織成一幅13x13x2048的feature map。這樣做的目的是提高小物體的識(shí)別率。因?yàn)樵娇壳暗木矸e,其感受野越小,越有利于小物體的識(shí)別。
5,高分辨率輸入Training:yolo采用224x224圖片進(jìn)行預(yù)訓(xùn)練,而yoloV2則采用448x448
6,Multi-Scale Training:輸入不同尺寸的圖片,迭代10次,就改變輸入圖片尺寸。由于模型中去掉了全連接層,故可以輸入不同尺寸的圖片了。從320x320,到608x608
yolo和yoloV2只能識(shí)別20類物體,為了優(yōu)化這個(gè)問題,提出了yolo9000,可以識(shí)別9000類物體。它在yoloV2基礎(chǔ)上,進(jìn)行了imageNet和coco的聯(lián)合訓(xùn)練。這種方式充分利用imageNet可以識(shí)別1000類物體和coco可以進(jìn)行目標(biāo)位置檢測(cè)的優(yōu)點(diǎn)。當(dāng)使用imageNet訓(xùn)練時(shí),只更新物體分類相關(guān)的參數(shù)。而使用coco時(shí),則更新全部所有參數(shù)。
8.YOLOv3
YOLOv3可以說出來直接吊打一切圖像檢測(cè)算法。比同期的DSSD(反卷積SSD), FPN(feature pyramid networks)準(zhǔn)確率更高或相仿,速度是其1/3.。
YOLOv3的改動(dòng)主要有如下幾點(diǎn):
1、增加了top down的多級(jí)預(yù)測(cè),直接解決了YOLO對(duì)小目標(biāo)很難識(shí)別的頑疾。 v2 只有一個(gè) detection,v3 增加到了3個(gè)detection,分別是一個(gè)下采樣的,feature map 為 1313,還有2 個(gè)上采樣的 eltwise sum,feature map 為 2626,52*52,也就是說 v3 的 416 版本已經(jīng)用到了 52 的 feature map,而 v2 把多尺度考慮到訓(xùn)練的 data 采樣上,最后也只是用到了 13 的 feature map,這可以說在對(duì)小目標(biāo)的識(shí)別上,是一個(gè)突破。論文中,一共是9個(gè)聚類中心,按照大小分給三個(gè)detection,單層只預(yù)測(cè)三種boundingbox。
2、loss不同。 v3 替換了 v2 的 softmax loss 變成 logistic loss,由于每個(gè)點(diǎn)所對(duì)應(yīng)的 bounding
box 少并且差異大,每個(gè) bounding 與 ground truth 的 matching 策略變成了 1 對(duì) 當(dāng)目標(biāo)類別很復(fù)雜的時(shí)候,通常logistic loss更有效,也方便使用多標(biāo)簽分類(比如一個(gè)人有Woman 和 Person兩個(gè)標(biāo)簽)。3、加深了網(wǎng)絡(luò)。使用簡(jiǎn)化的殘差網(wǎng)絡(luò)代替了11,33的卷積層(加了短路),基礎(chǔ)模型也從Darknet-19變成了Darknet-53,在網(wǎng)絡(luò)中也有一連串的11(用來壓縮特征表示),33(用于增加信道)卷積。YOLOv3也不是毫無缺點(diǎn),由于最根本原理的原因(每個(gè)網(wǎng)格固定目標(biāo)數(shù)量),召回率并不很高。對(duì)于位置并沒有很好優(yōu)化,精準(zhǔn)度比較差。而且模型泛化能力太強(qiáng),有時(shí)候容易跑偏。當(dāng)然優(yōu)點(diǎn)更明顯,簡(jiǎn)單,速度快,精度高,可以識(shí)別小物體,泛化能力強(qiáng)(語義識(shí)別能力)YOLO3借鑒了殘差網(wǎng)絡(luò)結(jié)構(gòu),形成更深的網(wǎng)絡(luò)層次,以及多尺度檢測(cè),提升了mAP及小物體檢測(cè)效果。如果采用COCO mAP50做評(píng)估指標(biāo)(不是太介意預(yù)測(cè)框的準(zhǔn)確性的話),YOLO3的表現(xiàn)相當(dāng)驚人,如下圖所示,在精確度相當(dāng)?shù)那闆r下,YOLOv3的速度是其它模型的3、4倍。
不過如果要求更精準(zhǔn)的預(yù)測(cè)邊框,采用COCO AP做評(píng)估標(biāo)準(zhǔn)的話,YOLO3在精確率上的表現(xiàn)就弱了一些。如下圖所示。
9 YOLOV4
- 輸入端:這里指的創(chuàng)新主要是訓(xùn)練時(shí)對(duì)輸入端的改進(jìn),主要包括Mosaic數(shù)據(jù)增強(qiáng)、cmBN、SAT自對(duì)抗訓(xùn)練
- BackBone主干網(wǎng)絡(luò):將各種新的方式結(jié)合起來,包括:CSPDarknet53、Mish激活函數(shù)、Dropblock
- Neck:目標(biāo)檢測(cè)網(wǎng)絡(luò)在BackBone和最后的輸出層之間往往會(huì)插入一些層,比如Yolov4中的SPP模塊、FPN+PAN結(jié)構(gòu)
- Prediction:輸出層的錨框機(jī)制和Yolov3相同,主要改進(jìn)的是訓(xùn)練時(shí)的損失函數(shù)CIOU_Loss,以及預(yù)測(cè)框篩選的nms變?yōu)?strong>DIOU_nms
9.1 輸入端改進(jìn)
9.1.1 mosaic數(shù)據(jù)增強(qiáng)
Yolov4中使用的Mosaic是參考2019年底提出的CutMix數(shù)據(jù)增強(qiáng)的方式,但CutMix只使用了兩張圖片進(jìn)行拼接,而Mosaic數(shù)據(jù)增強(qiáng)則采用了4張圖片,隨機(jī)縮放、隨機(jī)裁剪、隨機(jī)排布的方式進(jìn)行拼接。
- 豐富數(shù)據(jù)集:隨機(jī)使用4張圖片,隨機(jī)縮放,再隨機(jī)分布進(jìn)行拼接,大大豐富了檢測(cè)數(shù)據(jù)集,特別是隨機(jī)縮放增加了很多小目標(biāo),讓網(wǎng)絡(luò)的魯棒性更好。
- 減少GPU:可能會(huì)有人說,隨機(jī)縮放,普通的數(shù)據(jù)增強(qiáng)也可以做,但作者考慮到很多人可能只有一個(gè)GPU,因此Mosaic增強(qiáng)訓(xùn)練時(shí),可以直接計(jì)算4張圖片的數(shù)據(jù),使得Mini-batch大小并不需要很大,一個(gè)GPU就可以達(dá)到比較好的效果。
9.1.2 cmBN
BN就是僅僅利用當(dāng)前迭代時(shí)刻信息進(jìn)行norm,而CBN在計(jì)算當(dāng)前時(shí)刻統(tǒng)計(jì)量時(shí)候會(huì)考慮前k個(gè)時(shí)刻統(tǒng)計(jì)量,從而實(shí)現(xiàn)擴(kuò)大batch size操作。同時(shí)作者指出CBN操作不會(huì)引入比較大的內(nèi)存開銷,訓(xùn)練速度不會(huì)影響很多,但是訓(xùn)練時(shí)候會(huì)慢一些,比GN還慢。
CmBN是CBN的改進(jìn)版本,其把大batch內(nèi)部的4個(gè)mini batch當(dāng)做一個(gè)整體,對(duì)外隔離。CBN在第t時(shí)刻,也會(huì)考慮前3個(gè)時(shí)刻的統(tǒng)計(jì)量進(jìn)行匯合,而CmBN操作不會(huì),不再滑動(dòng)cross,其僅僅在mini batch內(nèi)部進(jìn)行匯合操作,保持BN一個(gè)batch更新一次可訓(xùn)練參數(shù)。
9.1.2自對(duì)抗訓(xùn)練(SAT)
SAT為一種新型數(shù)據(jù)增強(qiáng)方式。在第一階段,神經(jīng)網(wǎng)絡(luò)改變?cè)紙D像而不是網(wǎng)絡(luò)權(quán)值。通過這種方式,神經(jīng)網(wǎng)絡(luò)對(duì)其自身進(jìn)行一種對(duì)抗式的攻擊,改變?cè)紙D像,制造圖像上沒有目標(biāo)的假象。在第二階段,訓(xùn)練神經(jīng)網(wǎng)絡(luò)對(duì)修改后的圖像進(jìn)行正常的目標(biāo)檢測(cè)。
**Self-Adversarial Training是在一定程度上抵抗對(duì)抗攻擊的數(shù)據(jù)增強(qiáng)技術(shù)。**CNN計(jì)算出Loss, 然后通過反向傳播改變圖片信息,形成圖片上沒有目標(biāo)的假象,然后對(duì)修改后的圖像進(jìn)行正常的目標(biāo)檢測(cè)。需要注意的是在SAT的反向傳播的過程中,是不需要改變網(wǎng)絡(luò)權(quán)值的。 使用對(duì)抗生成可以改善學(xué)習(xí)的決策邊界中的薄弱環(huán)節(jié),提高模型的魯棒性。因此這種數(shù)據(jù)增強(qiáng)方式被越來越多的對(duì)象檢測(cè)框架運(yùn)用。
9.2 BackBone主干網(wǎng)絡(luò)
9.2.1 CSPDarknet53
每個(gè)CSP模塊前面的卷積核的大小都是3*3
,stride=2
,因此可以起到下采樣的作用。
因?yàn)锽ackbone有5個(gè)CSP模塊,輸入圖像是608*608
,所以特征圖變化的規(guī)律是:608->304->152->76->38->19
,經(jīng)過5次CSP模塊后得到19*19大小的特征圖。
而且作者只在Backbone中采用了Mish激活函數(shù),網(wǎng)絡(luò)后面仍然采用Leaky_relu激活函數(shù)。
我們?cè)倏纯聪伦髡邽樯兑獏⒖?019年的CSPNet,采用CSP模塊?
CSPNet全稱是Cross Stage Paritial Network,主要從網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)的角度解決推理中從計(jì)算量很大的問題。
CSPNet的作者認(rèn)為推理計(jì)算過高的問題是由于網(wǎng)絡(luò)優(yōu)化中的梯度信息重復(fù)導(dǎo)致的。
因此采用CSP模塊先將基礎(chǔ)層的特征映射劃分為兩部分,然后通過跨階段層次結(jié)構(gòu)將它們合并,在減少了計(jì)算量的同時(shí)可以保證準(zhǔn)確率。
因此Yolov4在主干網(wǎng)絡(luò)Backbone采用CSPDarknet53網(wǎng)絡(luò)結(jié)構(gòu),主要有三個(gè)方面的優(yōu)點(diǎn):
- 增強(qiáng)CNN的學(xué)習(xí)能力,使得在輕量化的同時(shí)保持準(zhǔn)確性。
- 降低計(jì)算瓶頸
- 降低內(nèi)存成本
9.2.2 Mish 激活函數(shù)
- Mish是一個(gè)平滑的曲線,平滑的激活函數(shù)允許更好的信息深入神經(jīng)網(wǎng)絡(luò),從而得到更好的準(zhǔn)確性和泛化;
- 在負(fù)值的時(shí)候并不是完全截?cái)?,允許比較小的負(fù)梯度流入。
9.2.3 DropBlock正則化
- 原始輸入圖像。
- 綠色部分表示激活的特征單元,b圖表示了隨機(jī)dropout激活單元,但是這樣dropout后,網(wǎng)絡(luò)還會(huì)從drouout掉的激活單元附近學(xué)習(xí)到同樣的信息。
- 綠色部分表示激活的特征單元,c圖表示本文的DropBlock,通過dropout掉一部分相鄰的整片的區(qū)域(比如頭和腳),網(wǎng)絡(luò)就會(huì)去注重學(xué)習(xí)狗的別的部位的特征,來實(shí)現(xiàn)正確分類,從而表現(xiàn)出更好的泛化。
9.2.4 label smoothing標(biāo)簽平滑
通常YOLO模型中,80個(gè)分類標(biāo)簽都是使用0或1進(jìn)行描述,在訓(xùn)練過程中,如果認(rèn)為屬于第n個(gè)分類,則該位置輸出1(這種分類標(biāo)簽編碼形式也稱為one hot編碼,即一位(獨(dú)熱)編碼)。在數(shù)據(jù)集為無窮的情況下,可以對(duì)所有分類進(jìn)行訓(xùn)練和標(biāo)記,但是數(shù)據(jù)集不可能是無窮,尤其是當(dāng)數(shù)據(jù)集量并不太大的時(shí)候,訓(xùn)練次數(shù)過多,很容易造成過擬合。采用Label Smoothing的技巧可以將標(biāo)簽的確定性減弱,從而降低過擬合的可能性。
9.3Neck部分
目標(biāo)檢測(cè)網(wǎng)絡(luò)在BackBone和最后的輸出層之間往往會(huì)插入一些層,比如SPP模塊、FPN+PAN模塊,用來融合不同尺寸特征圖的特征信息。
5.3.1空間金字塔池化SPP模塊
V3中為了更好的滿足不同輸入的大小,訓(xùn)練時(shí)要改變輸入數(shù)據(jù)的大小。SPP其實(shí)就是對(duì)任意尺寸的特征圖通過最大池化來滿足最終輸入特征一致。
常見的池化核有(1,1)(5,5)(9,9)(13,13)
如上圖,以3個(gè)尺寸的池化為例,對(duì)特征圖進(jìn)行一個(gè)最大值池化,即一張?zhí)卣鲌D得取其最大值,得到1*d(d是特征圖的維度)
個(gè)特征;對(duì)特征圖進(jìn)行網(wǎng)格劃分為2x2
的網(wǎng)格,然后對(duì)每個(gè)網(wǎng)格進(jìn)行最大值池化,那么得到4*d
個(gè)特征;同樣,對(duì)特征圖進(jìn)行網(wǎng)格劃分為4x4
個(gè)網(wǎng)格,對(duì)每個(gè)網(wǎng)格進(jìn)行最大值池化,得到16*d
個(gè)特征。 接著將每個(gè)池化得到的特征合起來即得到固定長(zhǎng)度的特征個(gè)數(shù)(特征圖的維度是固定的),接著就可以輸入到全連接層中進(jìn)行訓(xùn)練網(wǎng)絡(luò)了。用到這里是為了增加感受野。
9.3.2 FPN+PAN結(jié)構(gòu)
YOLOv4的第二處改進(jìn)便是采用了PAN(Path Aggregation Network)結(jié)構(gòu)。原先的YOLOv3僅使用了top-down(上采樣)結(jié)構(gòu)的FPN,而PAN是在此基礎(chǔ)上加了bottom-up(下采樣)的結(jié)構(gòu)。
由下圖可以看到,主要用到兩次PAN,第一次是在76*76
那層,有一個(gè)指向下面的箭頭,該箭頭為一次下采樣,同樣的在38*38
那一層也進(jìn)行了一次PAN。
FPN和PAN都是通過融合不同尺度的特征,提高模型對(duì)不同尺寸目標(biāo)的檢測(cè)能力。
9.4檢測(cè)頭部分
9.4.1 C-IOU損失函數(shù)
考慮到了detect與gt之間的重疊面積、中心點(diǎn)距離和長(zhǎng)寬比
L=1-重疊面積+中心點(diǎn)距離+長(zhǎng)寬比
9.4.2 非極大值抑制DIOU-NMS
DIoU(前面討論過的) 被用作非最大值抑制(NMS)的一個(gè)因素。該方法在抑制冗余框的同時(shí),采用IoU和兩個(gè)邊界盒中心點(diǎn)之間的距離。這使得它在有遮擋的情況下更加健壯。
10 YOLOV5
Yolov5s網(wǎng)絡(luò)是Yolov5系列中深度最小,特征圖的寬度最小的網(wǎng)絡(luò)。后面的3種都是在此基礎(chǔ)上不斷加深,不斷加寬。模型文件只有24M
10.1 概述
YOLOv5版本 UltralyticsLLC 公司推出的,是在YOLOv4的基礎(chǔ)上做了少許的修補(bǔ),由于改進(jìn)比較小,僅做簡(jiǎn)單介紹。
改進(jìn)譬如:
-
將v4版本骨干網(wǎng)絡(luò)中的csp結(jié)構(gòu)拓展到了NECK結(jié)構(gòu)中。
-
增加了FOCUS操作,但是后續(xù)6.1版本中又剔除掉了該操作,使用一個(gè)6x6的卷積進(jìn)行了替代。
-
使用SPPF結(jié)構(gòu)代替了SPP。
10.2 思路
YOLOv5檢測(cè)算法的思路與v4基本一致,此處不再贅述。
10.3 網(wǎng)絡(luò)結(jié)構(gòu)
骨干網(wǎng)絡(luò): CSPDarknet53(含SPPF)
Neck: FPN+PAN
檢測(cè)頭:同v3版本
tricks1:SPPF
主要區(qū)別就是MaxPool由原來的并行調(diào)整為了串行,值得注意的是:串行兩個(gè) 5 x 5
大小的 MaxPool 和一個(gè) 9 x 9
大小的 MaxPool 是等價(jià)的,串行三個(gè) 5 x 5
大小的 MaxPool 層和一個(gè) 13 x 13
大小的 MaxPool 是等價(jià)的。雖然并行和串行的效果一樣,但是串行的效率更高,降低了耗時(shí)。
tricks2:自適應(yīng)錨框計(jì)算
比較簡(jiǎn)單,就是把錨框的聚類改為了使用程序進(jìn)行自適應(yīng)計(jì)算,此處就不再贅述了。
tricks3:Focus操作 后續(xù)版本剔除了該操作,此處就展開介紹了。
10.4優(yōu)勢(shì)
站在巨人的肩膀上,效果當(dāng)然也不差啦。
11 YOLOV6
11.1概述
YOLOv6是由美團(tuán)推出的,所做的主要工作是為了更加適應(yīng)GPU設(shè)備,將2021年的RepVGG結(jié)構(gòu)引入到了YOLO。思路比較簡(jiǎn)單,僅做少許介紹。
11.2思路
YOLOv6檢測(cè)算法的思路類似YOLOv5(backbone+neck)+YOLOX(head),此處不再贅述。
主要改動(dòng):
1.骨干網(wǎng)絡(luò)由CSPDarknet換為了EfficientRep
2.Neck是基于Rep和PAN構(gòu)建了Rep-PAN
3.檢測(cè)頭部分模仿YOLOX,進(jìn)行了解耦操作,并進(jìn)行了少許優(yōu)化。
11.3網(wǎng)絡(luò)結(jié)構(gòu)
骨干網(wǎng)絡(luò): EfficientRep
Neck: FPN+RepPAN
檢測(cè)頭:類似YOLOX
tricks1:引入RepVGG
按照RepVGG的思路,為每一個(gè)3x3的卷積添加平行了一個(gè)1x1的卷積分支和恒等映射分支,然后在推理時(shí)融合為3x3的結(jié)構(gòu),這種方式對(duì)計(jì)算密集型的硬件設(shè)備會(huì)比較友好。
**tricks2:**骨干網(wǎng)絡(luò)EfficientRep
把backbone中stride=2的卷積層換成了stride=2的RepConv層,并且也將CSP-Block修改為了RepBlock。
tricks3:Neck中引入Rep
tricks4:對(duì)檢測(cè)頭解耦并重新設(shè)計(jì)了高效的解耦頭為了加快收斂速度和降低檢測(cè)頭復(fù)雜度,YOLOv6模仿YOLOX對(duì)檢測(cè)頭進(jìn)行了解耦,分開了目標(biāo)檢測(cè)中的邊框回歸過程和類別分類過程。 由于YOLOX的解耦頭中,新增了兩個(gè)額外的3x3卷積,會(huì)在一定程度增加運(yùn)算的復(fù)雜度。鑒于此,YOLOv6基于Hybrid Channels的策略重新設(shè)計(jì)出了一個(gè)更高效的解耦頭結(jié)構(gòu)。在不怎么改變精度的情況下降低延時(shí),從而達(dá)到了速度與精度的權(quán)衡。
11.4優(yōu)勢(shì)
對(duì)耗時(shí)做了進(jìn)一步的優(yōu)化,進(jìn)一步提升YOLO檢測(cè)算法性能。
12 YOLOv7
12.1 概述
YOLOv7是YOLOv4團(tuán)隊(duì)的續(xù)作,主要是針對(duì)模型結(jié)構(gòu)重參化和動(dòng)態(tài)標(biāo)簽分配問題進(jìn)行了優(yōu)化。
12.2思路
YOLOv7檢測(cè)算法的思路是與YOLOv4、v5類似。
主要改動(dòng):
1.提出了計(jì)劃的模型結(jié)構(gòu)重參化。
2.借鑒了YOLOv5、Scale YOLOv4、YOLOX,“拓展”和“復(fù)合縮放”方法,以便高效的利用參數(shù)和計(jì)算量。
3.提出了一種新的標(biāo)簽分配方法。
12.3 網(wǎng)絡(luò)結(jié)構(gòu)
在YOLOv4、YOLOv5、YOLOv6基礎(chǔ)上通過添加了以下tricks進(jìn)行了進(jìn)一步的升級(jí)改造。
tricks1:高效的聚合網(wǎng)絡(luò)
E-ELAN采用expand、shuffle、merge cardinality結(jié)構(gòu),實(shí)現(xiàn)在不破壞原始梯度路徑的情況下,提高網(wǎng)絡(luò)的學(xué)習(xí)能力。在體系結(jié)構(gòu)方面,E-ELAN只改變了計(jì)算模塊中的結(jié)構(gòu),而過渡層的結(jié)構(gòu)則完全不變。作者的策略是利用分組卷積來擴(kuò)展計(jì)算模塊的通道和基數(shù),將相同的group parameter和channel multiplier用于計(jì)算每一層中的所有模塊。然后,將每個(gè)模塊計(jì)算出的特征圖根據(jù)設(shè)置的分組數(shù)打亂成G組,最后將它們連接在一起。此時(shí),每一組特征圖中的通道數(shù)將與原始體系結(jié)構(gòu)中的通道數(shù)相同。最后,作者添加了G組特征來merge cardinality。
tricks2:模型縮放
類似于YOLOv5、Scale YOLOv4、YOLOX,一般是對(duì)depth、width或者module scale進(jìn)行縮放,實(shí)現(xiàn)擴(kuò)大或縮小baseline的目的。
tricks3:引入了卷積重參化并進(jìn)行了改進(jìn)采用梯度傳播路徑來分析不同的重參化模塊應(yīng)該和哪些網(wǎng)絡(luò)搭配使用。同時(shí)分析出RepConv中的identity破壞了ResNet中的殘差結(jié)構(gòu)和DenseNet中的跨層連接,因此作者做了改進(jìn),采用沒有Identity連接的RepConv結(jié)構(gòu)進(jìn)行卷積重參數(shù)化。下圖是設(shè)計(jì)的用于PlainNet和ResNet的計(jì)劃重參數(shù)卷積。
tricks4:引入了輔助訓(xùn)練模塊-coarse-to-fine(由粗到細(xì))引導(dǎo)標(biāo)簽分配策略
常用的方式是圖(c)所示,即輔助頭和引導(dǎo)頭各自獨(dú)立,分別利用ground truth和它們(輔助頭、引導(dǎo)頭)各自的預(yù)測(cè)結(jié)果實(shí)現(xiàn)標(biāo)簽分配。YOLOV7算法中提出了利用引導(dǎo)頭的預(yù)測(cè)結(jié)果作為指導(dǎo),生成從粗到細(xì)的層次標(biāo)簽,將這些層次標(biāo)簽分別用于輔助頭和引導(dǎo)頭的學(xué)習(xí),如下圖(d)和(e)所示。
12.4 優(yōu)勢(shì)
參數(shù)量和計(jì)算量大幅度減少,但性能仍能保持少量的提升。
名詞解釋
1、批量歸一化Batch Normalization
內(nèi)部協(xié)變量偏移問題(Internal Covariate Shift,ICS)
隨著訓(xùn)練的進(jìn)行,網(wǎng)絡(luò)中的參數(shù)也隨著梯度下降在不停更新。一方面,當(dāng)?shù)讓泳W(wǎng)絡(luò)中參數(shù)發(fā)生微弱變化時(shí),由于每一層中的線性變換(網(wǎng)絡(luò)訓(xùn)練)與非線性激活映射(激活函數(shù)),這些微弱變化隨著網(wǎng)絡(luò)層數(shù)的加深而被放大(類似蝴蝶效應(yīng));另一方面,參數(shù)的變化導(dǎo)致每一層的輸入分布會(huì)發(fā)生改變,進(jìn)而上層的網(wǎng)絡(luò)需要不停地去適應(yīng)這些分布變化,使得我們的模型訓(xùn)練變得困難。
Batch Normalization的原論文作者給了Internal Covariate Shift一個(gè)較規(guī)范的定義:在深層網(wǎng)絡(luò)訓(xùn)練的過程中,由于網(wǎng)絡(luò)中參數(shù)變化而引起內(nèi)部結(jié)點(diǎn)數(shù)據(jù)分布發(fā)生變化的這一過程被稱作Internal Covariate Shift。
Batch Normalization原理
通常,一次訓(xùn)練會(huì)輸入一批樣本(batch)進(jìn)入神經(jīng)網(wǎng)絡(luò)。批規(guī)一化在神經(jīng)網(wǎng)絡(luò)的每一層,在網(wǎng)絡(luò)(線性變換)輸出后和激活函數(shù)(非線性變換)之前增加一個(gè)批歸一化層(BN),BN層進(jìn)行如下變換:
①對(duì)該批樣本的各特征量(對(duì)于中間層來說,就是每一個(gè)神經(jīng)元)分別進(jìn)行歸一化處理,分別使每個(gè)特征的數(shù)據(jù)分布變換為均值0,方差1。從而使得每一批訓(xùn)練樣本在每一層都有類似的分布。這一變換不需要引入額外的參數(shù)。
②對(duì)上一步的輸出再做一次線性變換,假設(shè)上一步的輸出為Z,則 Z1=γZ + β。這里γ、β是可以訓(xùn)練的參數(shù)。增加這一變換是因?yàn)樯弦徊襟E中強(qiáng)制改變了特征數(shù)據(jù)的分布,可能影響了原有數(shù)據(jù)的信息表達(dá)能力。增加的線性變換使其有機(jī)會(huì)恢復(fù)其原本的信息。
總結(jié):
- batch normalization的提出是為了解決ICS問題,即在深層網(wǎng)絡(luò)訓(xùn)練過程中,由于網(wǎng)絡(luò)參數(shù)的變化引起內(nèi)部節(jié)點(diǎn)數(shù)據(jù)分布發(fā)生變化,導(dǎo)致梯度下降變慢和網(wǎng)絡(luò)收斂速度變慢;
- 在神經(jīng)網(wǎng)絡(luò)中引入BN,對(duì)分布差異較大的數(shù)據(jù)進(jìn)行歸一化,讓數(shù)據(jù)特征具有相同的分布,而且保留了輸入數(shù)據(jù)的表達(dá)能力。
- 在神經(jīng)網(wǎng)絡(luò)中引入BN,使得在訓(xùn)練時(shí)網(wǎng)絡(luò)模型對(duì)學(xué)習(xí)率、初始化方法等參數(shù)的敏感度降低。例如,當(dāng)學(xué)習(xí)率設(shè)置太高時(shí),會(huì)使得參數(shù)更新步伐過大,容易出現(xiàn)震蕩和不收斂,當(dāng)對(duì)權(quán)重進(jìn)行縮放時(shí),經(jīng)過BN后縮放因子會(huì)被消去;而且在求偏導(dǎo)時(shí),縮放因子越大,梯度變化就越小,避免了學(xué)習(xí)率的大小變化帶來的影響。
- BN允許網(wǎng)絡(luò)使用飽和性激活函數(shù)(例如sigmoid,tanh等),緩解梯度消失問題。在不使用BN層的時(shí)候,由于網(wǎng)絡(luò)的深度與復(fù)雜性,很容易使得底層網(wǎng)絡(luò)變化累積到上層網(wǎng)絡(luò)中,導(dǎo)致模型的訓(xùn)練很容易進(jìn)入到激活函數(shù)的梯度飽和區(qū);通過normalize操作可以讓激活函數(shù)的輸入數(shù)據(jù)落在梯度非飽和區(qū),緩解梯度消失的問題;另外通過自適應(yīng)學(xué)習(xí)λ與β又讓數(shù)據(jù)保留更多的原始信息。
- 正則化效果: 在Batch Normalization中,由于我們使用mini-batch的均值與方差作為對(duì)整體訓(xùn)練樣本均值與方差的估計(jì),盡管每一個(gè)batch中的數(shù)據(jù)都是從總體樣本中抽樣得到,但不同mini-batch的均值與方差會(huì)有所不同,這就為網(wǎng)絡(luò)的學(xué)習(xí)過程中增加了隨機(jī)噪音,與Dropout通過關(guān)閉神經(jīng)元給網(wǎng)絡(luò)訓(xùn)練帶來噪音類似,在一定程度上對(duì)模型起到了正則化的效果。
- 另外,原作者通過也證明了網(wǎng)絡(luò)加入BN后,可以丟棄Dropout,模型也同樣具有很好的泛化效果。
2、梯度消失和梯度爆炸
深度學(xué)習(xí)網(wǎng)絡(luò)在訓(xùn)練時(shí),最終是求得讓損失函數(shù)達(dá)到收斂的一組權(quán)重參數(shù),這就需要進(jìn)行迭代。假設(shè)這個(gè)網(wǎng)絡(luò)共有三層,在計(jì)算得到一次訓(xùn)練的誤差之后,為了更新網(wǎng)絡(luò)第一層參數(shù),需要使用這個(gè)誤差對(duì)第一層權(quán)重求偏導(dǎo),根據(jù)鏈?zhǔn)椒▌t,誤差需要先對(duì)第三層求偏導(dǎo)然后對(duì)第二層求偏導(dǎo)然后對(duì)第一層求偏導(dǎo)
(1) 梯度消失(gradient vanishing problem)
我們知道神經(jīng)網(wǎng)絡(luò)在進(jìn)行反向傳播(BP)的時(shí)候會(huì)對(duì)參數(shù)W進(jìn)行更新,梯度消失就是靠后面網(wǎng)絡(luò)層(如layer3)能夠正常的得到一個(gè)合理的偏導(dǎo)數(shù),但是靠近輸入層的網(wǎng)絡(luò)層,計(jì)算的到的偏導(dǎo)數(shù)近乎零,W幾乎無法得到更新。
(2)梯度爆炸(gradient exploding problem)
梯度爆炸的意思是,靠近輸入層的網(wǎng)絡(luò)層,計(jì)算的到的偏導(dǎo)數(shù)極其大,更新后W變成一個(gè)很大的數(shù)(爆炸)。
3、特征金字塔FPN
FPN的最早是在2017年的CVPR會(huì)議上提出的,其創(chuàng)新點(diǎn)在于提出了一種自底向上(bottom-up)的結(jié)構(gòu),融合多個(gè)不同尺度的特征圖去進(jìn)行目標(biāo)預(yù)測(cè)。FPN工作認(rèn)為網(wǎng)絡(luò)淺層的特征圖包含更多的細(xì)節(jié)信息,但語義信息較少,而深層的特征圖則恰恰相反。原因之一便是卷積神經(jīng)網(wǎng)絡(luò)的降采樣操作,降采樣對(duì)小目標(biāo)的損害顯著大于大目標(biāo),直觀的理解便是小目標(biāo)的像素少于大目標(biāo),也就越難以經(jīng)得住降采樣操作的取舍,而大目標(biāo)具有更多的像素,也就更容易引起網(wǎng)絡(luò)的“關(guān)注”,在YOLOv1+和YOLOv2+的工作中我們也發(fā)現(xiàn)了,相較于小目標(biāo),大目標(biāo)的檢測(cè)結(jié)果要好很多。
隨著網(wǎng)絡(luò)深度的加深,降采樣操作的增多,細(xì)節(jié)信息不斷被破壞,致使小物體的檢測(cè)效果逐漸變差,而大目標(biāo)由于像素較多,僅靠網(wǎng)絡(luò)的前幾層還不足以使得網(wǎng)絡(luò)能夠認(rèn)識(shí)到大物體(感受野不充分),但隨著層數(shù)變多,網(wǎng)絡(luò)的感受野逐漸增大,網(wǎng)絡(luò)對(duì)大目標(biāo)的認(rèn)識(shí)越來越充分,檢測(cè)效果自然會(huì)更好。于是,一個(gè)很簡(jiǎn)單的解決方案便應(yīng)運(yùn)而生:淺層網(wǎng)絡(luò)負(fù)責(zé)檢測(cè)較小的目標(biāo),深層網(wǎng)絡(luò)負(fù)責(zé)檢測(cè)較大的目標(biāo)。考慮識(shí)別物體的類別依賴于語義信息,因此將深層網(wǎng)絡(luò)的語義信息融合到淺層網(wǎng)絡(luò)中去是個(gè)很自然的想法。
FPN工作的出發(fā)點(diǎn)便是如此,提出了一個(gè)行之有效的網(wǎng)絡(luò)結(jié)構(gòu),如圖4所示。其基本思想便是對(duì)深層網(wǎng)絡(luò)輸出的特征圖使用上采樣操作,然后與淺層網(wǎng)絡(luò)進(jìn)行融合,使得來自于不同尺度的細(xì)節(jié)信息和語義信息得到了有效的融合。
從網(wǎng)格的角度來看,越淺層的網(wǎng)格,劃分出的網(wǎng)格也越精細(xì),以416的輸入尺寸為例,經(jīng)過8倍降采樣得到的特征圖C3相當(dāng)于是一個(gè) 的網(wǎng)格,這要比經(jīng)過32倍降采樣得到的特征圖C5所劃分的 的網(wǎng)格精細(xì)得多,也就更容易去檢測(cè)小物體。同時(shí),更加精細(xì)的網(wǎng)格,也就更能避免先前所提到的“語義歧義”的問題。
既然,F(xiàn)PN將不同尺度的特征圖的信息進(jìn)行了一次融合,那么一個(gè)很自然的方法也就應(yīng)運(yùn)而生:多級(jí)檢測(cè)(multi-level detection)。最早,多級(jí)檢測(cè)方法可以追溯到SSD網(wǎng)絡(luò),SSD正是使用不同大小的特征圖來檢測(cè)不同尺度的目標(biāo),這一方法的思想內(nèi)核便是“分而治之”,即不同尺度的物體由不同尺度的特征圖去做檢測(cè),而不是像YOLOv2那樣,都堆在最后的C5特征圖上去做檢測(cè)。而FPN正是在這個(gè)基礎(chǔ)上,讓不同尺度的特征圖先融合一遍,再去做檢測(cè)。FPN的這一強(qiáng)大特性,使得它稱為了“分而治之”檢測(cè)方法的重要模塊。也為后續(xù)許多的特征融合工作帶去了啟發(fā),如PAN和BiFPN。
這里強(qiáng)調(diào)一下,“分而治之”方法的內(nèi)核不是FPN,而是多級(jí)檢測(cè)。FPN不過是錦上添花,即使我們不做特征融合,依舊可以做多級(jí)檢測(cè),如SSD。只是,使用特征融合手段,可以讓檢測(cè)的效果更好罷了。
多說一句,既然有“分而治之”,便也應(yīng)有“合而治之”,所謂“合而治之”,是指所有物體我們都在一個(gè)特征圖上去檢測(cè),換言之,就是“單級(jí)檢測(cè)”(single-level detection),比如早期的YOLOv1和YOLOv2,便是最為經(jīng)典的單級(jí)檢測(cè)工作。只不過,主流普遍認(rèn)為這種只在C5特征圖上去單級(jí)檢測(cè)的檢測(cè)器,小目標(biāo)檢測(cè)效果是不行的,盡管這一點(diǎn)被ECCV2020的DeTR和CVPR2021的YOLOF工作否決了,卻依舊難以扭轉(zhuǎn)這一根深蒂固的觀念,前者似乎只被關(guān)注了Transformer這一點(diǎn)上,而后者似乎被認(rèn)為是“開歷史倒車”。無數(shù)的歷史已證明,根深蒂固的觀念是很難被改變,而一旦被改變的那一天,便是一場(chǎng)舊事物的大毀滅與新事物的大噴發(fā)……
不過,還有一類單級(jí)檢測(cè)工作則另辟蹊徑,借鑒人體關(guān)鍵點(diǎn)檢測(cè)工作的思想,使用高分辨率的特征圖如只經(jīng)過4倍降采樣得到的特征圖C2來檢測(cè)物體,典型的工作包括CornerNet和膾炙人口的CenterNet。以512的輸入尺寸為例,只經(jīng)過4倍降采樣得到的特征圖C2相當(dāng)于是一個(gè)128×128的網(wǎng)格,要比C5的16×16精細(xì)的多,然后再將所有尺度的信息都融合到這一張?zhí)卣鲌D來,使得這樣一張具有精細(xì)的網(wǎng)格的特征圖既具備足夠的細(xì)節(jié)信息,又具備足夠的語義信息。不難想象,這樣的網(wǎng)絡(luò)只需要一張?zhí)卣鲌D便可以去檢測(cè)所有的物體。這一類工作具有典型的encoder和decoder的結(jié)構(gòu),通常encoder由常用的ResNet組成,decoder由簡(jiǎn)單的FPN結(jié)構(gòu)或者反卷積組成,當(dāng)然,也可以使用Hourglass網(wǎng)絡(luò)。這一類的單級(jí)檢測(cè)很輕松的得到了研究學(xué)者們的認(rèn)可,畢竟,相較于在粗糙的C5上做檢測(cè),直觀上便很認(rèn)同分辨率高得多的C2特征圖檢測(cè)方式。只不過,C2特征圖的尺寸太大,會(huì)帶來很大的計(jì)算量,但是,這類工作不需要諸如800×1333的輸入尺寸,僅僅512×512的尺寸便可以達(dá)到與之相當(dāng)?shù)男阅?/p>
9.總結(jié)
當(dāng)前目標(biāo)檢測(cè)模型算法也是層出不窮。在two-stage領(lǐng)域,2017年Facebook提出了mask R-CNN。CMU也提出了A-Fast-RCNN 算法,將對(duì)抗學(xué)習(xí)引入到目標(biāo)檢測(cè)領(lǐng)域。Face++也提出了Light-Head R-CNN,主要探討了 R-CNN 如何在物體檢測(cè)中平衡精確度和速度。
one-stage領(lǐng)域也是百花齊放,2017年首爾大學(xué)提出 R-SSD 算法,主要解決小尺寸物體檢測(cè)效果差的問題。清華大學(xué)提出了 RON 算法,結(jié)合 two stage 名的方法和 one stage 方法的優(yōu)勢(shì),更加關(guān)注多尺度對(duì)象定位和負(fù)空間樣本挖掘問題。
目標(biāo)檢測(cè)領(lǐng)域的深度學(xué)習(xí)算法,需要進(jìn)行目標(biāo)定位和物體識(shí)別,算法相對(duì)來說還是很復(fù)雜的。當(dāng)前各種新算法也是層不出窮,但模型之間有很強(qiáng)的延續(xù)性,大部分模型算法都是借鑒了前人的思想,站在巨人的肩膀上。我們需要知道經(jīng)典模型的特點(diǎn),這些tricks是為了解決什么問題,以及為什么解決了這些問題。這樣才能舉一反三,萬變不離其宗。綜合下來,目標(biāo)檢測(cè)領(lǐng)域主要的難點(diǎn)如下:
1,檢測(cè)速度:實(shí)時(shí)性要求高,故網(wǎng)絡(luò)結(jié)構(gòu)不能太復(fù)雜,參數(shù)不能太多,卷積層次也不能太多。
2,位置準(zhǔn)確率:(x y w h)參數(shù)必須準(zhǔn)確,也就是檢測(cè)框大小尺寸要匹配,且重合度IOU要高。SSD和faster
RCNN通過多個(gè)bounding box來優(yōu)化這個(gè)問題3,漏檢率:必須盡量檢測(cè)出所有目標(biāo)物體,特別是靠的近的物體和尺寸小的物體。SSD和faster RCNN通過多個(gè)bounding
box來優(yōu)化這個(gè)問題。4,物體寬高比例不常見:SSD通過不同尺寸feature map,yoloV2通過不同尺寸輸入圖片,來優(yōu)化這個(gè)問題。
5,靠的近的物體準(zhǔn)確率低。文章來源:http://www.zghlxwxcb.cn/news/detail-786667.html
6,小尺寸物體準(zhǔn)確率低:SSD取消全連接層,yoloV2增加pass through layer,采用高分辨率輸入圖片,來優(yōu)化這個(gè)問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-786667.html
到了這里,關(guān)于目標(biāo)檢測(cè)算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3,yoloV4,yoloV5,yoloV6,yoloV7)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!