1. 程式人生 > 其它 >yolov3訓練自己的資料_YOLOv4 訓練自己的資料集

yolov3訓練自己的資料_YOLOv4 訓練自己的資料集

技術標籤:yolov3訓練自己的資料yolov3訓練自己的資料集yolov4訓練自己的資料yolov4訓練自己的資料集yolov5如何執行自己的資料集yolov5訓練自己的資料

1、克隆倉庫下來。

git clone https://github.com/AlexeyAB/darknet

2、對darknet資料夾下的Makefile進行修改。(主要是增加自己nvcc的路徑,把CUDNN註釋掉,不然容易報錯,我不知道為啥)

96effa22449327e4cc64b9decdf5b154.png

820a2ffdc49d7a3ba11405391af73ab4.png

修改好了之後,可以編譯一下,編譯成功,出現可執行檔案darknet即可。

make    # 編譯

3、準備資料集:我這邊的資料集是VOC資料集,需要把轉換成YOLO格式的。在darknet資料夾下新建VOCdevkit資料夾。在VOCdevkit下新建VOC2007, VOC2007資料夾下新建Annotations(所有xml標註檔案)、ImageSets(該資料夾下再建Main資料夾下,後期生生成train.txt等檔案)、JPEGImages(所有圖片)三個資料夾。

ee9431686fbac5b101d374af8cc401ef.png

需要再Main資料夾下生成train.txt、valid.txt等,執行split_data.py,得到各個txt資料夾:

ff57c03f9017c4a8169f9b7e5de6902e.png

得到這些檔案之後需要將xml標註檔案轉換成YOLO訓練格式,執行voc_label.py。得到的標註檔案是在labels資料夾下,並且會得到一些txt檔案。

c41f0bd49b00d1ae820ac1a17b0efd68.png
# split_data.py   將JPEGImages下的所有檔案分成訓練集,測試集,生成ImageSets下Main資料夾中的txt檔案。
import os  
import random 
xmlfilepath=r'/home/simit/luming/Yolo/darknet/VOCdevkit/VOC2007/Annotations'   #自己資料集中xml的路徑                        
saveBasePath=r"/home/simit/luming/Yolo/darknet/VOCdevkit/"                     # 儲存路徑
trainval_percent=0.9                                             #adjust trainval percentage    
train_percent=0.9                                                      
total_xml = os.listdir(xmlfilepath)
num=len(total_xml)    
list=range(num)    
tv=int(num*trainval_percent)    
tr=int(tv*train_percent)    
trainval= random.sample(list,tv)    
train=random.sample(trainval,tr)    
  
print("train and val size",tv)  
print("traub suze",tr)  
ftrainval = open(os.path.join(saveBasePath,'VOC2007/ImageSets/Main/trainval.txt'), 'w')    # txt檔案儲存的路徑
ftest = open(os.path.join(saveBasePath,'VOC2007/ImageSets/Main/test.txt'), 'w')    #
ftrain = open(os.path.join(saveBasePath,'VOC2007/ImageSets/Main/train.txt'), 'w')    #
fval = open(os.path.join(saveBasePath,'VOC2007/ImageSets/Main/val.txt'), 'w')    #
  
for i  in list:    
    name=total_xml[i][:-4]+'n'    
    if i in trainval:    
        ftrainval.write(name)    
        if i in train:    
            ftrain.write(name)    
        else:    
            fval.write(name)    
    else:    
        ftest.write(name)    
    
ftrainval.close()    
ftrain.close()    
fval.close()    
ftest .close()  

voc_label.py檔案,官方提供的,改改路徑就好。

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

#sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]    # 資料夾是VOC2007
classes = ["fire"]   # 自己的標籤

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(year, 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)
        #print(str(cls_id) + " " + " ".join([str(a) for a in bb]) + 'n')
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + 'n')

wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('labels/'):
        os.makedirs('labels/')
    image_ids = open('ImageSets/Main/%s.txt'%(image_set)).read().strip().split()  # split_data.py分好的txt文件地址
    list_file = open('%s_%s.txt'%(year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('/home/simit/luming/Yolo/darknet/VOCdevkit/VOC2007/JPEGImages/%s.jpgn'%(image_id))  # 儲存地址,注意換行符要緊緊跟在.jpg後邊。
        convert_annotation(year, image_id)
    list_file.close()

os.system("cat 2007_train.txt 2007_val.txt > train.txt")
os.system("cat 2007_train.txt 2007_val.txt > train.all.txt")

3、在data資料夾下準備fire.data和fire.names。

fire.data:
classes = 1
train = train.txt    # 前面資料準備時得到的train.txt的路徑
test = test.txt      # 同上
names = data/fire.names    # fire.names的檔案路徑

fire.names裡面就是你的標籤,一行一個標籤:

fire

4、接下來修改cfg配置檔案,在cfg下有一個yolov4-custom.py,修改裡面每一個yolo層上的filters((類別數+5+1)x3)、classes = 1、batches=64。

5、開始訓練

yolov4.conv.137可以去別的地方下載。

./darknet detector train data/fire.data cfg/yolov4-custom.cfg yolov4.conv.137 -gpu 0 -map