1. 程式人生 > >yolo類檢測演算法解析——yolo v3

yolo類檢測演算法解析——yolo v3

計算機視覺的發展史可謂很長了,它的分支很多,而且理論那是錯綜複雜交相輝映,就好像數學一樣,如何學習數學?這問題似乎有點籠統、有點寬泛。

yolo類演算法,從開始到現在已經有了3代,我們稱之為v1、v2、v3,v3現在成為了開源通用目標檢測演算法的領頭羊(ps:雖然本人一直都很欣賞SSD,但是不得不說V3版本已經達到目前的顛覆)。一直以來,有一個問題困擾許久,那就是如何檢測兩個距離很近的同類的物體,當然又或者是距離很近的不同類的物體?絕大部分演算法都會對傳入的data做resize到一個更小的resolution,它們對於這種情況都會給出一個目標框,因為在它們的特徵提取或者回歸過程看來,這就是一個物體(可想本來就很近,一放縮之間的近距離越發明顯了),而事實上這是兩個同(或不同)型別的物體靠的很近,這個難題是目標檢測和跟蹤領域的一個挑戰。就好像對小目標的檢測,一直以來也被看做是演算法的一種評估。但是啊,v3版本卻做到了,它對這種距離很近的物體或者小物體有很好的魯棒性,雖然不能保證百分百,但是這個難題得到了很大程度的解決,激發我對yolo類演算法的研究。這也是為什麼寫這篇文章的目的,在於見證一下這個演算法的神奇。其實,百分百的檢測,在我看來事實上是不存在的,隨著時間的推移,環境的變化,任何妄言百分百準確的演算法都是扯,只能是相互調整吧。前幾天uber撞人事件其實我最關注的應該是哪個環節存在的問題,還需要改進,撞人是不可避免的,無人車的存在不是讓事故不發生,而是讓社會進步,科技發展,逐步降低事故發生率的同時改善人們的生活質量。

yolo的v1和v2都不如SSD演算法,原諒這麼直白,原因是v1版本的448和v2版本的416都不如SSD的300,當然以上結論都是實驗測的,v3版本的416應該比SSD512好,可見其效能。

對官方yolo做了實驗,實驗中,採用同一個視訊、同一張顯示卡,在閾值為0.3的前提下,對比了v3和v2的測試效果之後,有了下面兩個疑問:

1.為什麼v3和v2版本的測試效能提高很大,但速度卻沒有降低?

2.為什麼v3效能上能有這麼大的改進?或者說為什麼v3在沒有提高輸入資料解析度的前提下,對小目標檢測變得這麼好?

 要回答上述兩個問題,必須要看看作者釋出的v3論文了,將v3和v2不一樣的地方總結一下:

  • loss不同:作者v3替換了v2的softmax loss 變成logistic loss,而且每個ground truth只匹配一個先驗框。
  • anchor bbox prior不同:v2作者用了5個anchor,一個折衷的選擇,所以v3用了9個anchor,提高了IOU。
  • detection的策略不同:v2只有一個detection,v3一下變成了3個,分別是一個下采樣的,feature map為13*13,還有2個上取樣的eltwise sum,feature map為26*26,52*52,也就是說v3的416版本已經用到了52的feature map,而v2把多尺度考慮到訓練的data取樣上,最後也只是用到了13的feature map,這應該是對小目標影響最大的地方。
  • backbone不同:這和上一點是有關係的,v2的darknet-19變成了v3的darknet-53,為啥呢?就是需要上取樣啊,卷積層的數量自然就多了,另外作者還是用了一連串的3*3、1*1卷積,3*3的卷積增加channel,而1*1的卷積在於壓縮3*3卷積後的特徵表示,這波操作很具有實用性,一增一減,效果棒棒。

為什麼有這麼大的提高?我指的是v2和v3比,同樣是416的feature map,我感覺是v2作者當時也是做了很多嘗試和借鑑,實現了匹敵SSD的效果,但是他因為被借鑑的內容所困擾,導致效能的停留,因此v3再借鑑,應該是參考了DSSD和FPN,這應該是之後的潮流了,做了一下結果效能提高很大,可能作者本人都沒想到。但是作者目前沒有寫篇論文,認為沒有創造性實質性的改變,寫了一個report,科研的精神值得肯定!如果對比v2和v3你會發現反差確實很大,所以上面的問題才不奇怪。

又為什麼速度沒有下降?電腦上同環境測都是15幀左右。先看一下列印的日誌:

 v2的日誌資訊:複製程式碼
Demo
layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32  0.299 BFLOPs
    1 max          2 x 2 / 2   416 x 416 x  32   ->   208 x 208 x  32
    2 conv     64  3 x 3 / 1   208 x 208 x  32   ->   208 x 208 x  64  1.595 BFLOPs
    3 max          2 x 2 / 2   208 x 208 x  64   ->   104 x 104 x  64
    4 conv    128  3 x 3 / 1   104 x 104 x  64   ->   104 x 104 x 128  1.595 BFLOPs
    5 conv     64  1 x 1 / 1   104 x 104 x 128   ->   104 x 104 x  64  0.177 BFLOPs
    6 conv    128  3 x 3 / 1   104 x 104 x  64   ->   104 x 104 x 128  1.595 BFLOPs
    7 max          2 x 2 / 2   104 x 104 x 128   ->    52 x  52 x 128
    8 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
    9 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   10 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   11 max          2 x 2 / 2    52 x  52 x 256   ->    26 x  26 x 256
   12 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   13 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   14 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   15 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   16 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   17 max          2 x 2 / 2    26 x  26 x 512   ->    13 x  13 x 512
   18 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   19 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   20 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   21 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   22 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   23 conv   1024  3 x 3 / 1    13 x  13 x1024   ->    13 x  13 x1024  3.190 BFLOPs
   24 conv   1024  3 x 3 / 1    13 x  13 x1024   ->    13 x  13 x1024  3.190 BFLOPs
   25 route  16
   26 conv     64  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x  64  0.044 BFLOPs
   27 reorg              / 2    26 x  26 x  64   ->    13 x  13 x 256
   28 route  27 24
   29 conv   1024  3 x 3 / 1    13 x  13 x1280   ->    13 x  13 x1024  3.987 BFLOPs
   30 conv    125  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 125  0.043 BFLOPs
   31 detection
mask_scale: Using default '1.000000'
Loading weights from yolo-voc.weights...Done!
複製程式碼

v3的日誌資訊:

複製程式碼
Demo
layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32  0.299 BFLOPs
    1 conv     64  3 x 3 / 2   416 x 416 x  32   ->   208 x 208 x  64  1.595 BFLOPs
    2 conv     32  1 x 1 / 1   208 x 208 x  64   ->   208 x 208 x  32  0.177 BFLOPs
    3 conv     64  3 x 3 / 1   208 x 208 x  32   ->   208 x 208 x  64  1.595 BFLOPs
    4 res    1                 208 x 208 x  64   ->   208 x 208 x  64
    5 conv    128  3 x 3 / 2   208 x 208 x  64   ->   104 x 104 x 128  1.595 BFLOPs
    6 conv     64  1 x 1 / 1   104 x 104 x 128   ->   104 x 104 x  64  0.177 BFLOPs
    7 conv    128  3 x 3 / 1   104 x 104 x  64   ->   104 x 104 x 128  1.595 BFLOPs
    8 res    5                 104 x 104 x 128   ->   104 x 104 x 128
    9 conv     64  1 x 1 / 1   104 x 104 x 128   ->   104 x 104 x  64  0.177 BFLOPs
   10 conv    128  3 x 3 / 1   104 x 104 x  64   ->   104 x 104 x 128  1.595 BFLOPs
   11 res    8                 104 x 104 x 128   ->   104 x 104 x 128
   12 conv    256  3 x 3 / 2   104 x 104 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   13 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   14 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   15 res   12                  52 x  52 x 256   ->    52 x  52 x 256
   16 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   17 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   18 res   15                  52 x  52 x 256   ->    52 x  52 x 256
   19 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   20 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   21 res   18                  52 x  52 x 256   ->    52 x  52 x 256
   22 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   23 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   24 res   21                  52 x  52 x 256   ->    52 x  52 x 256
   25 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   26 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   27 res   24                  52 x  52 x 256   ->    52 x  52 x 256
   28 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   29 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   30 res   27                  52 x  52 x 256   ->    52 x  52 x 256
   31 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   32 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   33 res   30                  52 x  52 x 256   ->    52 x  52 x 256
   34 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   35 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   36 res   33                  52 x  52 x 256   ->    52 x  52 x 256
   37 conv    512  3 x 3 / 2    52 x  52 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   38 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   39 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   40 res   37                  26 x  26 x 512   ->    26 x  26 x 512
   41 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   42 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   43 res   40                  26 x  26 x 512   ->    26 x  26 x 512
   44 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   45 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   46 res   43                  26 x  26 x 512   ->    26 x  26 x 
            
           

相關推薦

yolo檢測演算法解析——yolo v3

計算機視覺的發展史可謂很長了,它的分支很多,而且理論那是錯綜複雜交相輝映,就好像數學一樣,如何學習數學?這問題似乎有點籠統、有點寬泛。yolo類演算法,從開始到現在已經有了3代,我們稱之為v1、v2、v3,v3現在成為了開源通用目標檢測演算法的領頭羊(ps:雖然本人一直都很欣賞SSD,但是不得不說V3版本已經

在iOS上實現YOLO目標檢測演算法

YOLOv2簡介 yolov2的輸入為416x416,然後通過一些列的卷積、BN、Pooling操作最後到13x13x125的feature map大小。其中13x13對應原圖的13x13網格,如下圖所示。 125來自5x(5+20),表示每一個

yolo 目標檢測演算法個人總結(yolov1)

yolo 目標檢測演算法個人總結 目前yolo目標檢測有兩個版本,分別為v1和v2。因工作需要用yolo演算法檢測人物,所以這段時間重點看了這兩篇論文,並實現了對應的tensorflow程式碼。這裡記錄下在論文閱讀過程中的一些細節資訊,留給自己,同時也希望各位能指出本人

Yolo-lite:實時的適用於移動裝置的目標檢測演算法(比ssd和mobilenet更快)

YOLO-LITE: A Real-Time Object Detection Algorithm Optimized for Non-GPU Computers 論文:Yolo-lite paper 專案:Yolo-lite 摘要:   作者提出了一種可以應用於行動式裝置中執行的

目標檢測演算法另一分支的發展(one stage檢測演算法):YOLO、SSD、YOLOv2/YOLO 9000、YOLOv3

目標檢測可以理解為是物體識別和物體定位的綜合,不僅僅要識別出物體屬於哪個分類,更重要的是得到物體在圖片中的具體位置。 目前的目標檢測演算法分為兩類: 一類是two-stage,two-stage檢測演算法將檢測問題劃分為兩個階段,首先產生候選區域(region proposals),然後

理解yolo系列目標檢測演算法

在計算機視覺任務中,如果說做的最成熟的是影象識別領域,那麼緊隨其後的應該就是目標檢測了。筆者接觸目標檢測也有一段時間了,用mobilenet_ssd演算法做過手機端的實時目標檢測,也用faster-rcnn做過伺服器端的二維碼檢測,儘管一直都知道yolo的效果也

常用目標檢測演算法:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD

一、目標檢測常見演算法         object detection,就是在給定的圖片中精確找到物體所在位置,並標註出物體的類別。所以,object detection要解決的問題就是物體在哪裡以及是什麼的整個流程問題。

深度學習(四)——目標檢測演算法YOLO的訓練和檢測過程的基本思路介紹

      基礎知識掌握情況決定研究的高度,我們剛開始接觸深度學習時,一般都是看到別人的概括,這個方法很好能讓我們快速上手,但是也有一個很大的缺點, 知識理解的不透徹,導致我們對演算法優化時一頭霧水。我也是抱著知識總結的思想開始自己的深度學習知識精髓的探索,也希望能從中幫助到

YOLO v1,YOLO v2,YOLO9000演算法總結與原始碼解析

1.YOLO v1簡介 YOLO出自2016 CVPR 《You Only Look Once:Unified, Real-Time Object Detection》。YOLO將目標區域定位於目標類別預測整合於單個神經網路模型中,實現了在準確率較高的情況下快

目標檢測演算法:RCNN、YOLO vs DPM

以下內容節選自我的研究報告。 1. 背景 目標檢測(object detection)簡單說就是框選出目標,並預測出類別的一個任務。它是一種基於目標幾何和統計特徵的影象分割,將目標的分割和識別合

YOLO——基於迴歸的目標檢測演算法

YOLO: You Only Look Once:Unified, Real-Time Object Detection     這篇論文的內容並不多,核心思想也比較簡單,下面相當於是對論文的翻譯!     YOLO是一個可以一次性預測多個Box位置和類別的卷積神經網

YOLO系列之YOLO-Lite:實時執行在CPU上的目標檢測演算法

實時目標檢測一直是yolo系列的追求之一,從yolo v1開始,作者就在論文中強調real-time。在後期的v2和v3的發展過程中,慢慢在P&R(尤其是recall rate)上下不少功夫。同時,計算量的增大也犧牲了yolo的實時性。 tiny-yolo是輕量級的

目標檢測演算法綜述:R-CNN,faster R-CNN,yolo,SSD,yoloV2

1 引言 深度學習目前已經應用到了各個領域,應用場景大體分為三類:物體識別,目標檢測,自然語言處理。上文我們對物體識別領域的技術方案,也就是CNN進行了詳細的分析,對LeNet-5 AlexNet VGG Inception ResNet MobileNet等各種優秀的模型

一種告訴你圖片裡馬冬梅,冬馬梅分別在哪裡的演算法YOLO演算法2016論文筆記

寫在最前面 作者Joseph Redmon是我曾經的男神。作為當時學深度學習時亮到我的文章(他的官網也是“亮”到了我),我決定第一篇論文筆記就寫這篇YOLO演算法論文。對於一張影象,其中的物體可能很多,如何識別其中物體是什麼,在哪裡,就要看這篇代表作品了。 論文名 Y

【AI實戰】動手訓練自己的目標檢測模型(YOLO篇)

在前面的文章中,已經介紹了基於SSD使用自己的資料訓練目標檢測模型(見文章:手把手教你訓練自己的目標檢測模型),本文將基於另一個目標檢測模型YOLO,介紹如何使用自己的資料進行訓練。   YOLO(You only look once)是目前流行的目標檢測模型之一,目前最新已經發

論文筆記:目標檢測演算法(R-CNN,Fast R-CNN,Faster R-CNN,YOLOv1-v3

R-CNN(Region-based CNN) motivation:之前的視覺任務大多數考慮使用SIFT和HOG特徵,而近年來CNN和ImageNet的出現使得影象分類問題取得重大突破,那麼這方面的成功能否遷移到PASCAL VOC的目標檢測任務上呢?基於這個問題,論文提出了R-CNN。 基本步驟:如下圖

Yolo目標檢測和識別(第二課)

引用地址: 承接上一章 由於上一章修改Makefile中的OPENCV=1重新make卻一直報錯,因此一直在網上查詢解決方案。最後重灌了opencv,並且嘗試了這個網站給出的解決方案,依然不能重新得到darknet的檔案(因為只有得到了這個檔案才算是make成

深度學習實戰(1)--手機跑目標檢測模型(YOLO,從DarkNet到Caffe再到NCNN完整打通)

這篇算是關鍵技術貼,YOLO是什麼、DarkNet是什麼、Caffe是什麼、NCNN又是什麼…等等這一系列科普這裡就完全不說了,牽扯實在太多,通過其他帖子有一定的積累後,看這篇就相對容易了。 本文核心:把一個目標檢測模型跑到手機上 整個工作分以下幾個階段: 1

深度學習實戰(1)--手機端跑YOLO目標檢測網路(從DarkNet到Caffe再到NCNN完整打通)

深度學習實戰(1)--手機端跑YOLO目標檢測網路(從DarkNet到Caffe再到NCNN完整打通)   這篇算是關鍵技術貼,YOLO是什麼、DarkNet是什麼、Caffe是什麼、NCNN又是什麼…等等這一系列科普這裡就完全不說了,牽扯實在太多,通過其他帖子有一定的積累後,看這

YOLO視訊檢測

二.檢測 輸入如下命令: ./darknet detector demo cfg/coco.data cfg/yolo.cfg weights/yolo.weights data/input.avi 注:我的視訊放在data目錄下 三.檢測結