如何使用yolov3訓練自己的數據集


博客主要結構

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的話,這就是訓練過程出了問題,請仔細檢查每一步是否按照操作進行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM