YOLO9000
YOLO9000是YOLO的第三個版本。前兩個版本是YOLO v1,YOLO v2,在CVPR2017的文章《Better,Faster,Stronger》中的前半部分都是對前兩個版本的介紹,新的內容主要在Stronger部分。YOLO9000中的9000指的是YOLO可以對超過9000種圖像進行分類。
Better
使用Batch normalization有利于收斂和正則化,甚至可以從網絡中移除dropout。Batch normalization實質是對數據歸一化處理。使每批數據發布相同,最好是獨立同分布,這樣神經網絡才能更好地學習。
High Resolution Classifier
大多數算法使用在ImageNet上預訓練pre-trained的分類器。大多數使用AlexNet模型的分類器工作在分辨率小于256x256的圖片上。初始版本的YOLO先在224x224大小的圖像上訓練分類器網絡,然后再將分辨率提升到448x448,這意味著網絡必須在檢測的時候重新根據分辨率調整。在YOLOv2中,對分類網絡就開始在10 epochs內使用448x448的圖像對網絡訓練,這樣濾波器就有時間調整參數。在檢測階段再在此基礎上進行優化。
Convolutional with Anchor Boxes
YOLOv1是直接從全連接層中預測the coordinates of bounding boxes。而Faster R-CNN中的RPN只使用卷積層就預測了offsets 偏移and confidences置信度 for anchor boxes.再加上手動選擇的先驗hand-picked priors,就可以預測bounding boxes。所以作者就去掉了YOLO的全連接層,并使用anchor boxes來預測bounding boxes。去掉一層池化層,使得輸出的分辨率更高。把448x448的分辨率再調整為416x416,這次分辨率降低了,為的是輸出得到的特征圖feature map的網格是奇數,確保目標物體只對應在單一的方格內。下采樣比例是32時,輸出特征圖尺寸就是13x13.
對于anchor boxes,還進行了解耦decouple。
對于每一個位置預測兩個box的情況,解耦后對每一個預測的box都包含了位置信息(5個參數:一個置信度,四個坐標信息),對一個box都給出了分類的條件概率(假設方框內有物體),而解耦前只給了該位置的條件概率,這就是解耦的出處,條件概率不與空間位置有關,而與box有關。
YOLOv1劃分成7x7的網絡,每一個網格預測兩個box,所以每一幅圖預測7x7x2=98個box,而使用anchor boxes之后可以預測1000多個box。
Dimension Clusters
K-means聚類方法自動選擇先驗的box的尺寸。K取值為5,平衡了復雜度和高recall,將歐式距離改為一個新的衡量標準,使得box的尺寸和IOU無關。
Direct location prediction
在YOLO中使用anchor boxes會在早期迭代中遇到不穩定的問題。任意box可能終止在圖像的任意位置。所以不再預測offsets(又不預測偏移量了?),改而預測相對于grid cell的相對位置坐標。這就要求預測的ground truth限制在(0,1),可以通過logistic activation達到這個要求。
對于剛才的疑問,我的理解是這樣的:對于box的長和寬是由相對于cluster centroids的offsets預測的,而對于box的中心坐標,是通過sigmoid函數預測相對于濾波器的坐標實現的。
Fine-Grained Features
簡單添加一個 passthrough layer,把淺層特征圖(分辨率為26*26)連接到深層特征圖。
passthroughlaye把高低分辨率的特征圖做連結,疊加相鄰特征到不同通道(而非空間位置),類似于Resnet中的identity mappings。
Multi-ScaleTraining
為了讓YOLOv2對不同尺寸圖片的具有魯棒性,每經過10批訓練(10 batches)就會隨機選擇新的圖片尺寸。網絡使用的降采樣參數為32,于是使用32的倍數{320,352,…,608},最小的尺寸為320*320,最大的尺寸為608*608。 調整網絡到相應維度然后繼續進行訓練。
Faster
大多數檢測框架使用的是VGG-16,但是計算量大,對于224x224大小的圖像,傳輸一次需要30.69billion次浮點運算。YOLO使用了Googlenet,需要8.52billion次運算,速度更快但是準確度降低。作者提出了一種新的分類模型:Darknet-19. Darknet-19借鑒了VGG中的3x3濾波器和double池化層之后的通道數。借鑒了NIN中的全局平均池化global average pooling以坐預測,借鑒了NIN中的1x1濾波器壓縮3x3卷積之間的特征表示。Darknet-19有19個卷積層和5個最大池化層maxpooling layers,模型的細節(每層的尺寸)可以可以從表6中看到。Darknet-19只進行5.58billion次運算。
有了模型,就要使用樣本數據進行訓練。對于分類,使用的數據集是ImageNet 1000,學習方法是隨機梯度下降,訓練時長是160epochs。訓練過程中還使用了數據增強。正如前文提到的,初始訓練在224x224的圖像上,然后再在448x448的圖像上作調整,調整時間為10epochs,并且學習率也做了調整。
對于訓練檢測,去掉原網絡最后一個卷積層,增加了三個 3 *3 (1024 ?lters)的卷積層,并且在每一個卷積層后面跟一個1*1的卷積層,輸出維度是檢測所需數量。訓練的數據集是VOC,預測5種boxes,每個box包含5個坐標值和20個類別,所以總共是5*(5+20)= 125個輸出維度。在最終的3x3x512層到倒數第二second to last卷積層之間加了passthrough,使得模型有了細粒度特征。除了在VOC上訓練,還在COCO上進行訓練,具體的策略見論文。
Stronger
這個Stronger指的是YOLOv3可以檢測更多的物體。將帶box信息的檢測數據集用來學習預測box和目標信息,利用只包含類別標簽的分類數據集用來擴展分類的能力。區別在于反向傳播的函數是全部包含還是只包含分類部分。
分類數據集如ImageNet的標簽分類信息更詳細,對dog就有不同的品種。所以為了將檢測和分類數據集的類別信息融合起來,需要建立一個層次式的結構,基于圖graph結構WordNet改動得到,這就是WordTree。WordTree是由WordNet而來的,先添加那些在wordNet中離根結點更近的點,這樣使得WordTree增長得盡可能慢。這樣,每一層之間是同義詞,不同層之間的關系可以用條件概率表示。沿著的根結點的路徑條件概率的相乘就可以得到絕對概率。
我們ImageNet中的1000個類別按照這種方法構建成WordTree,因為還有一些中間結點,所以最終的類別數是1369.訓練時,會將當前標簽及其直至根結點的所有標簽都傳播。這樣會預測出一個1369長度的向量,在判決時,對同一組語義下的互斥關系的詞條使用softmax,而不是對所有詞語使用softmax。
這僅僅是驗證說明這種聯合數據集的方法是可行的,于是作者將ImageNet中的前9000個類別和COCO檢測數據集聯合起來,為了評估我們使用的方法,也從ImageNet detection challenge 中向整合數據集添加一些還沒有存在于整合數據集的類別。相應的WordTree有9418個類別。由于ImageNet是一個非常大的數據集,所以通過oversampling COCO數據集來保持平衡,使ImageNet:COCO = 4:1。使用COCO來學習檢測,使用ImageNet學習到更多的類別。
學習好之后在ImageNet detection task上評估。ImageNet detection task與COCO有44個類別是相同的,說明測試數據大部分只有分類數據,沒有檢測數據。
翻譯參考:
https://blog.csdn.net/shadow_guo/article/details/54598458
https://blog.csdn.net/yudiemiaomiao/article/details/72636776
Demo
第一步是安裝網絡模型Darknet,為了支持更多的圖片類型,可以安裝OpenCV,為了使用GPU,可以安裝CUDA。但是作者網站給出的是Mac上的Linux版本。這是同時支持windows的版本https://github.com/AlexeyAB/darknet 這個repository forked from pjreddie/darknet,新支持了Windows,提升了各種性能,針對GPU等做了許多優化。
解壓后的路徑build\darknet\x64\ 文件夾下面是一些cmd文件,用于初始化模型和展示一些檢測后的樣例。這些cmd文件的運行需要darknet.exe文件,所以第一步還是重新編譯文件。
如果有GPU,要安裝CUDA,CUDNN并注意路徑問題就行了。我的電腦不支持CUDA,所以直接編譯sln文件:build\darknet\darknet_no_gpu.sln, set x64 and Release, and do the: Build -> Build darknet_no_gpu。但是我的vs版本也不是官方要求的vs2015,報錯:error MSB8020: The build tools for v140 (Platform Toolset = 'v140') cannot be found,這是因為原來的程序運行在vs2015上而現在我們需要運行在vs2013上,解決辦法是把項目的屬性中的平臺工具集改為vs2013
即便這樣,因為官方首先推薦的OpenCV版本是3.0版本,而自己使用的是OpenCV2.4.13,其實即便是OpenCV3.0,路徑也不會和工程文件一樣,所以依然要更改工程屬性,添加附加包含目錄,修改附加庫目錄。
4.1 (right click on project) -> properties -> C/C++ -> General -> Additional Include Directories: C:\opencv_2.4.13\opencv\build\include
4.2 (right click on project) -> properties -> Linker -> General -> Additional Library Directories: C:\opencv_2.4.13\opencv\build\x64\vc14\lib
注意,這里4.2中的vc14是和vs2015對應的。當我們vs是2013的時候這里選擇vc12,實際上,OpenCV2.4.13默認只有vc12,要想支持其他編譯器一般要使用cmake重新構建。
這時候會出現很多錯誤,需要一個個排查。錯誤信息淹沒在大量的warning信息中,可以在視圖view中直接查看錯誤列表error list。
這是我的錯誤,不知道到底哪里出錯了。在整個solution中搜索這個函數,好像沒有被使用到,直接注釋掉就編譯通過了。
但最好還是研究一下代碼。前綴0B(Binary)或者0b表示 二進制;
雙目運算符按位與,保留某些位,同時對某些位清零。A&000111100,對1對應的部分保留,0對應的部分會被清0.這里的代碼中n與二進制的1111作按位與,不清楚目的是什么,而且會報錯,將0b1111改為0xf即編譯通過。
參考overflow的解答,這段代碼的目的是將一個字節的比特倒序輸出。大致思想是將8bit分成高低高部分,每部分4bit,借助looup表,將高低4bit倒序后再交換。
這樣,編譯通過。darknet\build\darknet\x64文件夾下出現了darknet_no_gpu.exe,這是因為我選擇的是無GPU的版本,如果是標準版本應該是darknet.exe。這只是表明我們已經得到了這個模型,但是還沒有開始訓練。YOLOv3和v2其實模型沒有改變,區別只是v3使用了聯合數據集進行了訓練。所以接下來如何訓練才是v2和v3的區別。
有了exe文件,同時有了config file for YOLO in the cfg,我們可以直接使用作者訓練好的網絡權重:下載yolov3.weights
鏈接1(百度云):鏈接:https://pan.baidu.com/s/1OsuaURd2jjA9_fX50w651g 密碼:chmq
連接2(官網):https://pjreddie.com/media/files/yolov3.weights
注:在Linux上,安裝網絡模型,安裝訓練好的參數,運行檢測器,都可以分別通過一行命令實現。而在Windows中,需要借助exe文件和cmd命令。
使用命令行可以一次監測一張圖像,也可以不斷輸入圖像路徑監測多張圖像,還可以檢測來自網頁的視頻webcam如YouTube,需要compile Darknet with CUDA and OpenCV。YOLo默認顯示置信度高于0.25的目標,當然可以自己更改這個閾值。對于一些有限制的環境,YOLO提供了Tiny YOLOv3,需要重新下載weights,將下載的weights放到x64文件夾下。
打開cmd,切換到E:\vscode\darknet-master(1)\darknet-master\build\darknet\x64路徑,
輸入cmd命令:darknet_no_gpu.exe detector test data\coco.data yolov3.cfg yolov3.weights
輸入測試圖像路徑:E:\vscode\darknet-master(1)\darknet-master\build\darknet\x64\data\horses.jpg
終于得到了這幅經典的分類檢測結果圖。但是這是使用了作者預先訓練好的網絡簡單做了一個test。到自己訓練,自己建立模型還有很長的路要走。
つづくReference:
https://blog.csdn.net/amusi1994/article/details/80261735?from=singlemessage
?
總結
- 上一篇: 【年度回忆录】如何做到1年90000粉丝
- 下一篇: C++常见面试题(2019年校招总结)