博客主要結構
1. 如何在ubuntu18.04上安裝yolo
2 .如何配置yolov3
3 .如何制作自己的訓練集測試集
4 .如何在自己的數據集上運行yolov3
1. 在ubuntu18.04下安裝yolov3
安裝darknet
按ctrl+atl+t 打開終端, 並在終端下依次輸入以下命令
git clone https://github.com/pjreddie/darknet.git cd darknet make
如果成功的話你會看到以下信息
mkdir -p obj gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast.... gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast.... gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast.... ..... gcc -I/usr/local/cuda/include/ -Wall -Wfatal-errors -Ofast -lm....
編譯完成后鍵入以下命令運行darknet
./darknet
你將會看到以下輸出結果
usage: ./darknet <function>
使用GPU編譯(可選)
如果想讓yolo運行的更快的話, 可以使用GPU 加速。你的電腦中應該有Nvidia GPU 並安裝cuda。 在安裝完cuda后,在本目錄下修改 Makefile第一行
GPU=1
然后在終端鍵入
make
這樣就可以使用cuda啦, darknet在默認情況下會使用你系統里第零個塊顯卡 (如果你成功安裝了cuda, 在終端輸入nvidia-smi可以看到自己的顯卡情況)。 如果你想修改darknet可以使用的顯卡,你可以給他一個可選的命令 -i <index>, 例如
./darknet -i 1 imagenet test cfg/alexnet.cfg alexnet.weights
這樣darknet就會使用你的第一塊顯卡。
下載pre-trained model
可以在這里下載預訓練模型, 或者在終端輸入以下命令
wget https://pjreddie.com/media/files/yolov3.weights
然后訓練你的detector
./darknet detect cfg/yolov3.cfg yolov3.weights data/eagle.jpg
正常情況下你會看到如下輸出
darknet會把他的檢測的結果, 以及confidence輸出出來,因為我沒有在darknet下編譯opencv所以檢測結果不會直接顯示出來, 他會把這個結果保存在你的darknet目錄下。
2 .配置yolov3
在darknet目錄下創建一個dataset子目錄, 並在dataset中創建yolo-tiny-obj.cfg 文件, 文件內容與yolov3_tiny.cfg(在darknet/cfg文件夾下)相同(可以直接把yolov3_tiny.cfg的文件內容復制過去), 然后
- 把batch所在行修改為batch=64
- 把subdivision設置為8
- 在每個[yolo]-層, 把classes=80修改成你要檢測的類的數量
https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg#L135
https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg#L176
- 在每個[yolo]-層前的[convolution]-層中,修改filters=255, 改成filters=(classes+5)*3(只適用於yolov3, 對於yolov2如何計算filters,google/百度一下)
https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg#L127
https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg#L171
因此如果classes=1, 那么filters=18, 如果classes=2, 那么filters=21
(不要在cfg文件里這樣寫:filters=(classes+5)*3)
(一般情況下, filters取決於classes, coords, 以及mask的數量, 例如filters = (classes+coords+1)*<numbers of mask>, 這里的mask就是anchors的索引, 如果沒有mask, 那么filters=(classes+coords+1)*num)
比如, 只有兩個類, 那么你的yolo-tiny-obj.cfg 在每個yolo層中應該是如下設置
[convolutional] filters=21 [region] classes=2
在/darknet/dataset創建obj.names文件, 每行是你的類的名字, 如果你要檢測的是貓和狗, 那么你的obj.names文件內容如下
cat dog
在/darknet/dataset創建obj.data文件, 包含如下內容, (classes=你要檢測的類的數量)
classes= 2 train = dataset/train.txt valid = dataset/test.txt names = dataset/obj.names backup = backup/
3. 制作自己的訓練集測試集
首先把你的訓練集(測試集)圖片放到/darknet/dataset/Train (/darknet/dataset/Test ) , 圖片擴展名為.jpg
然后對你數據集圖片上的每個物體作標記,你可以用這個工具在圖片上畫邊框, 並生成標記文件。他會在同一個目錄下,給每個.jpg文件生成一個名字相同的.txt文件,文件里應該包含物體的類的編號, 以及物體在圖片中的坐標,每一行都表示一個物體 <物體類的編號><x_center> <y_center> <width> <height>
- <類的編號> :是正整數, 從0-<類的數目-1>
<x_center> <y_center> <width> <height>
:都是浮點數范圍從0到1,通過圖片的長寬計算得出,例如<y_center>=<邊框中心的縱坐標>/圖片的高,<height> = <邊框的高>/圖片的高- 注意<x_center> <y_center>:是你畫得邊框的中心
比如對於img1.jpg你會創建一個img1.txt文件,包含以下內容
1 0.716797 0.395833 0.216406 0.147222 0 0.687109 0.379167 0.255469 0.158333 1 0.420312 0.395833 0.140625 0.166667
在/darknet/dataset目錄下創建train.txt文件,文件中每一行都是到你訓練集的地址, 可以使絕對路徑, 也可以是相對路徑, (相對darknet這個文件夾的路徑), 例如文件內容如下
dataset/Train/img1.jpg dataset/Train/img2.jpg dataset/Train/img3.jpg
這里你需要重新根據你自己的數據集計算anchors值, 可以參開這個python script 來計算, 然后把yolo-tiny-obj.cfg文件中的anchors值替換成你計算的結果
4 .在自己的數據集上運行yolov3
下載yolov3-tiny的權重文件:https://pjreddie.com/media/files/yolov3-tiny.weights 到darknet目錄下
在終端輸入以下命令得到預訓練模型yolov3-tiny.conv.15
./darknet partial dataset/yolo-tiny-obj.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15
輸入以下命令開始訓練
./darknet detector train dataset/obj.data dataset/yolo-tiny-obj.cfg yolov3-tiny.conv.15
如果一切正常應該是這樣的結果
如果你運行中出現了nan, 這是正常現象,但如果全部都是nan的話,這就是訓練過程出了問題,請仔細檢查每一步是否按照操作進行