yolov3訓練自己的資料_YOLOv4 訓練自己的資料集
阿新 • • 發佈:2020-12-14
技術標籤:yolov3訓練自己的資料yolov3訓練自己的資料集yolov4訓練自己的資料yolov4訓練自己的資料集yolov5如何執行自己的資料集yolov5訓練自己的資料
1、克隆倉庫下來。
git clone https://github.com/AlexeyAB/darknet
2、對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 - 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