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