darknet版本yolov4模型訓練與測試


目錄

  • 代碼下載

  • 更改配置及編譯

  • 測試初始權重

  • 准備自己的數據集

  • 划分測試集和訓練集

  • 將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 

 

 

 


免責聲明!

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



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