十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
在上一步,完成了網(wǎng)絡(luò)的創(chuàng)建和數(shù)據(jù)的預(yù)處理。接下來準(zhǔn)備對(duì)這個(gè)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,通過訓(xùn)練得到一個(gè)可以用于目標(biāo)檢測的深度學(xué)習(xí)網(wǎng)絡(luò)模型。這里首先要確定上一步輸出的模型和數(shù)據(jù)集的存放路徑是可用的,否則訓(xùn)練環(huán)節(jié)會(huì)因?yàn)槿鄙佥斎攵鴪?bào)錯(cuò)。
創(chuàng)新互聯(lián)專業(yè)成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè),集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營銷、軟文推廣等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。
Halcon的參考樣例detect_pills_deep_learning_2_train.hdev詳述了這一過程,這里做一些學(xué)習(xí)記錄。
設(shè)置輸入路徑,主要是兩個(gè),一是上一步的預(yù)訓(xùn)練的以.hdl結(jié)尾的模型,另一個(gè)是數(shù)據(jù)集和樣本數(shù)據(jù)字典的存放路徑。
輸出路徑也是兩個(gè),一是存放最佳評(píng)估模型的路徑,一個(gè)是最終訓(xùn)練完成的模型路徑。
首先用check_files_availability驗(yàn)證預(yù)處理模型和數(shù)據(jù)集路徑是否正確。沒有問題的話可以開始讀取。
使用read_dl_model讀取前一步初始化后的網(wǎng)絡(luò)模型,得到模型的句柄DLModelHandle。
接著用read_dict讀取預(yù)處理后的數(shù)據(jù)集,得到數(shù)據(jù)字典句柄DLDataset。
設(shè)置模型參數(shù)主要通過set_dl_model_param算子,以修改屬性值的方式改變關(guān)鍵參數(shù)的值。該算子原型如下:
set_dl_model_param( : : DLModelHandle, GenParamName, GenParamValue : )
輸入三個(gè)參數(shù):
注意,如果將'runtime'的值改為了’gpu’,則要確定cuDNN和cuBLAS已經(jīng)成功安裝了。
通過set_dl_model_param算子,可以將本文開頭提到的設(shè)置的模型的基本參數(shù)傳遞給模型句柄DLModelHandle。如將'batch_size'設(shè)為之前的batch_size的值等等。
1)創(chuàng)建訓(xùn)練參數(shù)。
這里使用create_dl_train_param算子創(chuàng)建一個(gè)訓(xùn)練參數(shù)的字典,用于存放訓(xùn)練參數(shù)和訓(xùn)練效果可視化的參數(shù)。這些參數(shù)可以做個(gè)說明:
2)訓(xùn)練網(wǎng)絡(luò)
接下來是最耗時(shí)的部分,即使用train_dl_model算子進(jìn)行深度學(xué)習(xí)網(wǎng)絡(luò)模型的訓(xùn)練。算子如下:
train_dl_model( : : DLDataset, DLModelHandle, TrainParam, StartEpoch : TrainResults, TrainInfos,EvaluationInfos)
前四個(gè)參數(shù)是輸入?yún)?shù),后三個(gè)是輸出參數(shù)。
接著到了第三步,即驗(yàn)證模型的部分。
深度學(xué)習(xí)目前已經(jīng)應(yīng)用到了各個(gè)領(lǐng)域,應(yīng)用場景大體分為三類:物體識(shí)別,目標(biāo)檢測,自然語言處理。? 目標(biāo)檢測可以理解為是物體識(shí)別和物體定位的綜合 ,不僅僅要識(shí)別出物體屬于哪個(gè)分類,更重要的是得到物體在圖片中的具體位置。
2014年R-CNN算法被提出,基本奠定了two-stage方式在目標(biāo)檢測領(lǐng)域的應(yīng)用。它的算法結(jié)構(gòu)如下圖
算法步驟如下:
R-CNN較傳統(tǒng)的目標(biāo)檢測算法獲得了50%的性能提升,在使用VGG-16模型作為物體識(shí)別模型情況下,在voc2007數(shù)據(jù)集上可以取得66%的準(zhǔn)確率,已經(jīng)算還不錯(cuò)的一個(gè)成績了。其最大的問題是速度很慢,內(nèi)存占用量很大,主要原因有兩個(gè)
針對(duì)R-CNN的部分問題,2015年微軟提出了Fast R-CNN算法,它主要優(yōu)化了兩個(gè)問題。
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è)算法檢測速度較慢的最主要原因。
faster R-CNN 針對(duì)這個(gè)問題, 提出了RPN網(wǎng)絡(luò)來進(jìn)行候選框的獲取,從而擺脫了選擇性搜索算法,也只需要一次卷積層操作,從而大大提高了識(shí)別速度 。這個(gè)算法十分復(fù)雜,我們會(huì)詳細(xì)分析。它的基本結(jié)構(gòu)如下圖
主要分為四個(gè)步驟:
使用VGG-16卷積模型的網(wǎng)絡(luò)結(jié)構(gòu):
卷積層采用的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)榱?M/16) x (N/16)的feature map了。
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。
卷積層提取原始圖像信息,得到了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。
對(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。
另一路用來確定候選框的位置,也就是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]。最簡單的思路是,先做平移,使得中心點(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ù)測中)。優(yōu)化方法可以采用自適應(yīng)梯度下降算法Adam。
得到了前景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í)別了。
和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的輸出特征圖。
ROI Pooling層后的特征圖,通過全連接層與softmax,就可以計(jì)算屬于哪個(gè)具體類別,比如人,狗,飛機(jī),并可以得到cls_prob概率向量。同時(shí)再次利用bounding box regression精細(xì)調(diào)整proposal位置,得到bbox_pred,用于回歸更加精確的目標(biāo)檢測框。
這樣就完成了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í)性要求。
針對(duì)于two-stage目標(biāo)檢測算法普遍存在的運(yùn)算速度慢的缺點(diǎn), yolo創(chuàng)造性的提出了one-stage。也就是將物體分類和物體定位在一個(gè)步驟中完成。 yolo直接在輸出層回歸bounding box的位置和bounding box所屬類別,從而實(shí)現(xiàn)one-stage。通過這種方式, yolo可實(shí)現(xiàn)45幀每秒的運(yùn)算速度,完全能滿足實(shí)時(shí)性要求 (達(dá)到24幀每秒,人眼就認(rèn)為是連續(xù)的)。它的網(wǎng)絡(luò)結(jié)構(gòu)如下圖:
主要分為三個(gè)部分:卷積層,目標(biāo)檢測層,NMS篩選層。
采用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)該是為了簡化網(wǎng)絡(luò)結(jié)構(gòu))
先經(jīng)過4個(gè)卷積層和2個(gè)全連接層,最后生成7x7x30的輸出。先經(jīng)過4個(gè)卷積層的目的是為了提高模型泛化能力。yolo將一副448x448的原圖分割成了7x7個(gè)網(wǎng)格,每個(gè)網(wǎng)格要預(yù)測兩個(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。如下圖
其中前一項(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)檢測數(shù)據(jù)集 。常用目標(biāo)檢測數(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ù)測它屬于20分類中每一個(gè)類別的概率。分類信息是針對(duì)每個(gè)網(wǎng)格的,而不是bounding box。故只需要20個(gè),而不是40個(gè)。而confidence則是針對(duì)bounding box的,它只表示box內(nèi)是否有物體,而不需要預(yù)測物體是20分類中的哪一個(gè),故只需要2個(gè)參數(shù)。雖然分類信息和confidence都是概率,但表達(dá)含義完全不同。
篩選層是為了在多個(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和他們的類別。
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。
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)檢測層和NMS篩選層
SSD論文采用了VGG16的基礎(chǔ)網(wǎng)絡(luò),其實(shí)這也是幾乎所有目標(biāo)檢測神經(jīng)網(wǎng)絡(luò)的慣用方法。先用一個(gè)CNN網(wǎng)絡(luò)來提取特征,然后再進(jìn)行后續(xù)的目標(biāo)定位和目標(biāo)分類識(shí)別。
這一層由5個(gè)卷積層和一個(gè)平均池化層組成。去掉了最后的全連接層。SSD認(rèn)為目標(biāo)檢測中的物體,只與周圍信息相關(guān),它的感受野不是全局的,故沒必要也不應(yīng)該做全連接。SSD的特點(diǎn)如下。
每一個(gè)卷積層,都會(huì)輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進(jìn)行目標(biāo)位置和類別的訓(xùn)練和預(yù)測,從而達(dá)到 多尺度檢測 的目的,可以克服yolo對(duì)于寬高比不常見的物體,識(shí)別準(zhǔn)確率較低的問題。而yolo中,只在最后一個(gè)卷積層上做目標(biāo)位置和類別的訓(xùn)練和預(yù)測。這是SSD相對(duì)于yolo能提高準(zhǔn)確率的一個(gè)關(guān)鍵所在。
如上所示,在每個(gè)卷積層上都會(huì)進(jìn)行目標(biāo)檢測和分類,最后由NMS進(jìn)行篩選,輸出最終的結(jié)果。多尺度feature map上做目標(biāo)檢測,就相當(dāng)于多了很多寬高比例的bounding box,可以大大提高泛化能力。
和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)確率。
和yolo的篩選層基本一致,同樣先過濾掉類別概率低于閾值的default box,再采用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個(gè)不同feature map上的目標(biāo)檢測輸出的default box。
SSD基本已經(jīng)可以滿足我們手機(jī)端上實(shí)時(shí)物體檢測需求了,TensorFlow在Android上的目標(biāo)檢測官方模型ssd_mobilenet_v1_android_export.pb,就是通過SSD算法實(shí)現(xiàn)的。它的基礎(chǔ)卷積網(wǎng)絡(luò)采用的是mobileNet,適合在終端上部署和運(yùn)行。
針對(duì)yolo準(zhǔn)確率不高,容易漏檢,對(duì)長寬比不常見物體效果差等問題,結(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)如下
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)位置檢測的優(yōu)點(diǎn)。當(dāng)使用imageNet訓(xùn)練時(shí),只更新物體分類相關(guān)的參數(shù)。而使用coco時(shí),則更新全部所有參數(shù)。
YOLOv3可以說出來直接吊打一切圖像檢測算法。比同期的DSSD(反卷積SSD), FPN(feature pyramid networks)準(zhǔn)確率更高或相仿,速度是其1/3.。
YOLOv3的改動(dòng)主要有如下幾點(diǎn):
不過如果要求更精準(zhǔn)的預(yù)測邊框,采用COCO AP做評(píng)估標(biāo)準(zhǔn)的話,YOLO3在精確率上的表現(xiàn)就弱了一些。如下圖所示。
當(dāng)前目標(biāo)檢測模型算法也是層出不窮。在two-stage領(lǐng)域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 算法,將對(duì)抗學(xué)習(xí)引入到目標(biāo)檢測領(lǐng)域。Face++也提出了Light-Head R-CNN,主要探討了 R-CNN 如何在物體檢測中平衡精確度和速度。
one-stage領(lǐng)域也是百花齊放,2017年首爾大學(xué)提出 R-SSD 算法,主要解決小尺寸物體檢測效果差的問題。清華大學(xué)提出了 RON 算法,結(jié)合 two stage 名的方法和 one stage 方法的優(yōu)勢(shì),更加關(guān)注多尺度對(duì)象定位和負(fù)空間樣本挖掘問題。
目標(biāo)檢測領(lǐng)域的深度學(xué)習(xí)算法,需要進(jìn)行目標(biāo)定位和物體識(shí)別,算法相對(duì)來說還是很復(fù)雜的。當(dāng)前各種新算法也是層不出窮,但模型之間有很強(qiáng)的延續(xù)性,大部分模型算法都是借鑒了前人的思想,站在巨人的肩膀上。我們需要知道經(jīng)典模型的特點(diǎn),這些tricks是為了解決什么問題,以及為什么解決了這些問題。這樣才能舉一反三,萬變不離其宗。綜合下來,目標(biāo)檢測領(lǐng)域主要的難點(diǎn)如下:
一文讀懂目標(biāo)檢測AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2
從YOLOv1到v3的進(jìn)化之路
SSD-Tensorflow超詳細(xì)解析【一】:加載模型對(duì)圖片進(jìn)行測試?
YOLO? ? ? ? ? ? ?
C#項(xiàng)目參考:
項(xiàng)目實(shí)踐貼個(gè)圖。
英文原文:
對(duì)原文的表達(dá)有部分改動(dòng)
在本文中,我們將更深入地研究可用于目標(biāo)檢測的各種算法。我們將從 RCNN 家族的算法開始,即 RCNN、Fast RCNN 和 Faster RCNN。在本系列即將發(fā)布的文章中,我們將介紹更高級(jí)的算法,如 YOLO、SSD 等。
下圖是說明目標(biāo)檢測算法如何工作的一個(gè)流行示例。圖像中的每個(gè)物體,從一個(gè)人到一只風(fēng)箏,都以一定的精度被定位和識(shí)別。
讓我們從最簡單的深度學(xué)習(xí)方法開始,也是一種廣泛使用的方法,用于檢測圖像中的目標(biāo)——卷積神經(jīng)網(wǎng)絡(luò)( CNN)。CNN 的內(nèi)部工作原理如下:
我們將圖像傳遞給網(wǎng)絡(luò),然后通過各種卷積和池化層處理,發(fā)送給全連接層。最后,我們以目標(biāo)類別的形式獲得輸出。這相當(dāng)簡單,不是嗎?對(duì)于每個(gè)輸入圖像,我們得到一個(gè)相應(yīng)的類作為輸出。我們可以使用這種技術(shù)來檢測圖像中的各種目標(biāo)嗎?讓我們看看如何使用 CNN 解決一般的目標(biāo)檢測問題。
使用這種方法的問題在于圖像中的目標(biāo)可能具有不同的縱橫比和空間位置。例如,在某些情況下,目標(biāo)可能覆蓋圖像的大部分,而在某些情況下,目標(biāo)可能僅覆蓋圖像的一小部分。目標(biāo)的形狀也可能不同(在現(xiàn)實(shí)生活中經(jīng)常發(fā)生)。由于這些因素,我們將需要大量的區(qū)域,從而導(dǎo)致大量的計(jì)算時(shí)間。因此,為了解決這個(gè)問題并減少區(qū)域數(shù)量,我們可以使用基于區(qū)域的 CNN,它使用提案法選擇區(qū)域。讓我們了解這個(gè)基于區(qū)域的 CNN 可以為我們做什么。
與在大量區(qū)域上工作不同的是,RCNN 算法是在圖像中選取一堆框并檢查這些框中是否有任何一個(gè)包含任何目標(biāo)。 RCNN 使用 selective search 從圖像中提取這些框(這些框稱為 regions)。
讓我們首先了解什么是 selective search 以及它如何識(shí)別不同的 regions?;旧纤膫€(gè)模式可以構(gòu)成一個(gè)物體:不同的尺度、顏色、紋理和外殼。selective search 識(shí)別圖像中的這些模式,并在此基礎(chǔ)上提出各種regions。以下是selective search 工作原理的簡要概述:
舉個(gè)例子:
到目前為止,我們已經(jīng)看到了 RCNN 如何實(shí)現(xiàn)目標(biāo)檢測。但是這種技術(shù)有其自身的局限性。由于以下步驟,訓(xùn)練 RCNN 模型既昂貴又緩慢:
所有這些過程結(jié)合起來使 RCNN 非常慢。對(duì)每張新圖像進(jìn)行預(yù)測大約需要 40-50 秒,這實(shí)質(zhì)上使得模型在面對(duì)龐大的數(shù)據(jù)集時(shí)變得笨重且?guī)缀鯚o法構(gòu)建。
好消息是——我們有另一種目標(biāo)檢測技術(shù),它修復(fù)了我們?cè)?RCNN 中看到的大部分問題。
我們還能做些什么來減少 RCNN 算法通常需要的計(jì)算時(shí)間?我們是否可以每張圖像只運(yùn)行一次并獲取所有感興趣的區(qū)域(包含某個(gè)目標(biāo)的區(qū)域)。
RCNN 的作者 Ross Girshick 提出了這個(gè)想法,即每張圖像只運(yùn)行一次 CNN,然后找到一種方法在 2,000 個(gè)區(qū)域之間共享該計(jì)算。在 Fast RCNN 中,我們將輸入圖像提供給 CNN,后者反過來生成卷積特征圖。使用這些地圖,提取提議的區(qū)域。然后我們使用 RoI 池化層將所有提議的區(qū)域重塑為固定大小,以便可以將其饋入全連接網(wǎng)絡(luò)。
讓我們將其分解為簡化概念的步驟:
因此,F(xiàn)ast RCNN 不是使用三個(gè)不同的模型(如 RCNN),而是使用單個(gè)模型從區(qū)域中提取特征,將它們分成不同的類,并同時(shí)返回識(shí)別類的邊界框。
為了進(jìn)一步分解,我將對(duì)每個(gè)步驟進(jìn)行可視化。
這就是 Fast RCNN 如何解決 RCNN 的兩個(gè)主要問題,1. 將每個(gè)圖像的一個(gè)而不是 2,000 個(gè)區(qū)域傳遞給 ConvNet。2. 使用一個(gè)而不是三個(gè)不同的模型來提取特征、分類和生成邊界框。
但即使是 Fast RCNN 也存在某些問題。它還使用 selective search 作為尋找感興趣區(qū)域的建議方法,這是一個(gè)緩慢且耗時(shí)的過程。每張圖像檢測目標(biāo)大約需要 2 秒,這與 RCNN 相比要好得多。但是當(dāng)我們考慮大型現(xiàn)實(shí)生活數(shù)據(jù)集時(shí),即使是 Fast RCNN 看起來也不那么快了。
Faster RCNN 是 Fast RCNN 的修改版本。它們之間的主要區(qū)別在于 Fast RCNN 使用 selective search 來生成感興趣的區(qū)域,而 Faster RCNN 使用 Region Proposal Network ,又名 RPN。 RPN 將圖像特征圖作為輸入并生成一組目標(biāo)提議,每個(gè)提議的目標(biāo)以分?jǐn)?shù)作為輸出。
Faster RCNN 方法通常遵循以下步驟:
讓我簡要解釋一下這個(gè)區(qū)域提議網(wǎng)絡(luò)(RPN)實(shí)際上是如何工作的。
首先,F(xiàn)aster RCNN 從 CNN 獲取特征圖并將它們傳遞給區(qū)域提議網(wǎng)絡(luò)。 RPN 在這些特征圖上使用一個(gè)滑動(dòng)窗口,在每個(gè)窗口,它生成 k 個(gè)不同形狀和大小的 Anchor 框:
Anchor 框是固定大小的邊界框,它們放置在整個(gè)圖像中,具有不同的形狀和大小。對(duì)于每個(gè) Anchor,RPN 預(yù)測兩件事:
我們現(xiàn)在有不同形狀和大小的邊界框,它們被傳遞到 RoI 池化層。在 RPN 步驟之后,有可能存在沒有分配給它們的類別提議。我們可以獲取每個(gè)建議并對(duì)其進(jìn)行裁剪,以便每個(gè)建議都包含一個(gè)目標(biāo)。這就是 RoI 池化層所做的。它為每個(gè)錨點(diǎn)提取固定大小的特征圖:
然后將這些特征圖傳遞到具有 softmax 和線性回歸層的全連接層。它最終對(duì)目標(biāo)進(jìn)行分類并預(yù)測已識(shí)別目標(biāo)的邊界框。
到目前為止,我們討論的所有目標(biāo)檢測算法都使用區(qū)域來識(shí)別目標(biāo)。網(wǎng)絡(luò)不會(huì)一次性查看完整圖像,而是依次關(guān)注圖像的各個(gè)部分。這會(huì)造成兩個(gè)并發(fā)癥:
【嵌牛導(dǎo)讀】目標(biāo)檢測在現(xiàn)實(shí)中的應(yīng)用很廣泛,我們需要檢測數(shù)字圖像中的物體位置以及類別,它需要我們構(gòu)建一個(gè)模型,模型的輸入一張圖片,模型的輸出需要圈出圖片中所有物體的位置以及物體所屬的類別。在深度學(xué)習(xí)浪潮到來之前,目標(biāo)檢測精度的進(jìn)步十分緩慢,靠傳統(tǒng)依靠手工特征的方法來提高精度已是相當(dāng)困難的事。而ImageNet分類大賽出現(xiàn)的卷積神經(jīng)網(wǎng)絡(luò)(CNN)——AlexNet所展現(xiàn)的強(qiáng)大性能,吸引著學(xué)者們將CNN遷移到了其他的任務(wù),這也包括著目標(biāo)檢測任務(wù),近年來,出現(xiàn)了很多目標(biāo)檢測算法。
【嵌牛鼻子】計(jì)算機(jī)視覺
【嵌牛提問】如何理解目標(biāo)檢測算法——OverFeat
【嵌牛正文】
一、深度學(xué)習(xí)的典型目標(biāo)檢測算法
深度學(xué)習(xí)目標(biāo)檢測算法主要分為 雙階段檢測算法 和 單階段檢測算法 ,如圖1所示。
雙階段目標(biāo)檢測算法先對(duì)圖像提取候選框,然后基于候選區(qū)域做二次修正得到檢測結(jié)果,檢測精度較高,但檢測速度較慢;單階段目標(biāo)驗(yàn)測算法直接對(duì)圖像進(jìn)行計(jì)算生成檢測結(jié)果,檢測速度快,但檢測精度低。
1、雙階段目標(biāo)檢測算法
雙階段目標(biāo)檢測方法主要通過選擇性搜索(Selective Search)或者Edge Boxes等算法對(duì)輸入圖像選取可能包含檢測目標(biāo)的候選區(qū)域(Region Proposal),再對(duì)候選區(qū)域進(jìn)行分類和位置回歸以得到檢測結(jié)果。
1.1 OverFeat 算法
《OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks》
Sermanet?等改進(jìn)AlexNet 提出 OverFeat 算法。該算法結(jié)合AlexNet通過多尺度滑動(dòng)窗口實(shí)現(xiàn)特征提取功能,并且共享特征提取層,應(yīng)用于圖像分類、定位和目標(biāo)檢測等任務(wù)。
關(guān)鍵技術(shù):
1、FCN( 全卷積神經(jīng)網(wǎng)絡(luò) )
對(duì)于一個(gè)各層參數(shù)結(jié)構(gòu)都設(shè)計(jì)好的網(wǎng)絡(luò)模型,要求輸入圖片的尺寸是固定的(例如,Alexnet要求輸入圖片的尺寸為227px*227px)。如果輸入一張500*500的圖片,希望模型仍然可以一直前向傳導(dǎo),即一個(gè)已經(jīng)設(shè)計(jì)完畢的網(wǎng)絡(luò),可以輸入任意大小的圖片,這就是FCN。
FCN的思想在于:
1、從卷積層到全連接層,看成是對(duì)一整張圖片的卷積層運(yùn)算。
2、從全連接層到全連接層,看成是采用1*1大小的卷積核,進(jìn)行卷積層運(yùn)算。
如上圖所示,綠色部分代表卷積核大小。假設(shè)一個(gè)CNN模型,其輸入圖片大小是14*14,通過第一層卷積后得到10*10大小的圖片,然后接著通過池化得到了5*5大小的圖片。像但是對(duì)于像素值為5*5的圖片到像素值為1*1的圖片的過程中:
(1)傳統(tǒng)的CNN:如果從以前的角度進(jìn)行理解的話,那么這個(gè)過程就是全連接層,我們會(huì)把這個(gè)5*5大小的圖片,展平成為一維向量進(jìn)行計(jì)算。
(2)FCN:FCN并不是把5*5的圖片展平成一維向量再進(jìn)行計(jì)算,而是直接采用5*5的卷積核,對(duì)一整張圖片進(jìn)行卷積運(yùn)算。
二者本質(zhì)上是相同的,只是角度不同,F(xiàn)CN把這個(gè)過程當(dāng)成了對(duì)一整張?zhí)卣鲌D進(jìn)行卷積,同樣,后面的全連接層也是把它當(dāng)做是以1*1大小的卷積核進(jìn)行卷積運(yùn)算。
當(dāng)輸入一張任意大小的圖片,就需要利用以上所述的網(wǎng)絡(luò),例如輸入一張像素為16*16的圖片:
根據(jù)上圖,該網(wǎng)絡(luò)最后的輸出是一張2*2的圖片??梢姴捎肍CN網(wǎng)絡(luò)可以輸入任意大小的圖片。同時(shí)需要注意的是網(wǎng)絡(luò)最后輸出的圖片大小不在是一個(gè)1*1大小的圖片,而是一個(gè)與輸入圖片大小息息相關(guān)的一張圖片。
Overfeat就是把采用FCN的思想把全連接層看成了卷積層,在網(wǎng)絡(luò)測試階段可以輸入任意大小的圖片。
2、offset max-pooling
簡單起見,不用二維的圖像作為例子,而是采用一維作為示例:
如上圖所示,在X軸上有20個(gè)神經(jīng)元,并且選擇池化size=3的非重疊池化,那么根據(jù)之前所學(xué)的方法應(yīng)該是:對(duì)上面的20個(gè)神經(jīng)元,從1位置開始進(jìn)行分組,每3個(gè)連續(xù)的神經(jīng)元為一組,然后計(jì)算每組的最大值(最大池化),19、20號(hào)神經(jīng)元將被丟棄,如下圖所示:
或者可以在20號(hào)神經(jīng)元后面,添加一個(gè)數(shù)值為0的神經(jīng)元編號(hào)21,與19、20成為一組,這樣可以分成7組:[1,2,3],[4,5,6]……,
[16,17,18],[19,20,21],最后計(jì)算每組的最大值。
如果只分6組,除了以1作為初始位置進(jìn)行連續(xù)組合之外,也可以從位置2或者3開始進(jìn)行組合。也就是說其實(shí)有3種池化組合方法:
A、△=0分組:[1,2,3],[4,5,6]……,[16,17,18];
B、△=1分組:[2,3,4],[5,6,7]……,[17,18,19];
C、△=2分組:[3,4,5],[6,7,8]……,[18,19,20];
對(duì)應(yīng)圖片如下:
以往的CNN中,一般只用△=0的情況,得到池化結(jié)果后,就送入了下一層。但是該文獻(xiàn)的方法是,把上面的△=0、△=1、△=2的三種組合方式的池化結(jié)果,分別送入網(wǎng)絡(luò)的下一層。這樣的話,網(wǎng)絡(luò)在最后輸出的時(shí)候,就會(huì)出現(xiàn)3種預(yù)測結(jié)果了。
前面所述是一維的情況,如果是2維圖片的話,那么(△x,△y)就會(huì)有9種取值情況(3*3);如果我們?cè)谧鰣D片分類的時(shí)候,在網(wǎng)絡(luò)的某一個(gè)池化層加入了這種offset 池化方法,然后把這9種池化結(jié)果,分別送入后面的網(wǎng)絡(luò)層,最后的圖片分類輸出結(jié)果就可以得到9個(gè)預(yù)測結(jié)果(每個(gè)類別都可以得到9種概率值,然后我們對(duì)每個(gè)類別的9種概率,取其最大值,做為此類別的預(yù)測概率值)。
算法原理:
文獻(xiàn)中的算法,就是把這兩種思想結(jié)合起來,形成了文獻(xiàn)最后測試階段的算法。
1、論文的網(wǎng)絡(luò)架構(gòu)與訓(xùn)練階段
(1)網(wǎng)絡(luò)架構(gòu)
對(duì)于網(wǎng)絡(luò)的結(jié)構(gòu),文獻(xiàn)給出了兩個(gè)版本——快速版、精確版,一個(gè)精度比較高但速度慢;另外一個(gè)精度雖然低但是速度快。下面是高精度版本的網(wǎng)絡(luò)結(jié)構(gòu)表相關(guān)參數(shù):
表格參數(shù)說明:
網(wǎng)絡(luò)輸入:圖片大小為221px*221px;
網(wǎng)絡(luò)結(jié)構(gòu)方面基本上和AlexNet相同,使用了ReLU激活,最大池化。不同之處在于:(a)作者沒有使用局部響應(yīng)歸一化層;(b)然后也沒有采用重疊池化的方法;(c)在第一層卷積層,stride作者是選擇了2,這個(gè)與AlexNet不同(AlexNet選擇的跨步是4,在網(wǎng)絡(luò)中,如果stride選擇比較大得話,雖然可以減少網(wǎng)絡(luò)層數(shù),提高速度,但是卻會(huì)降低精度)。
需要注意的是把f7這一層,看成是卷積核大小為5*5的卷積層,總之就是需要把網(wǎng)絡(luò)看成前面所述的FCN模型,去除了全連接層的概念,因?yàn)樵跍y試階段可不是僅僅輸入221*221這樣大小的圖片,在測試階段要輸入各種大小的圖片,具體請(qǐng)看后面測試階段的講解。
(2)網(wǎng)絡(luò)訓(xùn)練
訓(xùn)練輸入:對(duì)于每張?jiān)瓐D片為256*256,然后進(jìn)行隨機(jī)裁剪為221*221的大小作為CNN輸入,進(jìn)行訓(xùn)練。
優(yōu)化求解參數(shù)設(shè)置:訓(xùn)練的min-batchs選擇128,權(quán)重初始化選擇高斯分布的隨機(jī)初始化:
然后采用隨機(jī)梯度下降法,進(jìn)行優(yōu)化更新,動(dòng)量項(xiàng)參數(shù)大小選擇0.6,L2權(quán)重衰減系數(shù)大小選擇10-5次方。學(xué)習(xí)率初始化值為0.05,根據(jù)迭代次數(shù)的增加,每隔幾十次的迭代后,就把學(xué)習(xí)率的大小減小一半。
然后就是DropOut,這個(gè)只有在最后的兩個(gè)全連接層,才采用dropout,dropout比率選擇0.5。
2、網(wǎng)絡(luò)測試階段
在Alexnet的文獻(xiàn)中,預(yù)測方法是輸入一張圖片256*256,然后進(jìn)行multi-view裁剪,也就是從圖片的四個(gè)角進(jìn)行裁剪,還有就是一圖片的中心進(jìn)行裁剪,這樣可以裁剪到5張224*224的圖片。然后把原圖片水平翻轉(zhuǎn)一下,再用同樣的方式進(jìn)行裁剪,又可以裁剪到5張圖片。把這10張圖片作為輸入,分別進(jìn)行預(yù)測分類,在后在softmax的最后一層,求取個(gè)各類的總概率,求取平均值。
然而Alexnet這種預(yù)測方法存在兩個(gè)問題:
一方面這樣的裁剪方式,把圖片的很多區(qū)域都給忽略了,這樣的裁剪方式,剛好把圖片物體的一部分給裁剪掉了;
另一方面,裁剪窗口重疊存在很多冗余的計(jì)算,像上面要分別把10張圖片送入網(wǎng)絡(luò),可見測試階段的計(jì)算量還是較大的。
Overfeat算法:
訓(xùn)練完上面所說的網(wǎng)絡(luò)之后,在測試階段不再是用一張221*221大小的圖片了作為網(wǎng)絡(luò)的輸入,而是用了6張大小都不相同的圖片,也就是所謂的多尺度輸入預(yù)測,如下表格所示:
當(dāng)網(wǎng)絡(luò)前向傳導(dǎo)到layer 5的時(shí)候,就利用了前面所述的FCN、offset pooling這兩種思想的相結(jié)合。現(xiàn)以輸入一張圖片為例(6張圖片的計(jì)算方法都相同),講解layer 5后面的整體過程,具體流程示意圖如下:
步驟一:
對(duì)于某個(gè)尺度的圖片,經(jīng)過前五層的卷積后得到特征圖。上圖中特征圖的分辨率是20x23,256個(gè)通道。
步驟二:
對(duì)于該特征圖,重復(fù)多次使用非重疊的池化,每次池化的偏置不同,有行偏置和列偏置。上圖中偏置池化3次,偏置分別為為(0,1,2)。這就是offset pooling,也被稱為fine stride。offset pooling得到的特征圖的維度為6x7x3x3xD,其中6x7是特征圖的分辨率,3x3是偏置池化的次數(shù),D是通道數(shù)。上圖中是以1維顯示的。
步驟三:
池化后得到的特征圖將被送入分類器。
步驟四:
分類器的輸入是的5x5xD,輸出是C(類別數(shù))維向量。但是offset pooling后得到的特征圖并不是5x5xD,比如上圖中的特征圖大小為6x7xD,因此分類器以滑動(dòng)窗口的方式應(yīng)用在特征圖上,每個(gè)滑動(dòng)窗口經(jīng)過分類器輸出一個(gè)C維向量。比如上圖中輸入的6x7xD的特征圖最終得到2x3xC的輸出,其中2x3是滑動(dòng)窗口的個(gè)數(shù)。
步驟五:
而2x3xC只是一組偏置池化的輸出,總的輸出為2x3x3x3xC,將輸出的張量reshape,得到6x9xC輸出張量。最終輸出分類張量為3d張量,即兩個(gè)分辨率維度 x C維。
然后需要在后面把它們拉成一維向量,這樣在一個(gè)尺度上,可以得到一個(gè)C*N個(gè)預(yù)測值矩陣,每一列就表示圖片屬于某一類別的概率值,并且求取每一列的最大值,作為本尺度的每個(gè)類別的概率值。
最后一共用了6種不同尺度(文獻(xiàn)使用了12張,另外6張是水平翻轉(zhuǎn)的圖片)進(jìn)行做預(yù)測,然后把這六種尺度結(jié)果再做一個(gè)平均,作為最最后的結(jié)果。
從上面過程可以看到整個(gè)網(wǎng)絡(luò)分成兩部分:layer 1~5這五層稱之為特征提取層;layer 6~output稱之為分類層。
六、定位任務(wù)
用于定位任務(wù)的時(shí)候,就把分類層(上面的layer 6~output)給重新設(shè)計(jì)一下,把分類改成回歸問題,然后在各種不同尺度上訓(xùn)練預(yù)測物體的bounding box。
傳統(tǒng)的目標(biāo)檢測算法適用的場景有限,而且維護(hù)成本很大。深度學(xué)習(xí)方法應(yīng)用于目標(biāo)檢測,不僅算法適應(yīng)性好,還可以進(jìn)行遷移學(xué)習(xí),降低成本。
深度學(xué)習(xí)目標(biāo)檢測算法中,基于錨框(Anchor)的方法主要分為 一階段 方法和 兩階段 方法。
兩階段 方法先對(duì)感興趣的區(qū)域進(jìn)行選擇,然后進(jìn)一步對(duì)候選框內(nèi)做分類和回歸,最終輸出選擇的框以及對(duì)應(yīng)的分類。兩階段的模型有R-CNN系列,比如 R-CNN,F(xiàn)ast-RCNN,F(xiàn)aster-RCNN 等。兩階段模型的優(yōu)點(diǎn)是精度高,但是速度及較慢。
一階段 方法直接對(duì)anchor進(jìn)行回歸和分類,得到最終目標(biāo)框和類別,算法有 YOLOv2,v3,SSD,RetinaNet 等。一階段模型的推理速度較快,但是相對(duì)的精度會(huì)下降一些。
此外還有一些 anchor-free 的方法,包括基于關(guān)鍵點(diǎn)的檢測算法以及基于中心檢測算法等。
下面是一些基礎(chǔ)概念和縮寫:
BBox :Bounding Box 邊界框
Anchor :錨框
RoI : Region of Interest 特定的感興趣區(qū)域
Region Proposal : 候選區(qū)域
RPN : Region proposal network 提取候選區(qū)域的網(wǎng)絡(luò)
IoU : Intersaction over Union (Area of Overlap/ Area of Union) 交并比,預(yù)測框的質(zhì)量
mAP :mean average precision
NMS :non-maximum suppression 非極大值抑制
YOLO系列的模型在保有一定精度的基礎(chǔ)上擁有很快的推理速度,在下面圖中YOLOv3的推理速度遠(yuǎn)超其他模型,因此在實(shí)時(shí)監(jiān)測領(lǐng)域中有很好的應(yīng)用。
YOLO的名字來源于you only look once,從名字上就道出了YOLO的精髓。
YOLOv1將圖像劃分為S*S個(gè)網(wǎng)絡(luò),物體真實(shí)框的中心落在哪個(gè)網(wǎng)格上,哪個(gè)網(wǎng)格對(duì)應(yīng)的錨框就負(fù)責(zé)檢測物體。
每個(gè)網(wǎng)格會(huì)預(yù)測一個(gè)邊界框以及對(duì)應(yīng)的置信度,這里的置信度反映的是模型認(rèn)為這個(gè)框里包含著物體的把握以及它預(yù)測到這個(gè)物體的精確程度。所以置信度就等于 。如果物體不存在,那么置信度應(yīng)該等于零。
每個(gè)邊界框會(huì)預(yù)測5個(gè)值 。(x,y)坐標(biāo)表示框相對(duì)于網(wǎng)格單元邊界的中心。 w,y是相對(duì)于整個(gè)圖像預(yù)測寬度和高度。 最后,置信度預(yù)測表示預(yù)測框與任何真實(shí)框之間的IOU。
YOLOv2在v1的基礎(chǔ)上進(jìn)行了優(yōu)化,骨干網(wǎng)絡(luò)使用了DarkNet19,并且將輸入圖片給尺寸從224增大到448,并且將網(wǎng)絡(luò)結(jié)構(gòu)設(shè)為全卷積網(wǎng)絡(luò)結(jié)構(gòu)加上Batch Norm,使用了Kmeans聚類方法來計(jì)算anchor,引入了多尺度訓(xùn)練,使網(wǎng)絡(luò)在訓(xùn)練過程中學(xué)習(xí)不同尺度的圖像。不過待改進(jìn)的地方有在小目標(biāo)上召回率不高,靠近的群體目標(biāo)檢測效果不好,檢測精度還有優(yōu)化空間。
YOLOv3使用了更加深的骨干網(wǎng)絡(luò)DarkNet53,同時(shí)加入了多尺度預(yù)測,在COCO數(shù)據(jù)集上聚類; 9中不同尺度的anchor,在分類上使用sigmoid激活函數(shù),支持了目標(biāo)的多分類。YOLOv3的優(yōu)點(diǎn)是推理速度快,性價(jià)比高,通用性強(qiáng);缺點(diǎn)是召回率較低,定位精度較差,對(duì)于靠近或者遮擋的群體、小物體的檢測能力相對(duì)較弱。
YOLOv3在v1的基礎(chǔ)上做了很多改動(dòng)。
邊界框預(yù)測
YOLOv3使用聚類預(yù)測到的邊界框作為錨框。網(wǎng)絡(luò)為邊界框預(yù)測4個(gè)坐標(biāo)值 ,如果單元格從圖像的左上角偏移了 ,并且先驗(yàn)邊界框的寬度和高度為 ,則預(yù)測如下圖:
YOLOv3給每個(gè)邊界框用邏輯回歸預(yù)測一個(gè)objectness score,如果某個(gè)邊界框和真實(shí)框重合度比其他都高,那么它的objectness score應(yīng)該是1。而其他框雖然也與真實(shí)框有重疊,會(huì)被忽略掉。
類別預(yù)測
使用的是sigmoid函數(shù),沒有用softmax因?yàn)闆]必要。
不同尺度的預(yù)測
YOLOv3使用k-means聚類來確定bounding box priors,選擇了9個(gè)clusters和3個(gè)scales,然后在整個(gè)scales上均勻分割clusters。在COCO數(shù)據(jù)集上,9個(gè)cluster分別為(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90) ,(156×198),(373×326)。
特征提取
YOLOv3使用了Darknet-53,特點(diǎn)是加入了殘差,比之前的網(wǎng)絡(luò)更深了(有53層卷積層所以叫Darknet-53)。
借一張圖看一下YOLOv3的整個(gè)流程:
每個(gè)輸出分支上對(duì)應(yīng)著三個(gè)尺寸的先驗(yàn)框(總共3 3=9種尺度)。經(jīng)過32倍下采樣的網(wǎng)格,每一個(gè)網(wǎng)格對(duì)應(yīng)著輸入圖像上32 32的區(qū)域,適合檢測尺寸較大的目標(biāo),而8倍下采樣的網(wǎng)格適合檢測尺寸小的目標(biāo)。
輸出特征的高度H和寬度W,相當(dāng)于將圖像劃分為H*W個(gè)網(wǎng)格,而不是直接在圖像上畫網(wǎng)格。也就是說32倍下采樣之后得到的 ,相當(dāng)于在輸入圖像上劃一個(gè) 的網(wǎng)格,每一個(gè)網(wǎng)格對(duì)應(yīng)著輸出特征圖上的一個(gè)點(diǎn)。
特征圖的C通道上表示預(yù)測框的信息,包括坐標(biāo)信息 ,目標(biāo)置信度,分類。
C=B*(1+4+class_num),B為特征圖上分配的錨框個(gè)數(shù)。
損失函數(shù)有三個(gè),分類損失,定位損失和objectness損失。分類使用sigmoid激活函數(shù),loss是sigmoid cross entropy。定位損失在x,y上使用sigmoid函數(shù)和sigmoid cross entropy損失,在w,h上使用L1損失。objectness損失用的是sigmoid激活函數(shù)和sigmoid cross entropy損失。
對(duì)于與真實(shí)框重疊的框,三種損失都要計(jì)算
對(duì)于沒有真實(shí)框重疊的框,只計(jì)算objectness(0);對(duì)于與真實(shí)框重疊但不是最匹配的框,忽略它們。