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.txt
、2007_test.txt
、2007_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, y):
框的高和框(歸一化的):
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