Ⅰ yolo演算法是什麼
Yolo是一種目標檢測演算法。
目標檢測的任務是從圖片中找出物體並給出其類別和位置,對於單張圖片,輸出為圖片中包含的N個物體的每個物體的中心位置(x,y)、寬(w)、高(h)以及其類別。
Yolo的預測基於整個圖片,一次性輸出所有檢測到的目標信號,包括其類別和位置。Yolo首先將圖片分割為sxs個相同大小的grid。
介紹
Yolo只要求grid中識別的物體的中心必須在這個grid內(具體來說,若某個目標的中心點位於一個grid內,該grid輸出該目標類別的概率為1,所有其他grid對該目標預測概率設置為0)。
實現方法:讓sxs個框每個都預測出B個boungding box,bounding box有5個量,分別為物體的x,y,h,w和預測的置信度;每個grid預測B個bounding box和物體類別,類別使用one-hot表示。
Ⅱ YOLO 目標檢測實戰項目『原理篇』
在目標檢測中,IoU 為預測框 (Prediction) 和真實框 (Ground truth) 的交並比。如下圖所示,在關於小貓的目標檢測中,紫線邊框為預測框 (Prediction),紅線邊框為真實框 (Ground truth)。
在目標檢測任務中,通常取 IoU≥0.5,認為召回。如果 IoU 閾值設置更高,召回率將會降低,但定位框則更加精確。
理想的情況,當然是預測框與真實框重疊越多越好,如果兩者完全重疊,則交集與並集面積相同,此時 IoU 等於 1。
之前的目標檢測方法需要先產生候選區再檢測的方法雖然有相對較高的檢測准確率,但運行速度較慢。
YOLO 將識別與定位合二為一,結構簡便,檢測速度快,更快的 Fast YOLO 可以達到 155FPS。
YOLO 網路借鑒了 GoogLeNet 分類網路結構,不同的是 YOLO 使用 1x1 卷積層和 3x3 卷積層替代 inception mole。如下圖所示,整個檢測網路包括 24 個卷積層和 2 個全連接層。其中,卷積層用來提取圖像特徵,全連接層用來預測圖像位置和類別概率值。
如上圖所示,損失函數分為坐標預測(藍色框)、含有物體的邊界框的 confidence 預測(紅色框)、不含有物體的邊界框的 confidence 預測(黃色框)、分類預測(紫色框)四個部分。
由於不同大小的邊界框對預測偏差的敏感度不同,小的邊界框對預測偏差的敏感度更大。為了均衡不同尺寸邊界框對預測偏差的敏感度的差異。作者巧妙的對邊界框的 w,h 取均值再求 L2 loss. YOLO 中更重視坐標預測,賦予坐標損失更大的權重,記為 coord,在 pascal voc 訓練中 coodd=5 ,classification error 部分的權重取 1。
某邊界框的置信度定義為:某邊界框的 confidence = 該邊界框存在某類對象的概率 pr (object)* 該邊界框與該對象的 ground truth 的 IOU 值 ,若該邊界框存在某個對象 pr (object)=1 ,否則 pr (object)=0 。由於一幅圖中大部分網格中是沒有物體的,這些網格中的邊界框的 confidence 置為 0,相比於有物體的網格,這些不包含物體的網格更多,對梯度更新的貢獻更大,會導致網路不穩定。為了平衡上述問題,YOLO 損失函數中對沒有物體的邊界框的 confidence error 賦予較小的權重,記為 noobj,對有物體的邊界框的 confidence error 賦予較大的權重。在 pascal VOC 訓練中 noobj=0.5 ,有物體的邊界框的 confidence error 的權重設為 1.
YOLOv1 雖然檢測速度快,但在定位方面不夠准確,並且召回率較低。為了提升定位準確度,改善召回率,YOLOv2 在 YOLOv1 的基礎上提出了幾種改進策略
YOLOv2 中在每個卷積層後加 Batch Normalization (BN) 層,去掉 dropout. BN 層可以起到一定的正則化效果,能提升模型收斂速度,防止模型過擬合。YOLOv2 通過使用 BN 層使得 mAP 提高了 2%。
目前的大部分檢測模型都會使用主流分類網路(如 vgg、resnet)在 ImageNet 上的預訓練模型作為特徵提取器,而這些分類網路大部分都是以小於 256x256 的圖片作為輸入進行訓練的,低解析度會影響模型檢測能力。YOLOv2 將輸入圖片的解析度提升至 448x448,為了使網路適應新的解析度,YOLOv2 先在 ImageNet 上以 448x448 的解析度對網路進行 10 個 epoch 的微調,讓網路適應高解析度的輸入。通過使用高解析度的輸入,YOLOv2 的 mAP 提升了約 4%。
YOLOv1 利用全連接層直接對邊界框進行預測,導致丟失較多空間信息,定位不準。YOLOv2 去掉了 YOLOv1 中的全連接層,使用 Anchor Boxes 預測邊界框,同時為了得到更高解析度的特徵圖,YOLOv2 還去掉了一個池化層。由於圖片中的物體都傾向於出現在圖片的中心位置,若特徵圖恰好有一個中心位置,利用這個中心位置預測中心點落入該位置的物體,對這些物體的檢測會更容易。所以總希望得到的特徵圖的寬高都為奇數。YOLOv2 通過縮減網路,使用 416x416 的輸入,模型下采樣的總步長為 32,最後得到 13x13 的特徵圖, 然後對 13x13 的特徵圖的每個 cell 預測 5 個 anchor boxes ,對每個 anchor box 預測邊界框的位置信息、置信度和一套分類概率值。使用 anchor boxes 之後,YOLOv2 可以預測 13x13x5=845 個邊界框,模型的召回率由原來的 81% 提升到 88%,mAP 由原來的 69.5% 降低到 69.2%. 召回率提升了 7%,准確率下降了 0.3%。
YOLOv2 採用 Darknet-19,其網路結構如下圖所示,包括 19 個卷積層和 5 個 max pooling 層,主要採用 3x3 卷積和 1x1 卷積, 這里 1x1 卷積可以壓縮特徵圖通道數以降低模型計算量和參數 ,每個卷積層後使用 BN 層 以加快模型收斂同時防止過擬合。最終採用 global avg pool 做預測。採用 YOLOv2,模型的 mAP 值沒有顯著提升,但計算量減少了。
在 Faster R-CNN 和 SSD 中,先驗框都是手動設定的,帶有一定的主觀性。YOLOv2 採用 k-means 聚類演算法對訓練集中的邊界框做了聚類分析,選用 boxes 之間的 IOU 值作為聚類指標。綜合考慮模型復雜度和召回率,最終選擇 5 個聚類中心,得到 5 個先驗框,發現其中中扁長的框較少,而瘦高的框更多,更符合行人特徵。通過對比實驗,發現用聚類分析得到的先驗框比手動選擇的先驗框有更高的平均 IOU 值,這使得模型更容易訓練學習。
Faster R-CNN 使用 anchor boxes 預測邊界框相對先驗框的偏移量,由於沒有對偏移量進行約束,每個位置預測的邊界框可以落在圖片任何位置,會導致模型不穩定,加長訓練時間。YOLOv2 沿用 YOLOv1 的方法,根據所在網格單元的位置來預測坐標,則 Ground Truth 的值介於 0 到 1 之間。網路中將得到的網路預測結果再輸入 sigmoid 函數中,讓輸出結果介於 0 到 1 之間。設一個網格相對於圖片左上角的偏移量是 cx,cy。先驗框的寬度和高度分別是 pw 和 ph,則預測的邊界框相對於特徵圖的中心坐標 (bx,by) 和寬高 bw、bh 的計算公式如下圖所示。
YOLOv2 結合 Dimention Clusters, 通過對邊界框的位置預測進行約束,使模型更容易穩定訓練,這種方式使得模型的 mAP 值提升了約 5%。
YOLOv2 借鑒 SSD 使用多尺度的特徵圖做檢測,提出 pass through 層將高解析度的特徵圖與低解析度的特徵圖聯系在一起,從而實現多尺度檢測。YOLOv2 提取 Darknet-19 最後一個 max pool 層的輸入,得到 26x26x512 的特徵圖。經過 1x1x64 的卷積以降低特徵圖的維度,得到 26x26x64 的特徵圖,然後經過 pass through 層的處理變成 13x13x256 的特徵圖(抽取原特徵圖每個 2x2 的局部區域組成新的 channel,即原特徵圖大小降低 4 倍,channel 增加 4 倍),再與 13x13x1024 大小的特徵圖連接,變成 13x13x1280 的特徵圖,最後在這些特徵圖上做預測。使用 Fine-Grained Features,YOLOv2 的性能提升了 1%.
YOLOv2 中使用的 Darknet-19 網路結構中只有卷積層和池化層,所以其對輸入圖片的大小沒有限制。YOLOv2 採用多尺度輸入的方式訓練,在訓練過程中每隔 10 個 batches , 重新隨機選擇輸入圖片的尺寸,由於 Darknet-19 下采樣總步長為 32,輸入圖片的尺寸一般選擇 32 的倍數 {320,352,…,608}。採用 Multi-Scale Training, 可以適應不同大小的圖片輸入,** 當採用低解析度的圖片輸入時,mAP 值略有下降,但速度更快,當採用高解析度的圖片輸入時,能得到較高 mAP 值,但速度有所下降。**
YOLOv2 借鑒了很多其它目標檢測方法的一些技巧,如 Faster R-CNN 的 anchor boxes, SSD 中的多尺度檢測。除此之外,YOLOv2 在網路設計上做了很多 tricks, 使它能在保證速度的同時提高檢測准確率,Multi-Scale Training 更使得同一個模型適應不同大小的輸入,從而可以在速度和精度上進行自由權衡。
YOLO v2 對 YOLO v1 的缺陷進行優化,大幅度高了檢測的性能,但仍存在一定的問題, 如無法解決重疊問題的分類等 。
將 256x256 的圖片分別輸入以 Darknet-19,ResNet-101,ResNet-152 和 Darknet-53 為基礎網路的分類模型中,實驗得到的結果如下圖所示。可以看到 Darknet-53 比 ResNet-101 的性能更好,而且速度是其 1.5 倍,Darknet-53 與 ResNet-152 性能相似但速度幾乎是其 2 倍。注意到,Darknet-53 相比於其它網路結構實現了每秒最高的浮點計算量,說明其網路結構能更好的利用 GPU。
YOLOv3 借鑒了 FPN 的思想,從不同尺度提取特徵。相比 YOLOv2,YOLOv3 提取最後 3 層特徵圖,不僅在每個特徵圖上分別獨立做預測,同時通過將小特徵圖上采樣到與大的特徵圖相同大小,然後與大的特徵圖拼接做進一步預測。用維度聚類的思想聚類出 9 種尺度的 anchor box,將 9 種尺度的 anchor box 均勻的分配給 3 種尺度的特徵圖 .
在實際應用場合中,一個物體有可能輸入多個類別,單純的單標簽分類在實際場景中存在一定的限制。舉例來說,一輛車它既可以屬於 car(小汽車)類別,也可以屬於 vehicle(交通工具),用單標簽分類只能得到一個類別。因此在 YOLO v3 在網路結構中把原先的 softmax 層換成了邏輯回歸層,從而實現把單標簽分類改成多標簽分類。用多個 logistic 分類器代替 softmax 並不會降低准確率,可以維持 YOLO 的檢測精度不下降。
對於對象檢測,不僅要考慮精度,還要考慮實時運行的性能,雖然現在算力大幅度上升,但是普通的設備跑起來還是有點吃力。提高精度和加快速率仍是目標檢測的重大課題,道阻且長!
參考:
YOLOv1 參考
YOLOv2 參考
YOLOv3 參考
https://mp.weixin.qq.com/s/yccBloK5pOVxDIFkmoY7xg :非極大抑制
Ⅲ 【目標檢測】YOLO論文詳解(You Only Look Once: Unified, Real-Time Object Detection)
論文原文: https://arxiv.org/abs/1506.02640
YOLO(you only look once)是繼RCNN、faster-RCNN之後,又一里程碑式的目標檢測演算法。yolo在保持不錯的准確度的情況下,解決了當時基於深度學習的檢測中的痛點---速度問題。下圖是各目標檢測系統的檢測性能對比:
如果說faster-RCNN是真正實現了完全基於深度學習的端到端的檢測,那麼yolo則是更進一步,將 目標區域預測 與 目標類別判斷 整合到單個神經網路模型中。各檢測演算法結構見下圖:
每個網格要預測B個bounding box,每個bounding box除了要回歸自身的位置之外,還要附帶預測一個confidence值。這個confidence代表了所預測的box中含有object的置信度和這個box預測的有多准兩重信息,其值是這樣計算的:
其中如果有object落在一個grid cell里,第一項取1,否則取0。第二項是預測的bounding box和實際的groundtruth之間的IoU值。
每個bounding box要預測(x, y, w, h)和confidence共5個值,每個網格還要預測一個類別信息,記為C類。即SxS個網格,每個網格除了要預測B個bounding box外,還要預測C個categories。輸出就是S x S x (5*B+C)的一個tensor。(注意:class信息是針對每個網格的,即一個網格只預測一組類別而不管裡面有多少個bounding box,而confidence信息是針對每個bounding box的。)
舉例說明: 在PASCAL VOC中,圖像輸入為448x448,取S=7,B=2,一共有20個類別(C=20)。則輸出就是7x7x30的一個tensor。整個網路結構如下圖所示:
在test的時候,每個網格預測的class信息和bounding box預測的confidence信息相乘,就得到每個bounding box的class-specific confidence score:
等式左邊第一項就是每個網格預測的類別信息,第二三項就是每個bounding box預測的confidence。這個乘積即encode了預測的box屬於某一類的概率,也有該box准確度的信息。
得到每個box的class-specific confidence score以後,設置閾值,濾掉得分低的boxes,對保留的boxes進行NMS(非極大值抑制non-maximum suppresssion)處理,就得到最終的檢測結果。
1、每個grid因為預測兩個bounding box有30維(30=2*5+20),這30維中,8維是回歸box的坐標,2維是box的confidence,還有20維是類別。其中坐標的x,y用bounding box相對grid的offset歸一化到0-1之間,w,h除以圖像的width和height也歸一化到0-1之間。
2、對不同大小的box預測中,相比於大box預測偏一點,小box預測偏一點肯定更不能被忍受的。而sum-square error loss中對同樣的偏移loss是一樣。為了緩和這個問題,作者用了一個比較取巧的辦法,就是將box的width和height取平方根代替原本的height和width。這個參考下面的圖很容易理解,小box的橫軸值較小,發生偏移時,反應到y軸上相比大box要大。其實就是讓演算法對小box預測的偏移更加敏感。
3、一個網格預測多個box,希望的是每個box predictor專門負責預測某個object。具體做法就是看當前預測的box與ground truth box中哪個IoU大,就負責哪個。這種做法稱作box predictor的specialization。
4、損失函數公式見下圖:
在實現中,最主要的就是怎麼設計損失函數,坐標(x,y,w,h),confidence,classification 讓這個三個方面得到很好的平衡。簡單的全部採用sum-squared error loss來做這件事會有以下不足:
解決方法:
只有當某個網格中有object的時候才對classification error進行懲罰。只有當某個box predictor對某個ground truth box負責的時候,才會對box的coordinate error進行懲罰,而對哪個ground truth box負責就看其預測值和ground truth box的IoU是不是在那個cell的所有box中最大。
作者採用ImageNet 1000-class 數據集來預訓練卷積層。預訓練階段,採用網路中的前20卷積層,外加average-pooling層和全連接層。模型訓練了一周,獲得了top-5 accuracy為0.88(ImageNet2012 validation set),與GoogleNet模型准確率相當。
然後,將模型轉換為檢測模型。作者向預訓練模型中加入了4個卷積層和兩層全連接層,提高了模型輸入解析度(224×224->448×448)。頂層預測類別概率和bounding box協調值。bounding box的寬和高通過輸入圖像寬和高歸一化到0-1區間。頂層採用linear activation,其它層使用 leaky rectified linear。
作者採用sum-squared error為目標函數來優化,增加bounding box loss權重,減少置信度權重,實驗中,設定為lambda _{coord} =5 andlambda _{noobj}=0.5 。
作者在PASCAL VOC2007和PASCAL VOC2012數據集上進行了訓練和測試。訓練135輪,batch size為64,動量為0.9,學習速率延遲為0.0005。Learning schele為:第一輪,學習速率從0.001緩慢增加到0.01(因為如果初始為高學習速率,會導致模型發散);保持0.01速率到75輪;然後在後30輪中,下降到0.001;最後30輪,學習速率為0.0001。
作者還採用了dropout和 data augmentation來預防過擬合。dropout值為0.5;data augmentation包括:random scaling,translation,adjust exposure和saturation。
YOLO模型相對於之前的物體檢測方法有多個優點:
1、 YOLO檢測物體非常快
因為沒有復雜的檢測流程,只需要將圖像輸入到神經網路就可以得到檢測結果,YOLO可以非常快的完成物體檢測任務。標准版本的YOLO在Titan X 的 GPU 上能達到45 FPS。更快的Fast YOLO檢測速度可以達到155 FPS。而且,YOLO的mAP是之前其他實時物體檢測系統的兩倍以上。
2、 YOLO可以很好的避免背景錯誤,產生false positives
不像其他物體檢測系統使用了滑窗或region proposal,分類器只能得到圖像的局部信息。YOLO在訓練和測試時都能夠看到一整張圖像的信息,因此YOLO在檢測物體時能很好的利用上下文信息,從而不容易在背景上預測出錯誤的物體信息。和Fast-R-CNN相比,YOLO的背景錯誤不到Fast-R-CNN的一半。
3、 YOLO可以學到物體的泛化特徵
當YOLO在自然圖像上做訓練,在藝術作品上做測試時,YOLO表現的性能比DPM、R-CNN等之前的物體檢測系統要好很多。因為YOLO可以學習到高度泛化的特徵,從而遷移到其他領域。
盡管YOLO有這些優點,它也有一些缺點:
1、YOLO的物體檢測精度低於其他state-of-the-art的物體檢測系統。
2、YOLO容易產生物體的定位錯誤。
3、YOLO對小物體的檢測效果不好(尤其是密集的小物體,因為一個柵格只能預測2個物體)。
Ⅳ 目標檢測-YOLOv3
傳統的目標檢測演算法適用的場景有限,而且維護成本很大。深度學習方法應用於目標檢測,不僅演算法適應性好,還可以進行遷移學習,降低成本。
深度學習目標檢測演算法中,基於錨框(Anchor)的方法主要分為 一階段 方法和 兩階段 方法。
兩階段 方法先對感興趣的區域進行選擇,然後進一步對候選框內做分類和回歸,最終輸出選擇的框以及對應的分類。兩階段的模型有R-CNN系列,比如 R-CNN,Fast-RCNN,Faster-RCNN 等。兩階段模型的優點是精度高,但是速度及較慢。
一階段 方法直接對anchor進行回歸和分類,得到最終目標框和類別,演算法有 YOLOv2,v3,SSD,RetinaNet 等。一階段模型的推理速度較快,但是相對的精度會下降一些。
此外還有一些 anchor-free 的方法,包括基於關鍵點的檢測演算法以及基於中心檢測演算法等。
下面是一些基礎概念和縮寫:
BBox :Bounding Box 邊界框
Anchor :錨框
RoI : Region of Interest 特定的感興趣區域
Region Proposal : 候選區域
RPN : Region proposal network 提取候選區域的網路
IoU : Intersaction over Union (Area of Overlap/ Area of Union) 交並比,預測框的質量
mAP :mean average precision
NMS :non-maximum suppression 非極大值抑制
YOLO系列的模型在保有一定精度的基礎上擁有很快的推理速度,在下面圖中YOLOv3的推理速度遠超其他模型,因此在實時監測領域中有很好的應用。
YOLO的名字來源於you only look once,從名字上就道出了YOLO的精髓。
YOLOv1將圖像劃分為S*S個網路,物體真實框的中心落在哪個網格上,哪個網格對應的錨框就負責檢測物體。
每個網格會預測一個邊界框以及對應的置信度,這里的置信度反映的是模型認為這個框里包含著物體的把握以及它預測到這個物體的精確程度。所以置信度就等於 。如果物體不存在,那麼置信度應該等於零。
每個邊界框會預測5個值 。(x,y)坐標表示框相對於網格單元邊界的中心。 w,y是相對於整個圖像預測寬度和高度。 最後,置信度預測表示預測框與任何真實框之間的IOU。
YOLOv2在v1的基礎上進行了優化,骨幹網路使用了DarkNet19,並且將輸入圖片給尺寸從224增大到448,並且將網路結構設為全卷積網路結構加上Batch Norm,使用了Kmeans聚類方法來計算anchor,引入了多尺度訓練,使網路在訓練過程中學習不同尺度的圖像。不過待改進的地方有在小目標上召回率不高,靠近的群體目標檢測效果不好,檢測精度還有優化空間。
YOLOv3使用了更加深的骨幹網路DarkNet53,同時加入了多尺度預測,在COCO數據集上聚類; 9中不同尺度的anchor,在分類上使用sigmoid激活函數,支持了目標的多分類。YOLOv3的優點是推理速度快,性價比高,通用性強;缺點是召回率較低,定位精度較差,對於靠近或者遮擋的群體、小物體的檢測能力相對較弱。
YOLOv3在v1的基礎上做了很多改動。
邊界框預測
YOLOv3使用聚類預測到的邊界框作為錨框。網路為邊界框預測4個坐標值 ,如果單元格從圖像的左上角偏移了 ,並且先驗邊界框的寬度和高度為 ,則預測如下圖:
YOLOv3給每個邊界框用邏輯回歸預測一個objectness score,如果某個邊界框和真實框重合度比其他都高,那麼它的objectness score應該是1。而其他框雖然也與真實框有重疊,會被忽略掉。
類別預測
使用的是sigmoid函數,沒有用softmax因為沒必要。
不同尺度的預測
YOLOv3使用k-means聚類來確定bounding box priors,選擇了9個clusters和3個scales,然後在整個scales上均勻分割clusters。在COCO數據集上,9個cluster分別為(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90) ,(156×198),(373×326)。
特徵提取
YOLOv3使用了Darknet-53,特點是加入了殘差,比之前的網路更深了(有53層卷積層所以叫Darknet-53)。
借一張圖看一下YOLOv3的整個流程:
每個輸出分支上對應著三個尺寸的先驗框(總共3 3=9種尺度)。經過32倍下采樣的網格,每一個網格對應著輸入圖像上32 32的區域,適合檢測尺寸較大的目標,而8倍下采樣的網格適合檢測尺寸小的目標。
輸出特徵的高度H和寬度W,相當於將圖像劃分為H*W個網格,而不是直接在圖像上畫網格。也就是說32倍下采樣之後得到的 ,相當於在輸入圖像上劃一個 的網格,每一個網格對應著輸出特徵圖上的一個點。
特徵圖的C通道上表示預測框的信息,包括坐標信息 ,目標置信度,分類。
C=B*(1+4+class_num),B為特徵圖上分配的錨框個數。
損失函數有三個,分類損失,定位損失和objectness損失。分類使用sigmoid激活函數,loss是sigmoid cross entropy。定位損失在x,y上使用sigmoid函數和sigmoid cross entropy損失,在w,h上使用L1損失。objectness損失用的是sigmoid激活函數和sigmoid cross entropy損失。
對於與真實框重疊的框,三種損失都要計算
對於沒有真實框重疊的框,只計算objectness(0);對於與真實框重疊但不是最匹配的框,忽略它們。
Ⅳ 【目標檢測演算法解讀】yolo系列演算法二
https://blog.csdn.net/Gentleman_Qin/article/details/84349144
|聲明:遵循CC 4.0 BY-SA版權協議
建立在YOLOv1的基礎上,經過Joseph Redmon等的改進,YOLOv2和YOLO9000演算法在2017年CVPR上被提出,並獲得最佳論文提名,重點解決YOLOv1召回率和定位精度方面的誤差。在提出時,YOLOv2在多種監測數據集中都要快過其他檢測系統,並可以在速度與精確度上進行權衡。
YOLOv2採用Darknet-19作為特徵提取網路,增加了批量標准化(Batch Normalization)的預處理,並使用224×224和448×448兩階段訓練ImageNet,得到預訓練模型後fine-tuning。
相比於YOLOv1是利用FC層直接預測Bounding Box的坐標,YOLOv2借鑒了FSR-CNN的思想,引入Anchor機制,利用K-Means聚類的方式在訓練集中聚類計算出更好的Anchor模板,在卷積層使用Anchor Boxes操作,增加Region Proposal的預測,同時採用較強約束的定位方法,大大提高演算法召回率。同時結合圖像細粒度特徵,將淺層特徵與深層特徵相連,有助於對小尺寸目標的檢測。
下圖所示是YOLOv2採取的各項改進帶了的檢測性能上的提升:
YOLO9000 的主要檢測網路也是YOLO v2,同時使用WordTree來混合來自不同的資源的訓練數據,並使用聯合優化技術同時在ImageNet和COCO數據集上進行訓練,目的是利用數量較大的分類數據集來幫助訓練檢測模型,因此,YOLO 9000的網路結構允許實時地檢測超過9000種物體分類,進一步縮小了檢測數據集與分類數據集之間的大小代溝。
下面將具體分析YOLOv2的各個創新點:
BN概述:
對數據進行預處理(統一格式、均衡化、去噪等)能夠大大提高訓練速度,提升訓練效果。BN正是基於這個假設的實踐,對每一層輸入的數據進行加工。
BN是2015年Google研究員在論文《Batch Normalization: Accelerating Deep Network Training by Recing Internal Covariate Shift》一文中提出的,同時也將BN應用到了2014年的GoogLeNet上,也就是Inception-v2。
BN層簡單講就是對網路的每一層的輸入都做了歸一化,這樣網路就不需要每層都去學數據的分布,收斂會更快。YOLOv1演算法(採用的是GoogleNet網路提取特徵)是沒有BN層的,而在YOLOv2中作者為每個卷積層都添加了BN層。
使用BN對網路進行優化,讓網路提高了收斂性,同時還消除了對其他形式的正則化(regularization)的依賴,因此使用BN後可以從模型中去掉Dropout,而不會產生過擬合。
BN優點:
神經網路每層輸入的分布總是發生變化,加入BN,通過標准化上層輸出,均衡輸入數據分布,加快訓練速度,因此可以設置較大的學習率(Learning Rate)和衰減(Decay);
通過標准化輸入,降低激活函數(Activation Function)在特定輸入區間達到飽和狀態的概率,避免梯度彌散(Gradient Vanishing)問題;
輸入標准化對應樣本正則化,BN在一定程度上可以替代 Dropout解決過擬合問題。
BN演算法:
在卷積或池化之後,激活函數之前,對每個數據輸出進行標准化,方式如下圖所示:
公式很簡單,前三行是 Batch內數據歸一化(假設一個Batch中有每個數據),同一Batch內數據近似代表了整體訓練數據。第四行引入了附加參數 γ 和 β,此二者的取值演算法可以參考BN論文,在此不再贅述。
fine-tuning:用已經訓練好的模型,加上自己的數據集,來訓練新的模型。即使用別人的模型的前幾層,來提取淺層特徵,而非完全重新訓練模型,從而提高效率。一般新訓練模型准確率都會從很低的值開始慢慢上升,但是fine-tuning能夠讓我們在比較少的迭代次數之後得到一個比較好的效果。
YOLO模型分為兩部分,分類模型和檢測模型,前者使用在ImageNet上預訓練好的模型,後者在檢測數據集上fine-tuning。
YOLOv1在預訓練時採用的是224*224的輸入(在ImageNet數據集上進行),然後在檢測的時候採用448*448的輸入,這會導致從分類模型切換到檢測模型的時候,模型還要適應圖像解析度的改變。
YOLOv2則將預訓練分成兩步:先用224*224的輸入在ImageNet數據集訓練分類網路,大概160個epoch(將所有訓練數據循環跑160次)後將輸入調整到448*448,再訓練10個epoch(這兩步都是在ImageNet數據集上操作)。然後利用預訓練得到的模型在檢測數據集上fine-tuning。這樣訓練得到的模型,在檢測時用448*448的圖像作為輸入可以順利檢測。
YOLOv1將輸入圖像分成7*7的網格,每個網格預測2個Bounding Box,因此一共有98個Box,同時YOLOv1包含有全連接層,從而能直接預測Bounding Boxes的坐標值,但也導致丟失較多的空間信息,定位不準。
YOLOv2首先將YOLOv1網路的FC層和最後一個Pooling層去掉,使得最後的卷積層可以有更高解析度的特徵,然後縮減網路,用416*416大小的輸入代替原來的448*448,使得網路輸出的特徵圖有奇數大小的寬和高,進而使得每個特徵圖在劃分單元格(Cell)的時候只有一個中心單元格(Center Cell)。
為什麼希望只有一個中心單元格呢?由於圖片中的物體都傾向於出現在圖片的中心位置,特別是比較大的物體,所以有一個單元格單獨位於物體中心的位置用於預測這些物體。
YOLOv2通過引入Anchor Boxes,通過預測Anchor Box的偏移值與置信度,而不是直接預測坐標值。YOLOv2的卷積層採用32這個值來下采樣圖片,所以通過選擇416*416用作輸入尺寸最終能輸出一個13*13的特徵圖。若採用FSRCNN中的方式,每個Cell可預測出9個Anchor Box,共13*13*9=1521個(YOLOv2確定Anchor Boxes的方法見是維度聚類,每個Cell選擇5個Anchor Box)。
在FSRCNN中,以一個51*39大小的特徵圖為例,其可以看做一個尺度為51*39的圖像,對於該圖像的每一個位置,考慮9個可能的候選窗口:3種面積3種比例。這些候選窗口稱為Anchor Boxes。下圖示出的是51*39個Anchor Box中心,以及9種Anchor Box示例。
YOLOv1和YOLOv2特徵圖數據結構:
YOLOv1:S*S* (B*5 + C) => 7*7(2*5+20)
其中B對應Box數量,5對應邊界框的定位信息(w,y,w,h)和邊界框置信度(Confidience)。解析度是7*7,每個Cell預測2個Box,這2個Box共用1套條件類別概率(1*20)。
YOLOv2:S*S*K* (5 + C) => 13*13*9(5+20)
解析度提升至13*13,對小目標適應性更好,借鑒了FSRCNN的思想,每個Cell對應K個Anchor box(YOLOv2中K=5),每個Anchor box對應1組條件類別概率(1*20)。
聚類:聚類是指事先沒有「標簽」而通過某種成團分析找出事物之間存在聚集性原因的過程。即在沒有劃分類別的情況下,根據數據相似度進行樣本分組。
在FSR-CNN中Anchor Box的大小和比例是按經驗設定的,然後網路會在訓練過程中調整Anchor Box的尺寸,最終得到准確的Anchor Boxes。若一開始就選擇了更好的、更有代表性的先驗Anchor Boxes,那麼網路就更容易學到准確的預測位置。
YOLOv2使用K-means聚類方法類訓練Bounding Boxes,可以自動找到更好的寬高維度的值用於一開始的初始化。傳統的K-means聚類方法使用的是歐氏距離函數,意味著較大的Anchor Boxes會比較小的Anchor Boxes產生更多的錯誤,聚類結果可能會偏離。由於聚類目的是確定更精準的初始Anchor Box參數,即提高IOU值,這應與Box大小無關,因此YOLOv2採用IOU值為評判標准,即K-means 採用的距離函數(度量標准) 為:
d(box,centroid) = 1 - IOU(box,centroid)
如下圖,左邊是聚類的簇個數和IOU的關系,兩條曲線分別代表兩個不同的數據集。分析聚類結果並權衡模型復雜度與IOU值後,YOLOv2選擇K=5,即選擇了5種大小的Box 維度來進行定位預測。
其中紫色和灰色也是分別表示兩個不同的數據集,可以看出其基本形狀是類似的。更重要的是,可以看出聚類的結果和手動設置的Anchor Box位置和大小差別顯著——結果中扁長的框較少,而瘦高的框更多(更符合行人的特徵)。
YOLOv2採用的5種Anchor的Avg IOU是61,而採用9種Anchor Boxes的Faster RCNN的Avg IOU是60.9,也就是說本文僅選取5種box就能達到Faster RCNN的9中box的效果。選擇值為9的時候,AVG IOU更有顯著提高。說明K-means方法的生成的boxes更具有代表性。
直接對Bounding Boxes求回歸會導致模型不穩定,其中心點可能會出現在圖像任何位置,有可能導致回歸過程震盪,甚至無法收斂,尤其是在最開始的幾次迭代的時候。大多數不穩定因素產生自預測Bounding Box的中心坐標(x,y)位置的時候。
YOLOv2的網路在特徵圖(13*13)的每一個單元格中預測出5個Bounding Boxes(對應5個Anchor Boxes),每個Bounding Box預測出5個值(tx,ty,tw,th,t0),其中前4個是坐標偏移值,t0是置信度結果(類似YOLOv1中的邊界框置信度Confidence)。YOLOv2借鑒了如下的預測方式,即當Anchor Box的中心坐標和寬高分別是(xa,ya)和(wa,wh)時,Bounding Box坐標的預測偏移值(tx,ty,tw,th)與其坐標寬高(x,y,w,h)的關系如下:
tx = (x-xa)/wa
ty= (y-ya)/ha
tw = log(w/wa)
th = log(h/ha)
基於這種思想,YOLOv2在預測Bounding Box的位置參數時採用了如下強約束方法:
上圖中,黑色虛線框是Anchor Box,藍色矩形框就是預測的Bounding Box結果,預測出的Bounding Box的坐標和寬高為(bx,by)和(bw,bh),計算方式如圖中所示,其中:對每個Bounding Box預測出5個值(tx,ty,tw,th,t0),Cell與圖像左上角的橫縱坐標距離為(cx,cy),σ定義為sigmoid激活函數(將函數值約束到[0,1]),該Cell對應的Anchor Box對應的寬高為(pw,ph)。
簡而言之,(bx,by)就是(cx,cy)這個Cell附近的Anchor Box針對預測值(tx,ty)得到的Bounding Box的坐標預測結果,同時可以發現這種方式對於較遠距離的Bounding Box預測值(tx,ty)能夠得到很大的限制。
YOLOv2通過添加一個轉移層,把高解析度的淺層特徵連接到低解析度的深層特徵(把特徵堆積在不同Channel中)而後進行融合和檢測。具體操作是先獲取前層的26*26的特徵圖,將其同最後輸出的13*13的特徵圖進行連接,而後輸入檢測器進行檢測(檢測器的FC層起到了全局特徵融合的作用),以此來提高對小目標的檢測能力。
為了適應不同尺度下的檢測任務,YOLOv2在訓練網路時,其在檢測數據集上fine-tuning時候採用的輸入圖像的size是動態變化的。具體來講,每訓練10個Batch,網路就會隨機選擇另一種size的輸入圖像。因為YOLOv2用到了參數是32的下采樣,因此也採用32的倍數作為輸入的size,即採用{320,352,…,608}的輸入尺寸(網路會自動改變尺寸,並繼續訓練的過程)。
這一策略讓網路在不同的輸入尺寸上都能達到較好的預測效果,使同一網路能在不同解析度上進行檢測。輸入圖片較大時,檢測速度較慢,輸入圖片較小時,檢測速度較快,總體上提高了准確率,因此多尺度訓練算是在准確率和速度上達到一個平衡。
上表反映的是在檢測時,不同大小的輸入圖片情況下的YOLOv2和其他目標檢測演算法的對比。可以看出通過多尺度訓練的檢測模型,在測試的時候,輸入圖像在尺寸變化范圍較大的情況下也能取得mAP和FPS的平衡。
YOLOv1採用的訓練網路是GoogleNet,YOLOv2採用了新的分類網路Darknet-19作為基礎網路,它使用了較多的3*3卷積核,並把1*1的卷積核置於3*3的卷積核之間,用來壓縮特徵,同時在每一次池化操作後把通道(Channels)數翻倍(借鑒VGG網路)。
YOLOv1採用的GooleNet包含24個卷積層和2個全連接層,而Darknet-19包含19個卷積層和5個最大池化層(Max Pooling Layers),後面添加Average Pooling層(代替v1中FC層),而Softmax分類器作為激活被用在網路最後一層,用來進行分類和歸一化。
在ImageNet數據集上進行預訓練,主要分兩步(採用隨機梯度下降法):
輸入圖像大小是224*224,初始學習率(Learning Rate)為0.1,訓練160個epoch,權值衰減(Weight Decay)為0.0005,動量(Momentum)為0.9,同時在訓練時採用標準的數據增強(Data Augmentation)方式如隨機裁剪、旋轉以及色度、亮度的調整。
fine-tuning:第1步結束後,改用448*448輸入(高解析度模型),學習率改為0.001,訓練10個epoch,其他參數不變。結果表明:fine-tuning後的top-1准確率為76.5%,top-5准確率為93.3%,若按照原來的訓練方式,Darknet-19的top-1准確率是72.9%,top-5准確率為91.2%。可以看出,兩步分別從網路結構和訓練方式方面入手提高了網路分類准確率。
預訓練之後,開始基於檢測的數據集再進行fine-tuning。
首先,先把最後一個卷積層去掉,然後添加3個3*3的卷積層,每個卷積層有1024個卷積核,並且後面都連接一個1*1的卷積層,卷積核個數(特徵維度)根據需要檢測的類數量決定。(比如對VOC數據,每個Cell需要預測5個Boungding Box,每個Bounding Box有4個坐標值、1個置信度值和20個條件類別概率值,所以每個單元格對應125個數據,此時卷積核個數應該取125。)
然後,將最後一個3*3*512的卷積層和倒數第2個卷積層相連(提取細粒度特徵),最後在檢測數據集上fine-tuning預訓練模型160個epoch,學習率採用0.001,並且在第60和90個epoch的時候將學習率除以10,權值衰減、動量和數據增強方法與預訓練相同。
YOLO9000通過結合分類和檢測數據集,使得訓練得到的模型可以檢測約9000類物體,利用帶標注的分類數據集量比較大的特點,解決了帶標注的檢測數據集量比較少的問題。具體方法是:一方面採用WordTree融合數據集,另一方面聯合訓練分類數據集和檢測數據集。
分類數據集和檢測數據集存在較大差別:檢測數據集只有粗粒度的標記信息,如「貓」、「狗」,而分類數據集的標簽信息則更細粒度,更豐富。比如「狗」就包括「哈士奇」、「金毛狗」等等。所以如果想同時在檢測數據集與分類數據集上進行訓練,那麼就要用一種一致性的方法融合這些標簽信息。
用於分類的方法,常用Softmax(比如v2),Softmax意味著分類的類別之間要互相獨立的,而ImageNet和COCO這兩種數據集之間的分類信息不相互獨立(ImageNet對應分類有9000種,而COCO僅提供80種目標檢測),所以使用一種多標簽模型來混合數據集,即假定一張圖片可以有多個標簽,並且不要求標簽之間獨立,而後進行Softmax分類。
由於ImageNet的類別是從WordNet選取的,作者採用以下策略重建了一個樹形結構(稱為WordTree):
遍歷ImageNet的標簽,然後在WordNet中尋找該標簽到根節點(所有的根節點為實體對象)的路徑;
如果路徑只有一條,將該路徑直接加入到WordTree結構中;
否則,從可選路徑中選擇一條最短路徑,加入到WordTree結構中。
WordTree的作用就在於將兩種數據集按照層級進行結合。
如此,在WordTree的某個節點上就可以計算該節點的一些條件概率值,比如在terrier這個節點,可以得到如下條件概率值:
進而,如果要預測此節點的概率(即圖片中目標是Norfolk terrier的概率),可以根據WordTree將該節點到根節點的條件概率依次相乘得到,如下式:
其中:
YOLO9000在WordTree1k(用有1000類別的ImageNet1k創建)上訓練了Darknet-19模型。為了創建WordTree1k作者添加了很多中間節點(中間詞彙),把標簽由1000擴展到1369。
訓練過程中GroundTruth標簽要順著向根節點的路徑傳播:為了計算條件概率,模型預測了一個包含1369個元素的向量,而且基於所有「同義詞集」計算Softmax,其中「同義詞集」是同一概念下的所屬詞。
現在一張圖片是多標記的,標記之間不需要相互獨立。在訓練過程中,如果有一個圖片的標簽是「Norfolk terrier」,那麼這個圖片還會獲得「狗」以及「哺乳動物」等標簽。
如上圖所示,之前的ImageNet分類是使用一個大Softmax進行分類,而現在WordTree只需要對同一概念下的同義詞進行Softmax分類。然後作者分別兩個數據集上用相同訓練方法訓練Darknet-19模型,最後在ImageNet數據集上的top-1准確率為72.9%,top-5准確率為91.2%;在WordTree數據集上的top-1准確率為71.9%,top-5准確率為90.4%。
這種方法的好處是有「退而求其次」的餘地:在對未知或者新的物體進行分類時,性能損失更低,比如看到一個狗的照片,但不知道是哪種種類的狗,那麼就預測其為「狗」。
以上是構造WordTree的原理,下圖是融合COCO數據集和ImageNet數據集以及生成它們的WordTree的示意圖(用顏色區分了COCO數據集和ImageNet數據集的標簽節點), 混合後的數據集對應的WordTree有9418個類。另一方面,由於ImageNet數據集太大,YOLO9000為了平衡兩個數據集之間的數據量,通過過采樣(Oversampling)COCO數據集中的數據,使COCO數據集與ImageNet數據集之間的數據量比例達到1:4。
對YOLO9000進行評估,發現其mAP比DPM高,而且YOLO有更多先進的特徵,YOLO9000是用部分監督的方式在不同訓練集上進行訓練,同時還能檢測9000個物體類別,並保證實時運行。雖然YOLO9000對動物的識別性能很好,但是對衣服或者裝備的識別性能不是很好(這跟數據集的數據組成有關)。
YOLO9000的網路結構和YOLOv2類似,區別是每個單元格只採用3個Anchor Boxes。
YOLO9000提出了一種在分類數據集和檢測數據集上聯合訓練的機制,即使用檢測數據集(COCO)的圖片去學習檢測相關的信息即查找對象(例如預測邊界框坐標、邊界框是否包含目標及目標屬於各個類別的概率),使用僅有類別標簽的分類數據集(ImageNet)中的圖片去擴展檢測到的對象的可識別種類。
具體方法是:當網路遇到一個來自檢測數據集的圖片與標記信息,就把這些數據用完整的損失函數(v2和9000均沿用了v1網路的損失函數)反向傳播,而當網路遇到一個來自分類數據集的圖片和分類標記信息,只用代表分類誤差部分的損失函數反向傳播這個圖片。
YOLO v2 在大尺寸圖片上能夠實現高精度,在小尺寸圖片上運行更快,可以說在速度和精度上達到了平衡,具體性能表現如下所示。
coco數據集
voc2012數據集
Ⅵ 高大上的YOLOV3對象檢測演算法,使用python也可輕松實現
繼續我們的目標檢測演算法的分享,前期我們介紹了SSD目標檢測演算法的python實現以及Faster-RCNN目標檢測演算法的python實現以及yolo目標檢測演算法的darknet的window環境安裝,本期我們簡單介紹一下如何使用python來進行YOLOV3的對象檢測演算法
YOLOV3的基礎知識大家可以參考往期文章,本期重點介紹如何使用python來實現
1、初始化模型
14-16 行:
模型的初始化依然使用cv下的DNN模型來載入模型,需要注意的是CV的版本需要大於3.4.2
5-8行:
初始化模型在coco上的label以便後期圖片識別使用
10-12行:
初始化圖片顯示方框的顏色
2、載入圖片,進行圖片識別
輸入識別的圖片進行圖片識別,這部分代碼跟往期的SSD 以及RCNN目標檢測演算法類似
19-20行:輸入圖片,獲取圖片的長度與寬度
25-29行:計算圖片的blob值,輸入神經網路,進行前向反饋預測圖片
只不過net.forward裡面是ln, 神經網路的所有out層
3、遍歷所有的out層,獲取檢測圖片的label與置信度
遍歷out層,獲取檢測到的label值以及置信度,檢測到這里YOLOV3以及把所有的檢測計算完成,但是由於yolov3對重疊圖片或者靠的比較近的圖片檢測存在一定的問題,使用YOLOV3使用非最大值抑制來抑制弱的重疊邊界
竟然把墨鏡識別了手機,體現了YOLOV3在重疊圖片識別的缺點
4、應用非最大值抑制來抑制弱的重疊邊界,顯示圖片
56: 使用 非最大值抑制來抑制弱的重疊邊界
58-59行:遍歷所有圖片
61-62行:提取檢測圖片的BOX
64-68行:顯示圖片信息
70-71行:顯示圖片
利用python來實現YOLOV3,與SSD 以及RCNN代碼有很多類似的地方,大家可以參考往期的文章進行對比學習,把代碼執行一遍
進行視頻識別的思路:從視頻中提取圖片,進行圖片識別,識別完成後,再把識別的結果實時體現在視頻中,這部分代碼結合前期的視頻識別,大家可以參考多進程視頻實時識別篇,因為沒有多進程,檢測速度很慢,視頻看著比較卡
1、初始化模型以及視頻流
2、從視頻中提取圖片,進行圖片的blob值計算,進行神經網路的預測
3、提取檢測到圖片的置信度以及ID值
4、 應用非最大值抑制來抑制弱的重疊邊界,顯示圖片
5、關閉資源,顯示圖片處理信息
每個目標檢測演算法都有自己的優缺點,個人感覺,在精度要求不是太高的情況下SSD檢測演算法可以實現較快的速度實現,畢竟精度差不多的情況下,我們希望速度越快越好
Ⅶ 目標檢測 YOLO系列——YOLO v1
YOLO v1:You Only Look Once: Unified, Real-Time Object Detection
YOLO v2:YOLO9000:Better,Faster,Stronger
YOLO v3:YOLOv3: An Incremental Improvement
近幾年來,目標檢測演算法取得了很大的突破。比較流行的演算法可以分為兩類,一類是基於Region Proposal的R-CNN系演算法(R-CNN,Fast R-CNN, Faster R-CNN),它們是two-stage的,需要先使用啟發式方法(selective search)或者CNN網路(RPN)產生Region Proposal,然後再在Region Proposal上做分類與回歸。而另一類是Yolo,SSD這類one-stage演算法,其僅僅使用一個CNN網路直接預測不同目標的類別與位置。第一類方法是准確度高一些,但是速度慢,但是第二類演算法是速度快,但是准確性要低一些。這里我們談的是Yolo-v1版本演算法,其性能是差於後來的SSD演算法的,但是Yolo後來也繼續進行改進,產生了Yolo9000、YOLO v3演算法。
傳統方法常採用滑動窗口法,滑動窗口的目標檢測演算法思路非常簡單,它將檢測問題轉化為了圖像分類問題。其基本原理就是採用不同大小和比例(寬高比)的窗口在整張圖片上以一定的步長進行滑動,然後對這些窗口對應的區域做圖像分類,這樣就可以實現對整張圖片的檢測了,如 DPM 就是採用這種思路。但是這個方法有致命的缺點,就是你並不知道要檢測的目標大小是什麼規模,所以你要設置不同大小和比例的窗口去滑動,而且還要選取合適的步長。但是這樣會產生很多的子區域,並且都要經過分類器去做預測,這需要很大的計算量,所以你的分類器不能太復雜,因為要保證速度。解決思路之一就是減少要分類的子區域,這就是R-CNN的一個改進策略,其採用了 selective search 方法來找到最有可能包含目標的子區域(Region Proposal),其實可以看成採用啟發式方法過濾掉很多子區域,這會提升效率。
如果你使用的是CNN分類器,那麼滑動窗口是非常耗時的。但是結合卷積運算的特點,我們可以使用CNN實現更高效的滑動窗口方法。這里要介紹的是一種全卷積的方法,簡單來說就是網路中用卷積層代替了全連接層,如圖所示。輸入圖片大小是16x16,經過一系列卷積操作,提取了2x2的特徵圖,但是這個2x2的圖上每個元素都是和原圖是一一對應的,如圖上藍色的格子對應藍色的區域,這不就是相當於在原圖上做大小為14x14的窗口滑動,且步長為2,共產生4個字區域。最終輸出的通道數為4,可以看成4個類別的預測概率值,這樣一次CNN計算就可以實現窗口滑動的所有子區域的分類預測。這其實是overfeat演算法的思路。之所可以CNN可以實現這樣的效果是因為卷積操作的特性,就是圖片的空間位置信息的不變性,盡管卷積過程中圖片大小減少,但是位置對應關系還是保存的。這個思路也被R-CNN借鑒,從而誕生了Fast R-cNN演算法。
上面盡管可以減少滑動窗口的計算量,但是只是針對一個固定大小與步長的窗口,這是遠遠不夠的。Yolo演算法很好的解決了這個問題,它不再是窗口滑動了,而是直接將原始圖片分割成互不重合的小方塊,然後通過卷積最後生產這樣大小的特徵圖,基於上面的分析,可以認為特徵圖的每個元素也是對應原始圖片的一個小方塊,然後用每個元素來可以預測那些中心點在該小方格內的目標,這就是Yolo演算法的樸素思想。
整體來看,Yolo演算法採用一個單獨的CNN模型實現end-to-end的目標檢測,整個系統如圖所示:首先將輸入圖片resize到448x448,然後送入CNN網路,最後處理網路預測結果得到檢測的目標。相比R-CNN演算法,其是一個統一的框架,其速度更快,而且Yolo的訓練過程也是end-to-end的。
具體來說,Yolo的CNN網路將輸入的圖片分割成 網格,然後每個單元格負責去檢測那些中心點落在該格子內的目標,如圖所示,可以看到狗這個目標的中心落在左下角一個單元格內,那麼該單元格負責預測這個狗。每個單元格會預測B個邊界框(bounding box)以及邊界框的 置信度 (confidence score)。所謂置信度其實包含兩個方面,一是這個邊界框含有目標的可能性大小,二是這個邊界框的准確度。前者記為 ,當該邊界框是背景時(即不包含目標),此時 。而當該邊界框包含目標時, 。邊界框的准確度可以用預測框與實際框(ground truth)的 IOU (intersection over union,交並比)來表徵,記為 IOU 。因此置信度可以定義為 。
很多人可能將Yolo的置信度看成邊界框是否含有目標的概率,但是其實它是兩個因子的乘積,預測框的准確度也反映在裡面。邊界框的大小與位置可以用4個值來表徵:(x,y,h,w),其中(x,y)是邊界框的中心坐標,而w和h是邊界框的寬與高。還有一點要注意,中心坐標的預測值(x,y)是相對於每個單元格左上角坐標點的偏移值,並且單位是相對於單元格大小的,單元格的坐標定義如圖所示。而邊界框的w和h預測值是相對於整個圖片的寬與高的比例,這樣理論上4個元素的大小應該在[0,1]范圍。這樣,每個邊界框的預測值實際上包含5個元素:(x,y,w,h,c),其中前4個表徵邊界框的大小與位置,而最後一個值是置信度。
值得注意的是,不管一個單元格預測多少個邊界框,其只預測一組類別概率值,這是Yolo演算法的一個缺點,在後來的改進版本中,Yolo9000是把類別概率預測值與邊界框是綁定在一起的。同時,我們可以計算出各個邊界框類別置信度(class-specificconfidence scores):
邊界框類別置信度表徵的是該邊界框中目標屬於各個類別的可能性大小以及邊界框匹配目標的好壞。後面會說,一般會根據類別置信度來過濾網路的預測框。
總結一下,每個單元格需要預測 個值。如果將輸入圖片劃分為 網格,那麼最終預測值為 大小的張量。整個模型的預測值結構如下圖所示。對於PASCALVOC數據,其共有20個類別,如果使用S=7,B=2,那麼最終的預測結果就是 大小的張量。在下面的網路結構中我們會詳細講述每個單元格的預測值的分布位置。
Yolo採用卷積網路來提取特徵,然後使用全連接層來得到預測值。網路結構參考GooLeNet模型,包含24個卷積層和2個全連接層,如圖所示。對於卷積層,主要使用1x1卷積來做channle rection,然後緊跟3x3卷積。對於卷積層和全連接層,採用Leaky ReLU激活函數:max(x,0)。但是最後一層卻採用線性激活函數。除了上面這個結構,文章還提出了一個輕量級版本Fast Yolo,其僅使用9個卷積層,並且卷積層中使用更少的卷積核。
可以看到網路的最後輸出為 大小的張量。這和前面的討論是一致的。這個張量所代表的具體含義如圖所示。對於每一個單元格,前20個元素是類別概率值,然後2個元素是邊界框置信度,兩者相乘可以得到類別置信度,最後8個元素是邊界框的(x,y,w,h)。大家可能會感到奇怪,對於邊界框為什麼把置信度c和(x,y,w,h)都分開排列,而不是按照(x,y,w,h,c)這樣排列,其實純粹是為了計算方便,因為實際上這30個元素都是對應一個單元格,其排列是可以任意的。但是分離排布,可以方便地提取每一個部分。這里來解釋一下,首先網路的預測值是一個二維張量P,其shape為 。
採用切片,那麼 就是類別概率部分; 是置信度部分; 是邊界框的預測結果。這樣,提取每個部分是非常方便的,這會方面後面的訓練及預測時的計算。
在訓練之前,先在ImageNet上進行了預訓練,其預訓練的分類模型採用圖中前20個卷積層,然後添加一個average-pool層和全連接層。預訓練之後,在預訓練得到的20層卷積層之上加上隨機初始化的4個卷積層和2個全連接層。由於檢測任務一般需要更高清的圖片,所以將網路的輸入從224x224增加到了448x448。整個網路的流程如下圖所示:
損失函數計算如下:
其中第一項是邊界框中心坐標的誤差項, 指的是第i個單元格存在目標,且該單元格中的第j個邊界框負責預測該目標。第二項是邊界框的高與寬的誤差項。第三項是包含目標的邊界框的置信度誤差項。第四項是不包含目標的邊界框的置信度誤差項。而最後一項是包含目標的單元格的分類誤差項, 指的是第i個單元格存在目標。
在說明Yolo演算法的預測過程之前,這里先介紹一下非極大值抑制演算法(non maximum suppression, NMS),這個演算法不單單是針對Yolo演算法的,而是所有的檢測演算法中都會用到。NMS演算法主要解決的是一個目標被多次檢測的問題,如圖中人臉檢測,可以看到人臉被多次檢測,但是其實我們希望最後僅僅輸出其中一個最好的預測框,比如對於美女,只想要紅色那個檢測結果。那麼可以採用NMS演算法來實現這樣的效果:首先從所有的檢測框中找到置信度最大的那個框,然後挨個計算其與剩餘框的IOU,如果其值大於一定閾值(重合度過高),那麼就將該框剔除;然後對剩餘的檢測框重復上述過程,直到處理完所有的檢測框。
下面就來分析Yolo的預測過程,這里我們不考慮batch,認為只是預測一張輸入圖片。根據前面的分析,最終的網路輸出是 ,但是我們可以將其分割成三個部分:類別概率部分為 ,置信度部分為 ,而邊界框部分為 (對於這部分不要忘記根據原始圖片計算出其真實值)。然後將前兩項相乘可以得到 類別置信度值為 ,這里總共預測了 邊界框。
所有的准備數據已經得到了,那麼先說第一種策略來得到檢測框的結果。首先,對於每個預測框根據類別置信度選取置信度最大的那個類別作為其預測標簽,經過這層處理我們得到各個預測框的預測類別及對應的置信度值,其大小都是[7,7,2]。一般情況下,會設置置信度閾值,就是將置信度小於該閾值的box過濾掉,所以經過這層處理,剩餘的是置信度比較高的預測框。最後再對這些預測框使用NMS演算法,最後留下來的就是檢測結果。一個值得注意的點是NMS是對所有預測框一視同仁,還是區分每個類別,分別使用NMS。Ng在deeplearning.ai中講應該區分每個類別分別使用NMS,但是看了很多實現,其實還是同等對待所有的框,可能是不同類別的目標出現在相同位置這種概率很低吧。
上面的預測方法應該非常簡單明了,但是對於Yolo演算法,其卻採用了另外一個不同的處理思路(至少從C源碼看是這樣的),其區別就是先使用NMS,然後再確定各個box的類別。其基本過程如圖所示。對於98個boxes,首先將小於置信度閾值的值歸0,然後分類別地對置信度值採用NMS,這里NMS處理結果不是剔除,而是將其置信度值歸為0。最後才是確定各個box的類別,當其置信度值不為0時才做出檢測結果輸出。這個策略不是很直接,但是貌似Yolo源碼就是這樣做的。Yolo論文裡面說NMS演算法對Yolo的性能是影響很大的,所以可能這種策略對Yolo更好。
總結一下Yolo的優缺點。首先是優點,Yolo採用一個CNN網路來實現檢測,是單管道策略,其訓練與預測都是end-to-end,所以Yolo演算法比較簡潔且速度快。第二點由於Yolo是對整張圖片做卷積,所以其在檢測目標有更大的視野,它不容易對背景誤判。另外,Yolo的泛化能力強,在做遷移時,模型魯棒性高。
Yolo的缺點,首先Yolo各個單元格僅僅預測兩個邊界框,而且屬於一個類別。對於小物體,Yolo的表現會不如人意。這方面的改進可以看SSD,其採用多尺度單元格。也可以看Faster R-CNN,其採用了anchor boxes。Yolo對於在物體的寬高比方面泛化率低,就是無法定位不尋常比例的物體。當然Yolo的定位不準確也是很大的問題。
參考鏈接
YOLO演算法的原理與實現
https://cloud.tencent.com/developer/article/1058057
Ⅷ python怎麼用yolov3來測試圖片
正因為YOLOv3檢測速度快,進行對以前目標檢測的速度上的優化;和上一篇博客類似,這次主要是對本地視頻的載入–輸入模型—結果幀中間輸出—檢測結果最後視頻保存
目前對視頻的檢測的思路還是先對視頻進行抽幀處理,將檢測完的結果進行保存,最後通過照片合成視頻(有序地)
Ⅸ yolo演算法是什麼意思
Yolo是一種目標檢測演算法。
YOLO將對象檢測重新定義為一個回歸問題。它將單個卷積神經網路(CNN)應用於整個圖像,將圖像分成網格,並預測每個網格的類概率和邊界框。例如,以一個100x100的圖像為例。我們把它分成網格,比如7x7。
然後,對於每個網格,網路都會預測一個邊界框和與每個類別(汽車,行人,交通信號燈等)相對應的概率。
重要性:
YOLO非常快。由於檢測問題是一個回歸問題,所以不需要復雜的管道。它比「R-CNN」快1000倍,比「Fast R-CNN」快100倍。
它能夠處理實時視頻流,延遲小於25毫秒。它的精度是以前實時系統的兩倍多。同樣重要的是,YOLO遵循的是「端到端深度學習」的實踐。
Ⅹ yolo演算法是什麼
yolo演算法是一種目標檢測演算法。目標檢測任務的目標是找到圖像中的所有感興趣區域,並確定這些區域的位置和類別概率。目標檢測領域的深度學習方法主要分為兩大類兩階段式(Two-stage)目標檢測演算法和單階段式(One-stage)目標檢測演算法。兩階段式是先由演算法生成一系列候選邊界框作為樣本,然後再通過卷積神經網路分類這些樣本。
yolo演算法原理
因為它採用深層卷積神經網路,吸收了當前很多經典卷積神經網路架構的優秀思想,在位置檢測和對象的識別方面,性能達到最優(准確率非常高的情況下還能達到實時檢測)。因為作者還將代碼開源了。真心為作者這種大公無私的心胸點贊。
美中不足的是雖然將代碼開源,但是在論文介紹架構原理的時候比較模糊,特別是對一些重要改進,基本上是一筆帶過。現在在網路上有很多關於YOLO原理的講解。