1. 程式人生 > >YOLOv3訓練自己的資料詳細步驟

YOLOv3訓練自己的資料詳細步驟

1. 下載YOLOv3工程專案

git clone https://github.com/pjreddie/darknet  
cd darknet  

2. 修改Makefile配置,使用GPU訓練,修改如下:

GPU=1 #如果使用GPU設定為1,CPU設定為0
CUDNN=1  #如果使用CUDNN設定為1,否則為0
OPENCV=0 #如果呼叫攝像頭,還需要設定OPENCV為1,否則為0
OPENMP=0  #如果使用OPENMP設定為1,否則為0
DEBUG=0  #如果使用DEBUG設定為1,否則為0

CC=gcc
NVCC=/home/user/cuda-9.0/bin/nvcc   #NVCC=nvcc 修改為自己的路徑
AR=ar ARFLAGS=rcs OPTS=-Ofast LDFLAGS= -lm -pthread COMMON= -Iinclude/ -Isrc/ CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC ... ifeq ($(GPU), 1) COMMON+= -DGPU -I/home/hebao/cuda-9.0/include/ #修改為自己的路徑 CFLAGS+= -DGPU LDFLAGS+= -L/home/hebao/cuda-9.0/lib64 -lcuda -lcudart -lcublas -lcurand #修改為自己的路徑
endif

儲存完成後,在此路徑下執行make,如果出現如下錯誤:

Loadingweights from yolo.weights...Done!
CUDA Error:invalid device function
darknet: ./src/cuda.c:21: check_error: Assertion `0' failed.
Aborted (core dumped)

這是因為配置檔案Makefile中配置的GPU架構和本機GPU型號不一致導致的。更改前預設配置如下(不同版本可能有變):

ARCH= -gencode arch=compute_30,code=sm_30 \
      -gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \ -gencode arch=compute_52,code=[sm_52,compute_52] # -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated? # This is what I use, uncomment if you know your arch and want to specify # ARCH= -gencode arch=compute_52,code=compute_52

然後重新編譯即可:
這裡寫圖片描述

3. 準備訓練資料集

按下列資料夾結構,將訓練資料集放到各個資料夾下面,生成4個訓練、測試和驗證txt檔案列表
VOCdevkit
—VOC2007
——Annotations
——ImageSets
———Layout
———Main
———Segmentation
——JPEGImages
Annotations中是所有的xml檔案
JPEGImages中是所有的訓練圖片
Main中是4個txt檔案,其中test.txt是測試集,train.txt是訓練集,val.txt是驗證集,trainval.txt是訓練和驗證集。

3. 生成2007_train.txt和2007_val.txt檔案

修改sets為訓練樣本集的名稱
sets=[('2007', 'train')]
修改classes為訓練樣本集的類標籤
classes=[str(i) for i in range(10)]

執行python voc_label.py,生成2007_train.txt訓練檔案列表。

4.下載Imagenet上預先訓練的權重

wget https://pjreddie.com/media/files/darknet53.conv.74 

5. 修改cfg/voc.data

classes= 10  #classes為訓練樣本集的類別總數
train  = /home/user/darknet/2007_train.txt  #train的路徑為訓練樣本集所在的路徑
valid  = /home/user/darknet/2007_val.txt  #valid的路徑為驗證樣本集所在的路徑
names = data/voc.names  #names的路徑為data/voc.names檔案所在的路徑
backup = backup

6. 在darknet資料夾下面新建資料夾backup

7. 修改data/voc.name為樣本集的標籤名

0
1
2
3
4
5
6
7
8
9

8. 修改cfg/yolov3-voc.cfg

關於cfg修改,以10類目標檢測為例,主要有以下幾處調整(藍色標出):

[net]
# Testing            ### 測試模式                                          
# batch=1
# subdivisions=1
# Training           ### 訓練模式,每次前向的圖片數目 = batch/subdivisions 
batch=64
subdivisions=16
width=416            ### 網路的輸入寬、高、通道數
height=416
channels=3
momentum=0.9         ### 動量 
decay=0.0005         ### 權重衰減
angle=0
saturation = 1.5     ### 飽和度
exposure = 1.5       ### 曝光度 
hue=.1               ### 色調
learning_rate=0.001  ### 學習率 
burn_in=1000         ### 學習率控制的引數
max_batches = 50200  ### 迭代次數                                          
policy=steps         ### 學習率策略 
steps=40000,45000    ### 學習率變動步長 
scales=.1,.1         ### 學習率變動因子  



[convolutional]
batch_normalize=1    ### BN
filters=32           ### 卷積核數目
size=3               ### 卷積核尺寸
stride=1             ### 卷積核步長
pad=1                ### pad
activation=leaky     ### 啟用函式

......

[convolutional]
size=1
stride=1
pad=1
filters=45  #3*(10+4+1)
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=10  #類別
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0  #1,如果視訊記憶體很小,將random設定為0,關閉多尺度訓練;
......

[convolutional]
size=1
stride=1
pad=1
filters=45  #3*(10+4+1)
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=10  #類別
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0  #1,如果視訊記憶體很小,將random設定為0,關閉多尺度訓練;
......

[convolutional]
size=1
stride=1
pad=1
filters=45  #3*(10+4+1)
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=10  #類別
num=9
jitter=.3  # 資料擴充的抖動操作
ignore_thresh = .5  #文章中的閾值1
truth_thresh = 1  #文章中的閾值2
random=0  #1,如果視訊記憶體很小,將random設定為0,關閉多尺度訓練;

9. 開始訓練

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1

10. 識別

將訓練得到的weights檔案拷貝到darknet/weights資料夾下面

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