在Windows系統的Linux系統中用yolo訓練自己的數據集的配置差異很大,今天總結在win10中配置yolo並進行訓練和測試的全過程。
提綱:
1.下載適用於Windows的darknet
2.安裝VS和CUDA、CUDNN、OpenCV
1)安裝VS2017
2)安裝OpenCV
3)VS配置OpenCV
4)安裝CUDA10.0和CUDNN7.5
5)VS配置CUDA
3. 編譯darknet
4.訓練自己的數據集
5.開始訓練
6.測試
1.下載適用於Windows的darknet
git clone https://github.com/AlexeyAB/darknet
這個適用於Windows和Linux
而前面博客中的:https://github.com/pjreddie/darknet
是只適用於Linux的。
2.安裝VS和CUDA、CUDNN、OpenCV
1)安裝VS2017
可以在官網找:vs2017:https://visualstudio.microsoft.com/zh-hans/downloads/
我是在學校的軟件中心找的安裝包。
2)安裝OpenCV
opencv-3.4.1-vc14_vc15.exe,vc15表示VS2017(vc10表示VS2010,vc11表示VS2012,vc12表示VS2013,vc14表示VS2015),其他opencv的版本也可以的。
https://opencv.org/releases.html
直接雙擊安裝,安裝好之后要添加環境變量。選擇控制面板->系統和安全->系統->高級系統設置->環境變量->系統變量,找到Path,編輯Path變量,在變量值中添加路徑“D:\opencv-3.4.1\opencv\build\x64\vc15\bin”其中D:\opencv-3.4.1\opencv是opencv的安裝路徑。
3)VS配置OpenCV
VS2017中新建項目
把配置改成release和x64,現在的電腦應該大部分都是64位的。如果是32位,選x86
左菜單欄選擇視圖—>其它窗口—>屬性管理器,點擊項目名字左邊的小三角形——debug|x64,如果是32位系統,選Win32。雙擊 Microsoft.Cpp.x64.user彈出屬性頁
VC++ 目錄—>包含目錄—>編輯,添加以下三項(對於自己的安裝路徑)
D:\opencv-3.4.1\opencv\build\include\opencv
D:\opencv-3.4.1\opencv\build\include
D:\opencv-3.4.1\opencv\build\include\opencv2
在庫目錄中添加:
D:\opencv-3.4.1\opencv\build\x64\vc15\lib
然后選擇連接器—>輸入—>附加依賴項,復制以下兩個:opencv_world341d.lib表示debug,opencv_world341.lib表示release。也可以只添加opencv_world341d.lib,因為前面我們選擇的debug|x64,我這里兩個都放進去了。D:\opencv-3.4.1\opencv\build\x64\vc15\lib(路徑根據自己的)中確認一下這兩個文件有沒有。
opencv_world341d.lib
opencv_world341.lib
最后點擊右下角的應用,再點確認就會生效!
4)安裝CUDA10.0和CUDNN7.5
CUDA下載地址:https://developer.nvidia.com/cuda-downloads
默認安裝就行,記住安裝的位置,安裝完成后要配置環境變量:控制面板->系統和安全->系統->高級系統設置->環境變量->系統變量,找到Path,編輯Path變量,在變量值中添加路徑:
驗證是否安裝成功:
cmd下輸入:
nvcc -V
有如下信息表示安裝成功
驗證環境變量:
CUDNN下載地址:https://developer.nvidia.com/rdp/cudnn-download,要注冊賬號才能下載。
(由於我的賬號現在不記得密碼了,就不放截圖了~~)
將下載下來的包解壓縮后應該是三個文件夾,對應名稱copy到CUDA的安裝目錄下的對應文件夾。最后把C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\x64添加到環境變量中。
5)VS配置CUDA
這部分我參考的這篇博客:https://blog.csdn.net/HaleyDong/article/details/86093520
3. 編譯darknet
按照官網的步驟進行編譯:
有幾點要注意:
.\darknet\build\darknet修改darknet.vcxproj文件,由於darknet.vcxproj 中使用的是CUDA 9.1,所以要將所有CUDA 9.1修改為自己對應的CUDA版本。
用VS2017打開darknet.sln,因為這個是VS2015版本的,所以打開后需要進行重定向,在項目上右鍵-重定向項目,然后設置 x64 and Release模式,再編譯:生成-生成darknet。成功后會在. \darknet\build\darknet\x64中生成darknet.exe,完成編譯。
到opencv的安裝目錄下找到兩個文件:D:\opencv-3.4.1\opencv\build\x64\vc15\bin下復制opencv_world341.dll和opencv_ffmpeg341_64.dll到.\darknet\build\darknet\x64\darknet.exe所在目錄下。
下載預訓練權重文件:https://pjreddie.com/media/files/yolov3.weights,下載后放在.\darknet\build\darknet\build\darknet\x64下,打開該目錄,雙擊darknet_yolo_v3.cmd會出現那張狗狗的照片及檢測結果,說明編譯成功了。
4.訓練自己的數據集
1)下載http://pjreddie.com/media/files/darknet53.conv.74預訓練權重文件到. \darknet\build\darknet\x64
2)從.\ darknet\build\darknet\x64\cfg中復制yolo3.cfg到.\ darknet\build\darknet\x64並命名為yolo-obj.cfg(名字自己隨意)。修改每一個yolo層上面一層的filters和yolo層的classes,classes是類別數,filters = (classes+5)*3。改成train模式,可以修改batch_size和subdivisions。max_batches修改為classes*2000,這個也可以自己定。steps=max_batches*80%,max_batches*90%
從. \darknet\cfg中復制voc.names到. \darknet\build\darknet\x64\data中,命名為obj.names,修改,每一行是一個類別名。復制voc.data到. \darknet\build\darknet\x64\data中,命名為obj.data,根據自己的路徑修改里面的內容。
3)將所有訓練圖片和對應的txt文件一起放在. \darknet\build\darknet\x64\data\obj中,測試圖片放在. \darknet\build\darknet\x64\data\test中,生成train.txt和test.txt(路徑在obj和test):
import os # 遍歷指定目錄,目錄下的所有文件 def eachFile(filepath): pathDir = os.listdir(filepath) for allDir in pathDir: if filetype in allDir: child = os.path.join('%s%s' % (filepath, allDir)) #print(child.decode('gbk')) # .decode('gbk')是解決中文顯示亂碼問題 #print(child) fopen.write(child+'\n') fopen.close() if __name__ == '__main__': filePath = "路徑\\train.txt"#這里替換成你的路徑,test.txt對應改路徑 filePathC = "路徑\\darknet\\build\\darknet\\x64\\data\\obj\\"#這里替換成你的路徑,訓練或測試圖片的路徑 filetype ='.jpeg'#圖片后綴 fopen = open(filePath, 'a') eachFile(filePathC)
在. \darknet\build\darknet\x64中新建backup文件夾,存放訓練的權重文件,新建log文件夾存放訓練過程的數據。
4)修改保存權重文件的迭代間隔,在. \darknet\src\detector.c的第271行左右修改。
5.開始訓練
打開cmd,cd到\darknet\build\darknet\x64中,執行:
darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74
若不想顯示average loss曲線,執行:
darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -dont_show
若要保存log日志,執行:
darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 >> log/train_yolov3.log
現在就開始訓練啦!!
中斷訓練后再次訓練時將上述命令的權重文件修改成backup/權重文件名。
若遇到cuda error:out of memory錯誤,調整batch_size和subdivisions,batch_size改小,分批數subdivisions可以設置成等於batch_size。
6.測試
命令行測試方法:在. \darknet\build\darknet\x64下游很多.cmd文件,里面就是一些命令,可以打開查看,選擇對應的一些命令進行測試!
我們還可以連接攝像頭(USB攝像頭)進行實時檢測:
darknet.exe detector demo cfg/coco.data yolov3.cfg yolov3.weights
當然,大多數時候我們都需要用腳本來測試,才能達到目的,這就涉及到yolo的封裝,另外一篇博文里會詳細講解!