目錄
-
代碼下載
-
更改配置及編譯
-
測試初始權重
-
准備自己的數據集
-
划分測試集和訓練集
-
將voc文件格式轉為yolo文件格式(xml->txt)
-
訓練
-
測試
1 代碼下載
首先把代碼下載下來,可以用下面命令下載,也可以直接點擊上面代碼鏈接下載。
git clone https://github.com/AlexeyAB/darknet.git
2 更改配置及編譯
如果需要使用GPU加速,那么得打開項目里面的makefile文件修改一些參數的值。修改完成之后在直接make。
GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
OPENMP=1
LIBSO=1
DEBUG=1
編譯:
make
或者 make -j8
3 測試初始權重
./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg
初始權重yolov4.weights需要下載。
4 准備自己的數據集
(1) 准備JPEGImages文件夾,里面存放要訓練和測試的圖像集。
(2)准備Annotations文件夾,里面存放標注好的voc格式的xml文件。
5 划分測試集和訓練集
運行makeTxt.py腳本文件,在ImageSets文件夾里生成train.txt和test.txt文件,里面為去除后綴的圖像名。
import os import random train_percent = 0.8 xmlfilepath = 'Annotations' txtsavepath = 'ImageSets' total_xml = os.listdir(xmlfilepath) num = len(total_xml) list = range(num) tr = int(num * train_percent) #trainval = random.sample(list, tv) train = random.sample(list, tr) if not os.path.exists('ImageSets/'): os.makedirs('ImageSets/') ftest = open('ImageSets/test.txt', 'w') ftrain = open('ImageSets/train.txt', 'w') for i in list: name = total_xml[i][:-4] + '\n' if i in train: ftrain.write(name) else: ftest.write(name) ftrain.close() ftest.close()
6 將VOC文件格式轉為yolo文件格式
運行xml2txt.py文件,在當前目錄生成tp_train.txt和tp_test.txt文件,里面存放訓練和測試圖像的絕對路徑。且在labels文件夾下生成xml轉txt格式的文件。
import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join sets=[ 'train', 'test'] #替換為自己的數據集 classes = ["person", "car", "cyclist"] #修改為自己的類別 #classes = ["eye", "nose"] def convert(size, box): dw = 1./(size[0]) dh = 1./(size[1]) x = (box[0] + box[1])/2.0 - 1 y = (box[2] + box[3])/2.0 - 1 w = box[1] - box[0] h = box[3] - box[2] x = x*dw w = w*dw y = y*dh h = h*dh return (x,y,w,h) def convert_annotation(image_id): in_file = open('Annotations/%s.xml'%image_id) #將數據集放於當前目錄下 out_file = open('labels/%s.txt'%image_id, 'w') tree=ET.parse(in_file) root = tree.getroot() size = root.find('size') w = int(size.find('width').text) h = int(size.find('height').text) for obj in root.iter('object'): difficult = obj.find('difficult').text cls = obj.find('name').text if cls not in classes or int(difficult)==1: continue cls_id = classes.index(cls) xmlbox = obj.find('bndbox') b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text)) bb = convert((w,h), b) out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') wd = getcwd()#獲取當前目錄 train_images_dir = os.path.join(wd, 'JPEGImages/') for image_set in sets: if not os.path.exists('labels/'): os.makedirs('labels/') image_ids = open('ImageSets/%s.txt'%image_set).read().strip().split() list_file = open('%s_%s.txt'%("tp", image_set), 'w') #reate new file store image path for image_id in image_ids: list_file.write(train_images_dir+'%s.jpg\n'%image_id) convert_annotation(image_id) list_file.close()
7 訓練
7.1 修改配置文件yolov4.cfg
復制cfg/yolov4-custom.cfg,並且重命名為yolo-obj.cfg,同時修改一下內容
上圖中修改width和height為416,修改最大batch迭代多少個數max_batches = 6000,修改steps多久學習率下降一次,一般設置為batch個數的80%和90%。 然后三個classes的地方和三個filters=255的地方要修改成自己的。
7.2 編輯adas.data 和 adas.names文件
(1)adas.data
classes :訓練集類別總數
train:訓練集路徑
valid:驗證集路徑
names: adas.names 文件
backup: 備份文件夾,訓練后的權重信息或者斷點保存信息在此文件夾下。
(記得創建目錄 backup)
(2)adas.name
根據自己要分類的名稱編寫,一行一個名字。
7.3 編寫訓練sh腳本
vim tp_train.sh
注:yolov4.conv.137預訓練權重文件需要下載
執行 sh tp_train.sh 開始訓練
8 測試
./darknet detector test cfg/obj.data cfg/yolo-obj.cfg yolo-obj_xxxx.weights