1. 程式人生 > >目標檢測之三 Win10 +VS2015+雙gtx Titan X使用YOLO v2訓練VOC資料

目標檢測之三 Win10 +VS2015+雙gtx Titan X使用YOLO v2訓練VOC資料

Win10 +VS2015+雙gtx Titan X使用YOLO v2訓練VOC資料

    本文主要是記錄在win10下,yolo v2訓練資料的一整個過程,網上很多是在linux下的,不得不說這個東西還是linux下方便啊,主要依賴項:

VS2015或者VS2013都可以

Opencv2.x或者opencv3.x

Cuda8.0和cudnn6.0

GitHub上下載darknet原始碼

最近老師給配了一個深度學習專用的電腦,兩路Titan X顯示卡+i7 6700K+SSD 256G+HD 4T(企業級),自己組裝,搞了一下午(電腦硬體小白)。然後裝雙系統,配環境,真的是麻煩,搞了很久。磨刀不誤砍柴工,為了以後效率高點還是值得的。

    好了,不扯淡了。回到正題,使用YOLO v2訓練VOC資料,我覺得使用yolo的朋友應該都是看上了它的速度,可以做到實時檢測,這是最大的優點。

1.  配環境

裝cuda和cudnn環境,這裡就不說了,直接官網下載下來一路預設安裝就好了,本文使用cuda8.0和cudnn6.0,cudnn下載的時候需要註冊和填一個調查問卷,很簡單這裡就不談了,網上也有很多是寫這個的。配好在cmd視窗執行nvcc –V,有出現


表示安裝成功。

為了顯示影象,這裡還安裝了opencv,隨便選一個版本,我裝了opencv2.413,具體安裝方法見我轉載的部落格(),並把環境配好,主要是環境變數和VS是屬性管理器。

2.  編譯原始檔

從GitHub上下載darknet網路的原始碼,在darknet-master\build\darknet目錄下有這些檔案,包括gpu版本和cpu版本,我們這裡選擇darknet.vcxproj,即是gpu版本,用VS

開啟一般是出錯的,不能正確載入專案,這是正常的。如果是no gpu版本的是能正常開啟的,它並不依賴cuda的環境。


這裡有一個很關鍵 的步驟,因為我們的cuda環境沒有加入到相應的VS裡面去,作者是用屬性檔案.props檔案配置的工程,所以我們需要把cuda的一些props檔案等加到相應的VS

版本里面去,很簡單。複製幾個檔案到另一個地方就行了。我們查詢發現project檔案裡面有兩處關於cuda8.0的檔案,props和target檔案,找到他們複製到VS環境中即可。Darknet.project檔案用notepad++開啟,看到如下內容:

  <ImportGroupLabel="ExtensionSettings">

    <ImportProject="$(VCTargetsPath)\BuildCustomizations\CUDA 8.0.props" />

  <ImportGroup Label="ExtensionTargets">

<ImportProject="$(VCTargetsPath)\BuildCustomizations\CUDA 8.0.targets" />

把cuda裡面的這個資料夾C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v8.0\extras\visual_studio_integration\MSBuildExtensions

所有的檔案複製到

C:\ProgramFiles (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations(注意:我的是VS2015,所以是v140,不同版本加到不同的資料夾下)

資料夾下面即可。

 

不出意外,現在就能正確開啟darknet.project。然後把include檔案、lib檔案的路徑和lib檔名新增到VS的屬性中即可

然後把lib資料夾下的lib檔名新增到聯結器的輸入裡面的附加依賴項,我的如下:

pthreadVC2.lib

cublas.lib

curand.lib

cudart.lib

opencv_core2413.lib

opencv_highgui2413.lib

opencv_imgproc2413.lib

注意:一定要新增自己對應的版本,不要複製別人的哈~

環境配好了之後,就可以直接點選重新生成檔案,正常情況下不會出錯,有出錯發到評論大家一起看看.這樣就會生成darknet.exe檔案。你可以去看一下main函式,在darknet.c檔案裡,根據不同的輸入引數,進入不同函式,執行不同的功能。


3.  開始訓練

先準備資料,我是新手,先使用VOC的資料試試水,如果用其他資料(自己的資料或者kitti資料等等),可以先轉化為voc資料格式的,GitHub上有很多原始碼教程,這裡不談了。

根據原始碼裡面的scripts資料夾下的voc_label.py檔案把voc資料格式稍作變換,使yolo網路能使用。

你把準備好的資料放到scripts資料夾下,一定做成和VOC一樣的格式。包含以下幾個資料夾Annotations,ImageSets,JPEFImages,SegmentationClass,SegmentationObject;(不做分割,後面兩個應該可以不用)Annotations中是放著所有圖片的標記資訊,以xml為字尾名.以分類檢測的資料為例,開啟ImageSets中的layout,

 

根據實際情況修改voc_label.py檔案,主要是設定sets和classes,以及資料的目錄和輸出目錄,我的是設定為3類只檢測車(car、bus)和人(person)。

在cmd視窗執行python voc_label.py後,會生成label資料夾裡面是每個圖片的groundtruth 的框座標資訊txt格式,還會在scripts目錄生成2007_train.txt檔案。圖片的絕對路徑。

 

根據自己的需求配置網路結構檔案.cfg檔案

 

darknet網路檔案,很多引數都可以改,像batch、learningrate等等,根據實際訓練情況調參。

必改的地方:最後一層filters的個數,根據classes個數決定,將它改成「(你的類別數+5)×5」。更準確地說,「this depends on the num and coords, i.e. equal to (classes +coords + 1)*num」。

Classes為你的類別數

還有就是voc.names檔案,是object的種類名稱,就寫為你自己的classes的名稱就好了

例如我的是

bus

car

person

最後一個是voc.data檔案,修改後的內容如下

classes= 3

train  =D:\HBL_data\object_detect\darknet-master\scripts/2007_train.txt

//valid  = /home/pjreddie/data/voc/2007_test.txt

names = data/voc-3.names

backup =D:\HBL_data\object_detect\darknet-master/backup/

就是種類數,train資料集的檔案位置,前面voc_label.py生成的txt檔案,我沒有用valid,註釋掉,names是自己修改後的voc.names路徑,backup是訓練好的權重檔案,前1000輪是每100輪儲存一次權重檔案,之後是每1000輪儲存一次檔案。

萬事俱備,只欠東風了。

下載預訓練權重(http://pjreddie.com/media/files/darknet19_448.conv.23)

新建一個cmd檔案寫上內容如下,直接放到cmd視窗也可以

darknet.exe detector train data/voc-3.data cfg/yolo-3.cfg pre_model/ darknet19_448.conv.23-gpus 0,1

含義如下:程式名 模組名稱 動作(train 還是test等) data配置檔案 cfg配置檔案權重檔案 –gpus (使用的gpu編號,有多個才需要寫,0,1,2,3之類的,我這裡是2個)

然後就出現了下面的截圖:

 

從上圖看到,gpu的視訊記憶體只是用了3G多,但是gpu的利用率(指計算能力)卻到了99%,說明這個網路的計算量很大呀,雖然視訊記憶體佔用不大。

我的訓練過程還沒結束,從下午3點到此時晚上8點,5個小時,訓練了14000輪,我給的maxbatch是25000,還有10000多輪呢。

過幾天用kitti的資料集再做些實驗,十幾個G的資料已經下載完備,哈哈。

參考文獻

[1]https://pjreddie.com/darknet/yolo/  官網提供了很多訓練好的模型,很良心

[2]https://arxiv.org/abs/1612.08242  yolo v2論文原文

[3] https://github.com/pjreddie/darknet  github原始碼

[4]還有很多優秀的部落格,感謝他們的貢獻

好了,本篇就到此結束,廢話有點多了~~有問題歡迎底下評論交流