YOLO系列算法是一類典型的one-stage目標檢測算法,其利用anchor box將分類與目標定位的回歸問題結(jié)合起來,從而做到了高效、靈活和泛化性能好,所以在工業(yè)界也十分受歡迎,接下來我們介紹YOLO 系列算法。 1.yolo算法Yolo算法采用一個單獨的CNN模型實現(xiàn)end-to-end的目標檢測,核心思想就是利用整張圖作為網(wǎng)絡(luò)的輸入,直接在輸出層回歸 bounding box(邊界框) 的位置及其所屬的類別,整個系統(tǒng)如下圖所示: 首先將輸入圖片resize到448x448,然后送入CNN網(wǎng)絡(luò),最后處理網(wǎng)絡(luò)預(yù)測結(jié)果得到檢測的目標。相比R-CNN算法,其是一個統(tǒng)一的框架,其速度更快。 1.1 Yolo算法思想在介紹Yolo算法之前,我們回憶下RCNN模型,RCNN模型提出了候選區(qū)(Region Proposals)的方法,先從圖片中搜索出一些可能存在對象的候選區(qū)(Selective Search),大概2000個左右,然后對每個候選區(qū)進行對象識別,但處理速度較慢。 Yolo意思是You Only Look Once,它并沒有真正的去掉候選區(qū)域,而是創(chuàng)造性的將候選區(qū)和目標分類合二為一,看一眼圖片就能知道有哪些對象以及它們的位置。 Yolo模型采用預(yù)定義預(yù)測區(qū)域的方法來完成目標檢測,具體而言是將原始圖像劃分為 7x7=49 個網(wǎng)格(grid),每個網(wǎng)格允許預(yù)測出2個邊框(bounding box,包含某個對象的矩形框),總共 49x2=98 個bounding box。我們將其理解為98個預(yù)測區(qū),很粗略的覆蓋了圖片的整個區(qū)域,就在這98個預(yù)測區(qū)中進行目標檢測。 只要得到這98個區(qū)域的目標分類和回歸結(jié)果,再進行NMS就可以得到最終的目標檢測結(jié)果。那具體要怎樣實現(xiàn)呢? 1.2 Yolo的網(wǎng)絡(luò)結(jié)構(gòu)YOLO的結(jié)構(gòu)非常簡單,就是單純的卷積、池化最后加了兩層全連接,從網(wǎng)絡(luò)結(jié)構(gòu)上看,與前面介紹的CNN分類網(wǎng)絡(luò)沒有本質(zhì)的區(qū)別,最大的差異是輸出層用線性函數(shù)做激活函數(shù),因為需要預(yù)測bounding box的位置(數(shù)值型),而不僅僅是對象的概率。所以粗略來說,YOLO的整個結(jié)構(gòu)就是輸入圖片經(jīng)過神經(jīng)網(wǎng)絡(luò)的變換得到一個輸出的張量,如下圖所示: 網(wǎng)絡(luò)結(jié)構(gòu)比較簡單,重點是我們要理解網(wǎng)絡(luò)輸入與輸出之間的關(guān)系。 1.2.1 網(wǎng)絡(luò)輸入 網(wǎng)絡(luò)的輸入是原始圖像,唯一的要求是縮放到448x448的大小。主要是因為Yolo的網(wǎng)絡(luò)中,卷積層最后接了兩個全連接層,全連接層是要求固定大小的向量作為輸入,所以Yolo的輸入圖像的大小固定為448x448。 1.2.2 網(wǎng)絡(luò)輸出 網(wǎng)絡(luò)的輸出就是一個7x7x30 的張量(tensor)。那這個輸出結(jié)果我們要怎么理解那? 1.7X7網(wǎng)格 根據(jù)YOLO的設(shè)計,輸入圖像被劃分為 7x7 的網(wǎng)格(grid),輸出張量中的 7x7 就對應(yīng)著輸入圖像的 7x7 網(wǎng)格。或者我們把 7x7x30 的張量看作 7x7=49個30維的向量,也就是輸入圖像中的每個網(wǎng)格對應(yīng)輸出一個30維的向量。如下圖所示,比如輸入圖像左上角的網(wǎng)格對應(yīng)到輸出張量中左上角的向量。 2.30維向量 30維的向量包含:2個bbox的位置和置信度以及該網(wǎng)格屬于20個類別的概率
Pr(Object)是bounding box內(nèi)存在對象的概率
Yolo支持識別20種不同的對象(人、鳥、貓、汽車、椅子等),所以這里有20個值表示該網(wǎng)格位置存在任一種對象的概率. 1.3Yolo模型的訓(xùn)練在進行模型訓(xùn)練時,我們需要構(gòu)造訓(xùn)練樣本和設(shè)計損失函數(shù),才能利用梯度下降對網(wǎng)絡(luò)進行訓(xùn)練。 1.3.1訓(xùn)練樣本的構(gòu)建 將一幅圖片輸入到y(tǒng)olo模型中,對應(yīng)的輸出是一個7x7x30張量,構(gòu)建標簽label時對于原圖像中的每一個網(wǎng)格grid都需要構(gòu)建一個30維的向量。對照下圖我們來構(gòu)建目標向量:
對于輸入圖像中的每個對象,先找到其中心點。比如上圖中自行車,其中心點在黃色圓點位置,中心點落在黃色網(wǎng)格內(nèi),所以這個黃色網(wǎng)格對應(yīng)的30維向量中,自行車的概率是1,其它對象的概率是0。所有其它48個網(wǎng)格的30維向量中,該自行車的概率都是0。這就是所謂的"中心點所在的網(wǎng)格對預(yù)測該對象負責"。狗和汽車的分類概率也是同樣的方法填寫
訓(xùn)練樣本的bbox位置應(yīng)該填寫對象真實的位置bbox,但一個對象對應(yīng)了2個bounding box,該填哪一個呢?需要根據(jù)網(wǎng)絡(luò)輸出的bbox與對象實際bbox的IOU來選擇,所以要在訓(xùn)練過程中動態(tài)決定到底填哪一個bbox。
預(yù)測置信度的公式為: IOUtruthpredIOUpredtruth?利用網(wǎng)絡(luò)輸出的2個bounding box與對象真實bounding box計算出來。然后看這2個bounding box的IOU,哪個比較大,就由哪個bounding box來負責預(yù)測該對象是否存在,即該bounding box的置信度目標值為1,同時對象真實bounding box的位置也就填入該bounding box。另一個不負責預(yù)測的bounding box的置信度目標值為0。 上圖中自行車所在的grid對應(yīng)的結(jié)果如下圖所示: 1.3.2 損失函數(shù) 損失就是網(wǎng)絡(luò)實際輸出值與樣本標簽值之間的偏差: yolo給出的損失函數(shù): 注:其中1obji1iobj表示目標是否出現(xiàn)在網(wǎng)格單元i中,1objij1ijobj表示單元格i中的第j個邊界框預(yù)測器負責該預(yù)測,YOLO設(shè)置 λcoord=5λcoord=5 來調(diào)高位置誤差的權(quán)重, λnoobj=0.5λnoobj=0.5 即調(diào)低不存在對象的bounding box的置信度誤差的權(quán)重。 1.3.3 模型訓(xùn)練 Yolo先使用ImageNet數(shù)據(jù)集對前20層卷積網(wǎng)絡(luò)進行預(yù)訓(xùn)練,然后使用完整的網(wǎng)絡(luò),在PASCAL VOC數(shù)據(jù)集上進行對象識別和定位的訓(xùn)練。 Yolo的最后一層采用線性激活函數(shù),其它層都是Leaky ReLU。訓(xùn)練中采用了drop out和數(shù)據(jù)增強(data augmentation)來防止過擬合. 1.4 模型預(yù)測將圖片resize成448x448的大小,送入到y(tǒng)olo網(wǎng)絡(luò)中,輸出一個 7x7x30 的張量(tensor)來表示圖片中所有網(wǎng)格包含的對象(概率)以及該對象可能的2個位置(bounding box)和可信程度(置信度)。在采用NMS(Non-maximal suppression,非極大值抑制)算法選出最有可能是目標的結(jié)果。 1.5 yolo總結(jié)優(yōu)點
缺點
2.yoloV2YOLOv2相對v1版本,在繼續(xù)保持處理速度的基礎(chǔ)上,從預(yù)測更準確(Better),速度更快(Faster),識別對象更多(Stronger)這三個方面進行了改進。其中識別更多對象也就是擴展到能夠檢測9000種不同對象,稱之為YOLO9000。 下面我們看下yoloV2的都做了哪些改進? 2.1 預(yù)測更準確(better)2.1.1 batch normalization 批標準化有助于解決反向傳播過程中的梯度消失和梯度爆炸問題,降低對一些超參數(shù)的敏感性,并且每個batch分別進行歸一化的時候,起到了一定的正則化效果,從而能夠獲得更好的收斂速度和收斂效果。在yoloV2中卷積后全部加入Batch Normalization,網(wǎng)絡(luò)會提升2%的mAP。 2.1.2 使用高分辨率圖像微調(diào)分類模型 YOLO v1使用ImageNet的圖像分類樣本采用 224x224 作為輸入,來訓(xùn)練CNN卷積層。然后在訓(xùn)練對象檢測時,檢測用的圖像樣本采用更高分辨率的 448x448 的圖像作為輸入。但這樣切換對模型性能有一定影響。 YOLOV2在采用 224x224 圖像進行分類模型預(yù)訓(xùn)練后,再采用 448x448 的高分辨率樣本對分類模型進行微調(diào)(10個epoch),使網(wǎng)絡(luò)特征逐漸適應(yīng) 448x448 的分辨率。然后再使用 448x448 的檢測樣本進行訓(xùn)練,緩解了分辨率突然切換造成的影響。 使用該技巧后網(wǎng)絡(luò)的mAP提升了約4%。 2.1.3 采用Anchor Boxes YOLO1并沒有采用先驗框,并且每個grid只預(yù)測兩個bounding box,整個圖像98個。YOLO2如果每個grid采用5個先驗框,總共有13x13x5=845個先驗框。通過引入anchor boxes,使得預(yù)測的box數(shù)量更多(13x13xn)。 2.2.4 聚類提取anchor尺度 Faster-rcnn選擇的anchor比例都是手動指定的,但是不一定完全適合數(shù)據(jù)集。YOLO2嘗試統(tǒng)計出更符合樣本中對象尺寸的先驗框,這樣就可以減少網(wǎng)絡(luò)微調(diào)先驗框到實際位置的難度。YOLO2的做法是對訓(xùn)練集中標注的邊框進行聚類分析,以尋找盡可能匹配樣本的邊框尺寸。 YoloV2選擇了聚類的五種尺寸最為anchor box。 2.1.5 邊框位置的預(yù)測 Yolov2中將邊框的結(jié)果約束在特定的網(wǎng)格中: 其中, bx,by,bw,bhbx,by,bw,bh是預(yù)測邊框的中心和寬高。 Pr(object)?IOU(b,object)Pr(object)?IOU(b,object)是預(yù)測邊框的置信度,YOLO1是直接預(yù)測置信度的值,這里對預(yù)測參數(shù)toto進行σ變換后作為置信度的值。 cx,cycx,cy是當前網(wǎng)格左上角到圖像左上角的距離,要先將網(wǎng)格大小歸一化,即令一個網(wǎng)格的寬=1,高=1。 pw,phpw,ph是先驗框的寬和高。 σ是sigmoid函數(shù)。 tx,ty,tw,th,totx,ty,tw,th,to是要學(xué)習的參數(shù),分別用于預(yù)測邊框的中心和寬高,以及置信度。 如下圖所示: 由于σ函數(shù)將 tx,tytx,ty約束在(0,1)范圍內(nèi),預(yù)測邊框的藍色中心點被約束在藍色背景的網(wǎng)格內(nèi)。約束邊框位置使得模型更容易學(xué)習,且預(yù)測更為穩(wěn)定。 假設(shè)網(wǎng)絡(luò)預(yù)測值為: anchor框為: 則目標在特征圖中的位置: 在原圖像中的位置: 2.1.6 細粒度特征融合 圖像中對象會有大有小,輸入圖像經(jīng)過多層網(wǎng)絡(luò)提取特征,最后輸出的特征圖中,較小的對象可能特征已經(jīng)不明顯甚至被忽略掉了。為了更好的檢測出一些比較小的對象,最后輸出的特征圖需要保留一些更細節(jié)的信息。 YOLO2引入一種稱為passthrough層的方法在特征圖中保留一些細節(jié)信息。具體來說,就是在最后一個pooling之前,特征圖的大小是26x26x512,將其1拆4,直接傳遞(passthrough)到pooling后(并且又經(jīng)過一組卷積)的特征圖,兩者疊加到一起作為輸出的特征圖。 具體的拆分方法如下所示: 2.1.7 多尺度訓(xùn)練 YOLO2中沒有全連接層,可以輸入任何尺寸的圖像。因為整個網(wǎng)絡(luò)下采樣倍數(shù)是32,采用了{320,352,...,608}等10種輸入圖像的尺寸,這些尺寸的輸入圖像對應(yīng)輸出的特征圖寬和高是{10,11,...19}。訓(xùn)練時每10個batch就隨機更換一種尺寸,使網(wǎng)絡(luò)能夠適應(yīng)各種大小的對象檢測。 2.2 速度更快(Faster)yoloV2提出了Darknet-19(有19個卷積層和5個MaxPooling層)網(wǎng)絡(luò)結(jié)構(gòu)作為特征提取網(wǎng)絡(luò)。DarkNet-19比VGG-16小一些,精度不弱于VGG-16,但浮點運算量減少到約?,以保證更快的運算速度。 yoloV2的網(wǎng)絡(luò)中只有卷積+pooling,從416x416x3 變換到 13x13x5x25。增加了batch normalization,增加了一個passthrough層,去掉了全連接層,以及采用了5個先驗框,網(wǎng)絡(luò)的輸出如下圖所示: 2.3 識別對象更多VOC數(shù)據(jù)集可以檢測20種對象,但實際上對象的種類非常多,只是缺少相應(yīng)的用于對象檢測的訓(xùn)練樣本。YOLO2嘗試利用ImageNet非常大量的分類樣本,聯(lián)合COCO的對象檢測數(shù)據(jù)集一起訓(xùn)練,使得YOLO2即使沒有學(xué)過很多對象的檢測樣本,也能檢測出這些對象。 3.yoloV3yoloV3以V1,V2為基礎(chǔ)進行的改進,主要有:利用多尺度特征進行目標檢測;先驗框更豐富;調(diào)整了網(wǎng)絡(luò)結(jié)構(gòu);對象分類使用logistic代替了softmax,更適用于多標簽分類任務(wù)。 3.1算法簡介YOLOv3是YOLO (You Only Look Once)系列目標檢測算法中的第三版,相比之前的算法,尤其是針對小目標,精度有顯著提升。 yoloV3的流程如下圖所示,對于每一幅輸入圖像,YOLOv3會預(yù)測三個不同尺度的輸出,目的是檢測出不同大小的目標。 3.2多尺度檢測通常一幅圖像包含各種不同的物體,并且有大有小。比較理想的是一次就可以將所有大小的物體同時檢測出來。因此,網(wǎng)絡(luò)必須具備能夠“看到”不同大小的物體的能力。因為網(wǎng)絡(luò)越深,特征圖就會越小,所以網(wǎng)絡(luò)越深小的物體也就越難檢測出來。 在實際的feature map中,隨著網(wǎng)絡(luò)深度的加深,淺層的feature map中主要包含低級的信息(物體邊緣,顏色,初級位置信息等),深層的feature map中包含高等信息(例如物體的語義信息:狗,貓,汽車等等)。因此在不同級別的feature map對應(yīng)不同的scale,所以我們可以在不同級別的特征圖中進行目標檢測。如下圖展示了多種scale變換的經(jīng)典方法。 (a) 這種方法首先建立圖像金字塔,不同尺度的金字塔圖像被輸入到對應(yīng)的網(wǎng)絡(luò)當中,用于不同scale物體的檢測。但這樣做的結(jié)果就是每個級別的金字塔都需要進行一次處理,速度很慢。 (b) 檢測只在最后一層feature map階段進行,這個結(jié)構(gòu)無法檢測不同大小的物體 ? 對不同深度的feature map分別進行目標檢測。SSD中采用的便是這樣的結(jié)構(gòu)。這樣小的物體會在淺層的feature map中被檢測出來,而大的物體會在深層的feature map被檢測出來,從而達到對應(yīng)不同scale的物體的目的,缺點是每一個feature map獲得的信息僅來源于之前的層,之后的層的特征信息無法獲取并加以利用。 (d) 與?很接近,但不同的是,當前層的feature map會對未來層的feature map進行上采樣,并加以利用。因為有了這樣一個結(jié)構(gòu),當前的feature map就可以獲得“未來”層的信息,這樣的話低階特征與高階特征就有機融合起來了,提升檢測精度。在YOLOv3中,就是采用這種方式來實現(xiàn)目標多尺度的變換的。 3.3網(wǎng)絡(luò)模型結(jié)構(gòu)在基本的圖像特征提取方面,YOLO3采用了Darknet-53的網(wǎng)絡(luò)結(jié)構(gòu)(含有53個卷積層),它借鑒了殘差網(wǎng)絡(luò)ResNet的做法,在層之間設(shè)置了shortcut,來解決深層網(wǎng)絡(luò)梯度的問題,shortcut如下圖所示:包含兩個卷積層和一個shortcut connections。 yoloV3的模型結(jié)構(gòu)如下所示:整個v3結(jié)構(gòu)里面,沒有池化層和全連接層,網(wǎng)絡(luò)的下采樣是通過設(shè)置卷積的stride為2來達到的,每當通過這個卷積層之后圖像的尺寸就會減小到一半。 ![ 下面我們看下網(wǎng)絡(luò)結(jié)構(gòu):
1、CBL:Yolov3網(wǎng)絡(luò)結(jié)構(gòu)中的最小組件,由Conv+Bn+Leaky_relu激活函數(shù)三者組成。 2、Res unit:借鑒Resnet網(wǎng)絡(luò)中的殘差結(jié)構(gòu),讓網(wǎng)絡(luò)可以構(gòu)建的更深。 3、ResX:由一個CBL和X個殘差組件構(gòu)成,是Yolov3中的大組件。每個Res模塊前面的CBL都起到下采樣的作用,因此經(jīng)過5次Res模塊后,得到的特征圖是416->208->104->52->26->13大小。
1、Concat:張量拼接,會擴充兩個張量的維度,例如26×26×256和26×26×512兩個張量拼接,結(jié)果是26×26×768。 2、Add:張量相加,張量直接相加,不會擴充維度,例如104×104×128和104×104×128相加,結(jié)果還是104×104×128。
每個ResX中包含1+2×X個卷積層,因此整個主干網(wǎng)絡(luò)Backbone中一共包含1+(1+2×1)+(1+2×2)+(1+2×8)+(1+2×8)+(1+2×4)=52,再加上一個FC全連接層,即可以組成一個Darknet53分類網(wǎng)絡(luò)。不過在目標檢測Yolov3中,去掉FC層,仍然把Yolov3的主干網(wǎng)絡(luò)叫做Darknet53結(jié)構(gòu)。 3.4先驗框yoloV3采用K-means聚類得到先驗框的尺寸,為每種尺度設(shè)定3種先驗框,總共聚類出9種尺寸的先驗框。 在COCO數(shù)據(jù)集這9個先驗框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。在最小的(13x13)特征圖上(有最大的感受野)應(yīng)用較大的先驗框(116x90),(156x198),(373x326),適合檢測較大的對象。中等的(26x26)特征圖上(中等感受野)應(yīng)用中等的先驗框(30x61),(62x45),(59x119),適合檢測中等大小的對象。較大的(52x52)特征圖上(較小的感受野)應(yīng)用,其中較小的先驗框(10x13),(16x30),(33x23),適合檢測較小的對象。 直觀上感受9種先驗框的尺寸,下圖中藍色框為聚類得到的先驗框。黃色框式ground truth,紅框是對象中心點所在的網(wǎng)格。 3.5 logistic回歸預(yù)測對象類別時不使用softmax,而是被替換為一個1x1的卷積層+logistic激活函數(shù)的結(jié)構(gòu)。使用softmax層的時候其實已經(jīng)假設(shè)每個輸出僅對應(yīng)某一個單個的class,但是在某些class存在重疊情況(例如woman和person)的數(shù)據(jù)集中,使用softmax就不能使網(wǎng)絡(luò)對數(shù)據(jù)進行很好的預(yù)測。 3.6 yoloV3模型的輸入與輸出YoloV3的輸入輸出形式如下圖所示: 輸入416×416×3的圖像,通過darknet網(wǎng)絡(luò)得到三種不同尺度的預(yù)測結(jié)果,每個尺度都對應(yīng)N個通道,包含著預(yù)測的信息; 每個網(wǎng)格每個尺寸的anchors的預(yù)測結(jié)果。 YOLOv3共有13×13×3 + 26×26×3 + 52×52×3個預(yù)測 。每個預(yù)測對應(yīng)85維,分別是4(坐標值)、1(置信度分數(shù))、80(coco類別概率)。 4.yoloV4[了解]YOLO之父在2020年初宣布退出CV界,YOLOv4 的作者并不是YOLO系列 的原作者。YOLO V4是YOLO系列一個重大的更新,其在COCO數(shù)據(jù)集上的平均精度(AP)和幀率精度(FPS)分別提高了10% 和12%,并得到了Joseph Redmon的官方認可,被認為是當前最強的實時對象檢測模型之一。 yoloV4總結(jié)了大部分檢測技巧,然后經(jīng)過篩選,排列組合,挨個實驗(ablation study)哪些方法有效,總體來說,Yolov4并沒有創(chuàng)造新的改進,而是使用了大量的目標檢測的技巧。在這里我們主要給大家看下它的網(wǎng)絡(luò)架構(gòu): Yolov4的結(jié)構(gòu)圖和Yolov3是相似的,不過使用各種新的算法思想對各個子結(jié)構(gòu)都進行了改進。 先整理下Yolov4的結(jié)構(gòu)組件
注意: 網(wǎng)絡(luò)的輸入大小不是固定的,在yoloV3中輸入默認是416×416,在yoloV4中默認是608×608,在實際項目中也可以根據(jù)需要修改,比如320×320,一般是32的倍數(shù)。 輸入圖像的大小和最后的三個特征圖的大小也是對應(yīng)的,比如416×416的輸入,最后的三個特征圖大小是13×13,26×26,52×52, 如果是608×608,最后的三個特征圖大小則是19×19,38×38,76×76。 |
|
來自: 行走在理想邊緣 > 《機器學(xué)習》