DarkNet-YoloV3 使用教程 訓練自己的資料 GPU版本
一 Darknet-Yolov3下載與安裝
下載解壓完後,將darknet-master主資料夾的名字改為darknet
之後修改Makefile,因為是使用GPU版本,將GPU=0改為 GPU=1
然後使用make指令執行Makefile。
下載完放到主目錄下(其實哪都可以)
安裝結束
二 建立自己的資料集
沒有固定的檔案存放格式,只是希望規範管理訓練集標籤等資料。
在我建立的資料集的總目錄是_VOCdevkit,其中有各個資料集,就如資料集test0為例
my_yolov3.cfg用於儲存超引數
myv3.names儲存各個標籤的名字(按標籤升序排列,標籤從0開始)
myv3_det.data為配置檔案,用於指明訓練集,驗證集,names,backup的儲存目錄
train.txt與val.txt用於儲存訓練集和驗證集圖片的路徑
train_id.txt與val_id.txt用於儲存訓練集和驗證集圖片的名稱(無後綴)
test資料夾用於存放測試圖片
backups資料夾用於儲存訓練得到的權重
注:cfg,names,data檔案是必須的配置檔案
三 生成train.txt等檔案
以下程式碼基於 如上資料夾結構
執行以下檔案生成train.txt等檔案
import os from os import listdir SUFFIX='.JPEG' def generate_txt(source_folder,xml_source,train_dest,val_dest,train_id_dest,val_id_dest,train_num,val_num): if(xml_source!=None): file_list = os.listdir(xml_source) else: file_list = os.listdir(source_folder) train_file=open(train_dest,'a') train_id_file=open(train_id_dest,'a') train_file.seek(0) train_file.truncate() train_id_file.seek(0) train_id_file.truncate() if val_dest != None: val_file=open(val_dest,'a') val_id_file=open(val_id_dest,'a') val_file.seek(0) val_file.truncate() val_id_file.seek(0) val_id_file.truncate() num=0 for obj in file_list: name=obj.split('.')[0] path=os.path.join(source_folder,name+SUFFIX) num=num+1 if(num<=train_num): train_file.write(path+'\n') train_id_file.write(name+'\n') else: if(val_dest!=None and num<train_num+val_num): val_file.write(path+'\n') val_id_file.write(name+'\n') return source_folder='/home/lthpc/CJX/default_res/n02974003_wheel' xml_source='/home/lthpc/CJX/default_res/n02974003_wheel/n02974003' train_dest='/home/lthpc/CJX/darknet/_VOCdevkit/test0/train.txt' val_dest='/home/lthpc/CJX/darknet/_VOCdevkit/test0/val.txt' train_id_dest='/home/lthpc/CJX/darknet/_VOCdevkit/test0/train_id.txt' val_id_dest='/home/lthpc/CJX/darknet/_VOCdevkit/test0/val_id.txt' train_num=200 val_num=40 generate_txt(source_folder,xml_source,train_dest,val_dest,train_id_dest,val_id_dest,train_num,val_num)
引數解釋:
SUFFIX:圖片格式
source_folder:所有圖片存放位置
xml_source:若有xml標籤,則其為xml標籤存放位置;若無,=None
train_dest:train.txt位置,其它同理
train_num:訓練圖片數量
val_num:測試圖片數量
四 xml格式的label轉為txt格式
一般使用LabelImg進行圖片標註,生成格式為xml的標註結果,而darknet要求的格式為txt,執行以下檔案將xml轉為txt格式,txt格式的label儲存目錄為圖片存放位置
import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join sets=['train','val'] classes=['n02974003'] 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(anno_source,demo_name, image_id,img_source): in_file = open(os.path.join(anno_source,image_id+'.xml')) print(in_file) out_file = open(img_source+"/"+image_id+'.txt', '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) out_file.seek(0) out_file.truncate() 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') def main_convert(anno_source,demo_name,image_sets,img_source): for image_set in image_sets: image_ids = open('/home/lthpc/CJX/darknet/_VOCdevkit/%s/%s_id.txt' % (demo_name,image_set)).read().strip().split() for image_id in image_ids: convert_annotation(anno_source,demo_name,image_id,img_source) return main_convert('/home/lthpc/CJX/default_res/n02974003_wheel/n02974003','test0',sets, '/home/lthpc/CJX/default_res/n02974003_wheel')
引數說明:
sets不需要更改
classes:類別名稱,與xml中的obj的name相同,示例中展示了一類,若為多類請自行擴充套件陣列
anno_source:xml檔案存放位置
demo_name:專案名稱,即_VOCdevkit下子檔名稱
img_source:圖片存放位置
至此所有配置檔案生成完畢
五 訓練與測試資料
通過cd指令進入darknet子資料夾,通過如下命令進行訓練:
./darknet detector train data檔案位置 cfg檔案位置 模型位置 -gpu 使用的gpu
舉一例項如下:
./darknet detector train _VOCdevkit/test0/myv3_det.data _VOCdevkit/test0/my_yolov3.cfg darknet53.conv.74 -gpu 0,1,2,3,4
訓練過後再backups中生成權重檔案,用最大次迭代的權重進行測試,使用如下命令進行測試:
./darknet detector test data檔案位置 cfg檔案位置 權重檔案位置 測試圖片位置
舉一示例如下:
./darknet detector test _VOCdevkit/test0/myv3_det.data _VOCdevkit/test0/my_yolov3.cfg _VOCdevkit/test0/backups/my_yolov3_900.weights _VOCdevkit/test0/test/n04285008_744.JPEG
最後在命令列生成測試準確度,並在darknet下的predictions.jpg框出結果,例項如下:
六 結語
本篇為darknet-yolov3的基本操作,至於更改超引數,則自行學習,不予贅述