yolov3训练自己的数据_YOLOv4 训练自己的数据集
1、克隆倉庫下來。
git clone https://github.com/AlexeyAB/darknet2、對darknet文件夾下的Makefile進行修改。(主要是增加自己nvcc的路徑,把CUDNN注釋掉,不然容易報錯,我不知道為啥)
修改好了之后,可以編譯一下,編譯成功,出現可執行文件darknet即可。
make # 編譯3、準備數據集:我這邊的數據集是VOC數據集,需要把轉換成YOLO格式的。在darknet文件夾下新建VOCdevkit文件夾。在VOCdevkit下新建VOC2007, VOC2007文件夾下新建Annotations(所有xml標注文件)、ImageSets(該文件夾下再建Main文件夾下,后期生生成train.txt等文件)、JPEGImages(所有圖片)三個文件夾。
需要再Main文件夾下生成train.txt、valid.txt等,運行split_data.py,得到各個txt文件夾:
得到這些文件之后需要將xml標注文件轉換成YOLO訓練格式,運行voc_label.py。得到的標注文件是在labels文件夾下,并且會得到一些txt文件。
# 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 - 1y = (box[2] + box[3])/2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x*dww = w*dwy = y*dhh = h*dhreturn (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').textcls = obj.find('name').textif cls not in classes or int(difficult)==1:continuecls_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里面就是你的標簽,一行一個標簽:
fire4、接下來修改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總結
以上是生活随笔為你收集整理的yolov3训练自己的数据_YOLOv4 训练自己的数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 艾滋病ppt模板_ppt模板世界艾滋病日
- 下一篇: windows网络编程基础知识有哪些