1. 程式人生 > >darknet訓練yolov3時的一些注意事項

darknet訓練yolov3時的一些注意事項

 

訓練需要用到的檔案:

1)       .data檔案。該檔案包含一些配置資訊,具體為訓練的總類別數,訓練資料和驗證資料的路徑,類別名稱,模型存放路徑等。

例如coco.data

classes= 80 # 訓練總類別數
train  = /newdata/hejunlin/code/darknet/data/coco/trainvalno5k.txt #訓練資料路徑
valid = /newdata/hejunlin/code/darknet/data/coco/5k.txt #驗證集路徑
names = data/coco.names #每一類名稱
backup = backup/ #模型存放路徑
eval=coco

需要用到訓練資料trainvalno5k.txt和驗證資料5k.txt。

其中,這兩個檔案內容為訓練/驗證圖片的路徑,每一行為一張影象的路徑。部分內容如下:

/home/xxx/code/darknet/data/coco/images/val2014/COCO_val2014_000000000164.jpg
/home/xxx/code/darknet/data/coco/images/val2014/COCO_val2014_000000000192.jpg
/home/xxx/code/darknet/data/coco/images/val2014/COCO_val2014_000000000283.jpg

上面的為訓練/驗證圖片資料的路徑,每一張圖片對應的標籤,即每張圖片中包含物體的bbox資訊存放在txt檔案中,txt檔名與圖片的檔名一致。標註txt檔案內容如下:

44 0.3704921875 0.6309484777517563 0.06092187500000001 0.13524590163934427
67 0.2723671875 0.781311475409836 0.5416093750000001 0.4373770491803278
1 0.6927578125 0.4888290398126464 0.170953125 0.6501639344262296
49 0.229265625 0.6178571428571429 0.034875 0.06742388758782202
51 0.10209375000000001 0.8534309133489462 0.10643750000000002 0.09562060889929742
51 0.1526015625 0.7213348946135831 0.11885937499999999 0.09672131147540983
79 0.15256250000000002 0.5000351288056206 0.300875 0.23037470725995318

其中,每一行表示圖片中一個object的類別號和bbox資訊。Bbox儲存的形式為(x,y,w,h)

分別表示object歸一化後中心點座標,寬度和高度。

 

注意:

在讀入訓練資料時,只給程式輸入了圖片所在路徑,而標籤資料的路徑並沒有直接給,是通過對圖片路徑進行修改得到的,比如在訓練coco資料時,輸入的trainvalno5k.txt檔案中只包含所有圖片的具體路徑,如:

/home/xxx/code/darknet/data/coco/images/val2014/COCO_val2014_000000000164.jpg

而COCO_val2014_000000000164.jpg的標籤並沒有給程式,是通過該函式替換掉圖片路徑中的images為labels,並替換掉字尾.jpg為.txt得到的,最終得到:

/home/xxx/code/darknet/data/coco/labels/val2014/COCO_val2014_000000000164.txt

這種替換的前提是,標籤資料資料夾labels與圖片資料資料夾images具有相同的父目錄。

         另外,直接把txt標籤檔案放在與圖片同一路徑下也沒問題。

         詳細資訊可以檢視原始碼src/data.c檔案中find_replace函式。

2)       .cfg檔案

主要包含訓練的一些配置資訊,如輸入影象大小、學習率、資料增強等。還包括訓練的網路結結構。

 

附:coco的json格式標註資訊轉換為darknet訓練的標註txt檔案。

# -*- coding:utf-8 -*-

from __future__ import print_function
import os, sys, zipfile
import numpy as np
import json

def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = box[0] + box[2] / 2.0
    y = box[1] + box[3] / 2.0
    w = box[2]
    h = box[3]
    #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)


json_file='coco/coco2017/annotations/instances_val2017.json' # # Object Instance 型別的標註


data=json.load(open(json_file,'r'))

ana_txt_save_path = "./val_coco2017/"
if not os.path.exists(ana_txt_save_path):
    os.makedirs(ana_txt_save_path)

for img in data['images']:
    print(img["id"])
    #print(img["file_name"])
    filename = img["file_name"]
    img_width = img["width"]
    img_height = img["height"]
    #print(img["height"])
    #print(img["width"])
    img_id = img["id"]
    ana_txt_name = filename.split(".")[0] + ".txt"
    f_txt = open(os.path.join(ana_txt_save_path, ana_txt_name), 'w')
    for ann in data['annotations']:
        if ann['image_id']==img_id:
            #annotation.append(ann)
            #print(ann["category_id"], ann["bbox"])
            box = convert((img_width,img_height), ann["bbox"])
            f_txt.write("%s %s %s %s %s\n"%(ann["category_id"], box[0], box[1], box[2], box[3]))
    f_txt.close()
    break

 

 

附:

Darknet YOLO 訓練問題集錦