製作自己的yolo2資料集進行訓練
阿新 • • 發佈:2019-01-01
說明
本文承接上一篇修改yolo2相關配置的部落格,用來說明如何製作自己的訓練資料,。主要流程就是手動標註目標資訊了,當然,圖片首先要自己準備好。
注意:本文的識別型別只有1類
工具
- 畫框程式 https://github.com/puzzledqs/BBox-Label-Tool
- 格式轉換程式https://github.com/Guanghan/darknet?files=1 ——主要是用這裡的scripts/convert.py 轉換格式
畫框程式介紹
首先將該程式下載並解壓,會得到一個BBox-Label-Tool-master的資料夾,裡面還有Examples,Images,Labels三個資料夾。
將自己的圖片整合成一個資料夾,然後命名為002(003,004)這種形式,拷貝進Examples和Images裡。(不知道為啥要同時拷到兩個資料夾中,反正我拷到一箇中用不了)
- 通過命令列進入該資料夾,輸入:
python main.py
可以得到如下畫面:
在image Dir的框中輸入2(3,4),就是你拷進去的資料夾名。然後就會顯示影象了,此時就可以開始慢慢的標記了,每標完一張圖要點選“next>>”才會儲存,txt儲存在labels資料夾下。
注意:該程式預設只能讀取.JPEG的檔案,如果你的圖片是.jpg是讀取不到的。 解決方法:編輯main.py,用CTRL+F搜尋JPEG,在134行和152行左右修改“.JPEG”為“ .jpg”即可。
標記完成後進入labels資料夾,會出現對應的txt檔案,檔案內容類似如下:
2
112 73 155 154
205 128 277 154
第一行表示個數,第二行開始表示框的位置和大小。前兩個數表示框的左上角頂點,後兩個數表示框的長和寬。
現在我們就得到了圖片和相應的標記了,但是還不能開始訓練,因為要將標籤轉化為yolo所需要的格式。
格式轉化程式
首先將該程式下載並解壓,我們僅需用到scripts/convert.py。這裡要修改convert.py,我加中文註釋的地方是需要修改的。
# -*- coding: utf-8 -*-
"""
Created on Wed Dec 9 14:55:43 2015
This script is to convert the txt annotation files to appropriate format needed by YOLO
@author: Guanghan Ning
Email: [email protected]
"""
import os
from os import walk, getcwd
from PIL import Image
classes = ["ship"] #修改為自己的類別
def convert(size, box):
dw = 1./size[0]
dh = 1./size[1]
x = (box[0] + box[1])/2.0
y = (box[2] + box[3])/2.0
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)
"""-------------------------------------------------------------------"""
""" Configure Paths"""
mypath = "/home/maqy/下載/BBox-Label-Tool-master/Labels/002/" #修改為自己的原標籤所在地
outpath = "/home/maqy/下載/output/002/" #轉化後的標籤儲存的地方,注意002這個資料夾也要存在
cls = "ship" #修改為自己的類別
if cls not in classes:
exit(0)
cls_id = classes.index(cls)
wd = getcwd()
list_file = open('%s/%s_list.txt'%(wd, cls), 'w')
""" Get input text file list """
txt_name_list = []
for (dirpath, dirnames, filenames) in walk(mypath):
txt_name_list.extend(filenames)
break
print(txt_name_list)
""" Process """
for txt_name in txt_name_list:
# txt_file = open("Labels/stop_sign/001.txt", "r")
""" Open input text files """
txt_path = mypath + txt_name
print("Input:" + txt_path)
txt_file = open(txt_path, "r")
lines = txt_file.read().split('\n') #for ubuntu, use "\r\n" instead of "\n",這裡我用“\r\n”會報錯,根據情況修改
""" Open output text files """
txt_outpath = outpath + txt_name
print("Output:" + txt_outpath)
txt_outfile = open(txt_outpath, "w")
""" Convert the data to YOLO format """
ct = 0
for line in lines:
print('lenth of line is: ')
print(len(line))
print('\n')
if(len(line) >= 2):
ct = ct + 1
print(line + "\n")
elems = line.split(' ')
print(elems)
xmin = elems[0]
xmax = elems[2]
ymin = elems[1]
ymax = elems[3]
#
img_path = str('%s/images/%s/%s.jpg'%(wd, cls, os.path.splitext(txt_name)[0])) #這裡是訓練圖片路徑,
#可以做相應的修改或者把訓練圖片拷貝過來,
#注意與原版yolo中的Images檔名首字母I的大小寫是不同的。 應該是通過這個路徑讀取圖片的長寬
print("wd:"+wd+"cls"+cls+"os.path"+os.path.splitext(txt_name)[0])
#t = magic.from_file(img_path)
#wh= re.search('(\d+) x (\d+)', t).groups()
print("wd:"+wd+" cls:"+cls+" os.path:"+os.path.splitext(txt_name)[0])
im=Image.open(img_path)
w= int(im.size[0])
h= int(im.size[1])
#w= 256
#h= 256
#w = int(xmax) - int(xmin)
#h = int(ymax) - int(ymin)
# print(xmin)
print(w, h)
b = (float(xmin), float(xmax), float(ymin), float(ymax))
bb = convert((w,h), b)
print(bb)
txt_outfile.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
""" Save those images with bb into list"""
if(ct != 0):
list_file.write('%s/images/%s/%s.jpg\n'%(wd, cls, os.path.splitext(txt_name)[0]))
list_file.close()
然後在scripts/images/目錄下建立一個資料夾,名為程式碼段中修改過的cls的值。
cls = "ship" #修改為自己的類別
(我的即是ship) 的資料夾,將之前進行過標註的圖片拷貝進去。然後在目錄下執行:
python convert.py
此時在你的輸出目錄下就有改好的txt檔案了。
準備訓練
回到自己的darknet目錄,進入scripts目錄,將圖片和標籤複製進來,並建立train.txt檔案。
其中Images中儲存的是圖片,labels中儲存的是修改完後的標籤。train.txt中儲存訓練圖片的地址。
不過建議採取Voc的形式,即在scripts中建立資料夾VOCdevkit/VOC2012/JPEGImages和VOCdevkit/VOC2012/labels,將圖片和標籤分別放入這兩個資料夾。此時train.txt文件為:
開始訓練
首先下載一個預訓練的model(當然你也可以自己生成),放到darkent/目錄下。
下載地址 (76 MB):http://pjreddie.com/media/files/darknet19_448.conv.23
然後執行指令:./darknet detector train cfg/voc.data cfg/yolo-voc.2.0.cfg darknet19_448.conv.23
指令中的yolo-voc.2.0.cfg 可以換成別的網路。就可以開始訓練了,迭代次數為設定的max_batches數。
測試結果
此時在backup目錄下會有很多.weights檔案,利用他們就可以進行檢測了。
./darknet detector test cfg/voc.data cfg/yolo-voc.2.0.cfg ./backup/yolo-voc_final.weights ./data/test/sar10.jpg
其中 cfg/yolo-voc.2.0.cfg替換成你所用的,./data/test/sar10.jpg是用來檢測的影象,修改為自己的路徑即可。