YOLOv3 Darknet安裝編譯與訓練自己的數據集

1安裝編譯darknet與測試darknet

1.1 安裝編譯darknet

YOLO v3的安裝與YOLO v2的安裝方法一樣

1.1.1 下載darknet安裝包

從Darknet的github官方地址,先把項目克隆下來

git clone thttps://github.com/pjreddie/darknet.git

1.1.2 編譯darknet

1、下載完以後,打開進入到安裝包路徑內

cd darknet

2、如果你的機器上有Nvidia的GPU,並且安裝了Cuda,就可以實現用GPU加速,讓yolo運行的更快。只需要對Makefile文件進行修改,然後再進行編譯即可(如果沒有GPU忽略這一步):

vi Markfile

修改如下(把對應的Flags值該爲1,相當於設置爲true):

GPU=1
CUDNN=1
OPENCV=1

3、開始編譯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>

在這裏插入圖片描述

1.2 測試darknet

1.2.1 測試單張圖片

這裏我們測試darknet yolov3在目標檢測上的效果

1、下載yolov3 的預訓練權重

wget https://pjreddie.com/media/files/yolov3.weights

2、運行demo測試

  • 測試模型:yolov3
  • cfg/yolov3.cfg:中定義的是yolov3的模型
  • yolov3.weights:是預訓練的yolov3的權重
  • data/dog.jpg:是要測試的圖片

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

在這裏插入圖片描述

detect命令是detector test命令的簡寫,`因此在測試單張圖片時,下面的兩個命令寫法是等價的:

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
# 或(上下等價)
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg

執行過程會輸出如下信息:

layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32  0.639 BFLOPs
    1 conv     64  3 x 3 / 2   608 x 608 x  32   ->   304 x 304 x  64  3.407 BFLOPs
    2 conv     32  1 x 1 / 1   304 x 304 x  64   ->   304 x 304 x  32  0.379 BFLOPs
    3 conv     64  3 x 3 / 1   304 x 304 x  32   ->   304 x 304 x  64  3.407 BFLOPs
    4 res    1                 304 x 304 x  64   ->   304 x 304 x  64
    5 conv    128  3 x 3 / 2   304 x 304 x  64   ->   152 x 152 x 128  3.407 BFLOPs
  ...
   93 conv    255  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 255  0.377 BFLOPs
   94 yolo
   95 route  91
   96 conv    128  1 x 1 / 1    38 x  38 x 256   ->    38 x  38 x 128  0.095 BFLOPs
   97 upsample            2x    38 x  38 x 128   ->    76 x  76 x 128
   98 route  97 36
   99 conv    128  1 x 1 / 1    76 x  76 x 384   ->    76 x  76 x 128  0.568 BFLOPs
  100 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
  101 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs
  102 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
  103 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs
  104 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
  105 conv    255  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 255  0.754 BFLOPs
  106 yolo
Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 0.033660 seconds.
dog: 100%
truck: 92%
bicycle: 99%
Unable to init server: 無法連接: 拒絕連接

(predictions:30960): Gtk-WARNING **: 14:23:14.658: cannot open display:

從上面輸出信息可以看到,輸入信息如下:

  • yolov3的網絡結構:包括卷積層數、卷積和大小、輸入輸出大小
  • 推理檢測需要的時間
  • 檢測到目標的置信度

然後會在當前目錄下生成檢測的結果圖predictions.jpg
在這裏插入圖片描述
結果圖如下:
在這裏插入圖片描述

注意:./darknet其他測試的時候使用其他參數

  • -i:(索引index)如果有多個GPU,可以設置使用哪一個GPU,eg: -i 1 使用第一塊GPU
  • -nogpu:使用CPU訓練,我測試了同樣上面的一張圖片,測試時間爲17秒,而且置信度也發生了變化

1.2.2 連續測試多張圖片

連續測試多張圖片命令(不在命令中指定測試圖片路徑):

./darknet detect cfg/yolov3.cfg yolov3.weights

當配置和權重加載完成時,會看到如下輸出信息提示:

./darknet detect cfg/yolov3.cfg yolov3.weights
layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32  0.299 BFLOPs
    1 conv     64  3 x 3 / 2   416 x 416 x  32   ->   208 x 208 x  64  1.595 BFLOPs
    .......
  104 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
  105 conv    255  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 255  0.353 BFLOPs
  106 detection
Loading weights from yolov3.weights...Done!
Enter Image Path:

輸入一張圖片路徑:data/horse.jpg 以使其預測該圖像的框,結果如下:
在這裏插入圖片描述
完成後,可以輸入更多次不同圖片的路徑進行測試,輸入Ctrl+C退出測試

只是顯示測試的圖片:

./darknet imtest data/dog.jpg

2.2.3 更改檢測的閾值(thresh)

默認情況下,yolo僅顯示置信度爲0.25或更高,可以通過-thresh <val>來設置閾值。例如:要顯示所有檢測,可以將閾值設置爲0

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0

可以設置不同的閾值,控制模型對閾值的限制,但是不是很有用。

2.2.4 使用Tiny YOLOv3預訓練模型測試

如果受自己機器計算資源的限制,可以使用更小的模型yolov3-tiny,其參數也更少,該預訓練模型下載:

wget https://pjreddie.com/media/files/yolov3-tiny.weights

用該模型做測試:

./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg

2.2.5 使用網絡攝像頭實時檢測

實時檢測,必須要有Nvidia GPU,因爲在CPU上檢測一張圖片的時間是10秒左右,不能夠達到實時性的要求。因爲實時檢測會用到CUDA 和 OpenCV,因此要在/darknet/Makefile被編譯之前,修改Makefie文件中的GPU=1 和OPENCV=1都設置爲1

1、實時網絡攝像頭檢測,運行如下命令:

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

如果你有多個攝像頭,可以使用-c <num>參數指定使用哪一個攝像頭

2、實時檢測視頻文件,運行如下命令:

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

2 darknet訓練自己的數據集

2.1 數據集的準備

2.1.1 使用labelImg工具標註自己的數據集

2.1.2 標記好的數據存放位置

1、標記好數據文件結構

首先將自己的數據集標記生成爲VOC數據集的格式,至少生成如下格式的文件夾:

Annotations
ImageSets
       --Main
           --test.txt
           --train.txt
           --trainval.txt
           --val.txt
JPEGImages
  • Annotations:該文件夾存放的是標記數據集xml文件(VOC數據集格式)
  • JPEGImage:該文件夾存放的是待標記原始數據集
  • ImageSets/Main:該文件夾存放的是劃分數據集的文件名,文件中的文件名不包含文件後綴

2、標記好數據放到Darknet項目的位置

/darknet/scripts/VOCdevkit/VOC2007

VOCdevkit和VOC兩個文件夾需要自己創建:

mkdir -p scripts/VOCdevkit/VOC2007

然後把上面的Annotations、ImageSets、JPEGImage三個文件夾放到VOC2007文件夾下

2.1.3 修改和數據類別相關文件

/darknet/scripts/voc_label.py文件進行修改:

1、第一處:修改第7行修改數據集

sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

# 修改爲如下:
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

2、第二處:修改第9行修改數據集的類別,改爲自己數據集定義的類別

# 把下面類表中定義的類別換成自己定義的類別即可
 classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]

需要的文件:

  • 標記的xml文件,在VOCdevkit/VOC2007/Annotations下
  • 劃分數據集的文件:ImageSets/Main/train.txt,test.txt,val.txt 裏面存的是圖片的名字

修改完成以後,運行:voc_label.py文件,生成YOLO訓練時使用的labels (labels包含標註物體的位置和類別信息)

python voc_label.py

生成的文件:
運行結束以後,可以在/darknet/scripts/VOCdevkit/VOC2007文件夾內看到labels文件夾,文件夾下是把VOC格式標籤文件xml文件轉換爲的YOLO格式標籤txt文件

  • 生成訓練數據集大小的n個YOLO格式的txt文件
  • /darknet/scripts文件夾內會生成2007_train.txt2007_test.txt2007_val.txt三個文件(文件中的內容是數據集的絕對路徑

eg:008890.txt 是轉換後的,第一個數是類別標籤,後面的是框的中心座標以及框的寬和高

(yolo) dw@estar-cvip:/HDD/shl/1_YOLO/darknet-master/scripts/VOCdevkit/VOC2007/labels$ cat 008890.txt
11 0.6213333333333333 0.401 0.6613333333333333 0.19

到這裏數據的準備工作就已經全部完成了


下面詳細講解一下:voc_labe.py主要做了什麼事

voc_label.py:主要是把標籤框的標籤進行了歸一化

1)標註好的VOC格式的標籤xml文件,存儲的主要信息爲:

  • 圖片的名字
  • 圖片的高height、寬width、通道depth
  • 標定框的座標位置:xmin、ymin、xmax、ymax

例如下圖代表的是一樣圖片:

  • 紅框代表的是原圖大小:height=8,width=8
  • 藍框代表的是標註物體的框:左上角座標爲 (xmin, ymin)=(2,2),右下角的座標爲 (xmax, ymax)=(6,6)
    在這裏插入圖片描述
    voc_label.py目的就是把標註爲VOC格式數據轉化爲標註爲yolo格式數據
  • VOC格式標籤:圖片的實際寬和高,標註框的左上角和右下角座標
  • YOLO格式標籤:標註框的中心座標(歸一化的),標註框的寬和高(歸一化的)

VOC格式標籤轉換爲YOLO格式標籤計算公式:

框中心的實際座標(x, y):(一般可能還會在後面減去1)
x_rel=xman+xmin2=6+22=4x\_rel=\frac{xman+xmin}{2}=\frac{6+2}{2}=4
y_rel=yman+ymin2=6+22=4y\_rel=\frac{yman+ymin}{2}=\frac{6+2}{2}=4

框歸一化後的中心座標(x, y):
x=x_relwidth=48=0.5x=\frac{x\_rel}{width}=\frac{4}{8}=0.5
y=y_relheight=48=0.5y=\frac{y\_rel}{height}=\frac{4}{8}=0.5

框的高和框(歸一化的):
w=xmaxxminwidth=628=0.5w=\frac{xmax-xmin}{width}=\frac{6-2}{8}=0.5
h=ymaxyminheight=628=0.5h=\frac{ymax-ymin}{height}=\frac{6-2}{8}=0.5

2.2 開始訓練自己的數據集

darknet訓練命令:

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23

上邊是進行訓練的命令,可以按照上邊的命令對文件進行修改。

2.3 修改訓練的配置文件

可對上面的訓練命令,對文件進行修改

2.3.1 修改cfg/voc.data

classes= 20              //修改爲訓練分類的個數 
train  = /home/ws/darknet/scripts/2007_train.txt          //修改爲數據階段生成的2007_train.txt文件路徑
valid  = /home/ws/darknet/scripts/2007_val.txt           //修改爲數據階段生成的2007_val.txt文件路徑
names = data/voc.names
backup = backup

2.3.2 修改data/voc.names

在上邊修改的文件內有一個data/voc.names文件,裏邊保存目標分類的名稱,修改爲自己類別名稱即可。

2.3.3 修改cfg/yolo-voc.cfg

第一處
文件開頭的配置文件可以按照下邊的說明進行修改

# Testing
#batch=1
#subdivisions=1
# Training
batch=64                //每次迭代要進行訓練的圖片數量 ,在一定範圍內,一般來說Batch_Size越大,其確定的下降方向越準,引起的訓練震盪越小。 
subdivisions=8          //源碼中的圖片數量int imgs = net.batch * net.subdivisions * ngpus,按subdivisions大小分批進行訓練 
height=416              //輸入圖片高度,必須能被32整除
width=416               //輸入圖片寬度,必須能被32整除
channels=3              //輸入圖片通道數
momentum=0.9            //衝量
decay=0.0005            //權值衰減
angle=0                 //圖片角度變化,單位爲度,假如angle=5,就是生成新圖片的時候隨機旋轉-5~5度    
saturation = 1.5        //飽和度變化大小
exposure = 1.5          //曝光變化大小
hue=.1                  //色調變化範圍,tiny-yolo-voc.cfg中-0.1~0.1 
learning_rate=0.001     //學習率
burn_in=1000
max_batches = 120200    //訓練次數
policy=steps            //調整學習率的策略
steps=40000,80000       //根據batch_num調整學習率,若steps=100,25000,35000,則在迭代100次,25000次,35000次時學習率發生變化,該參數與policy中的steps對應
scales=.1,.1             //相對於當前學習率的變化比率,累計相乘,與steps中的參數個數保持一致;

**注意:**如果修改max_batches總的訓練次數,也需要對應修改steps,適當調整學習率。
具體的含義可以查看YOLO網絡中參數的解讀

第二處
修改107行最後一個卷積層filters,按照filter=5*(classes+5)來進行修改。如果類目爲3,則爲5*(3+5)=40。

[convolutional]
size=1
stride=1
pad=1
filters=40      //計算公式爲:filter=3*(classes+5) 
activation=linear

第三處
修改類別數,直接搜索關鍵詞“classes”即可,全文就一個。

classes=3

修改好之後,可以開始進行訓練:

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23 >> log.txt

輸入上邊的指令就可以進行訓練,在命令最後的命令>> log.txt是將輸出的日誌保存到log.txt文件內,這樣便於後期訓練結果的查看。

3 測試

3.1 單張圖像測試

./darknet detect cfg/yolo-voc.cfg backup/yolo-voc_final.weights data/dog.jpg

./darknet detect [訓練cfg文件路徑] [權重文件路徑] [檢測圖片的路徑]

按照上邊的格式進行填寫即可。

3.2 多張圖像測試

./darknet detect cfg/yolov3.cfg yolov3.weights

3.3 網絡攝像頭或視頻文件測試

加一個參數demo
1、網絡攝像頭實時檢測

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

2、視頻文件實時檢測

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

3.3 測試數據集測試mAP、recall等參數

參考1:https://pjreddie.com/darknet/install/
參考2:https://pjreddie.com/darknet/yolo/ # yolov3訓練自己的數據集
參考3:https://blog.csdn.net/qq_35451572/article/details/80384674
參考4:https://www.cnblogs.com/laozhanghahaha/p/10527474.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章