1. 程式人生 > >製作自己的yolo2資料集進行訓練

製作自己的yolo2資料集進行訓練

說明

本文承接上一篇修改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是用來檢測的影象,修改為自己的路徑即可。