1. 程式人生 > >在YOLO2中增加自己的物體識別

在YOLO2中增加自己的物體識別


從RCNN, fast RCNN, 到faster RCNN, YOLO, 以及最新的YOLO2, 檢測的速度是越來越快了, 最新的YOLO2據作者說可以達到67Fps, 支援的種類達9000.想看效果的請戳這裡YOLO2 .

這麼快速度,當然很多人估計跟我一樣,想把它用來檢測特定類的物體。這裡,我將根據自己查詢的一些資料,以及自己的實踐,告訴大家怎麼在YOLO2中增加識別自己需要的物體。

主要分為2部分, 第一部分介紹如何製作自己的訓練集和測試集。第二部分,介紹如何進行訓練和測試。

一、用BBox-Label-Tool製作訓練集

1. 下載BBox-Label-Tool

2. 修改main.py

1) 將126行self.category = int(s)改為self.category = s
2) 將133行self.imageDir = os.path.join(r'./Images', '%03d' %(self.category))改為self.imageDir = os.path.join(r'./Images', '%s' %(self.category))
3) 將144行self.outDir = os.path.join(r'./Labels', '%03d' %(self.category))改為self.outDir = os.path.join(r'./Labels', '%s' %(self.category))


這樣我們可以在Images目錄下使用英文名目錄而不是隻有數字, Images目錄下建立自己的目錄用於放置你需要進行標註的圖片集,比如在Images下建立myobject目錄,然後把你要標註的圖片(最少300張)放到myobject目錄下。

3. 準備圖片集

圖片的話,300張左右大概就夠了,當然越多越好。注意,BBox只能對JPEG檔案進行識別(坑爹),所以如果你的圖片是其他格式的話,要轉成JPEG。Window下你可以找些批處理的轉碼軟體,

這裡我們就把需要進行標註的圖片放到了Images/myobject目錄下。我們就可以使用BBox進行標註了。

4. 生成標註資料

BBox-Label-Tool需要

python2.7PIL-1.1.7.win32-py2.7
安裝完成後,執行python27 main.py(因為我的電腦是3.5和2.7都有裝),在Image Dir中輸入myobject,然後點選load載入需要標註的圖片集,如下圖
這裡寫圖片描述
用滑鼠確定一個方框後,右邊會有對應座標, 一張圖片允許框選多個方框, 框選完成後點選next就會處理下一張圖片,同時上一張圖片的標註資訊會出現在Lables目錄下
這裡寫圖片描述

5. 將標註資料轉成YOLO可識別格式

因為YOLO的lable資料要求是object-class x y width height, 像這種
0 0.73 0.511070110701 0.41 0.616236162362, 而我們之前的標註資料格式是這樣
1
210 55 374 222
所以需要轉換一下,這裡有個指令碼,這個指令碼下載完後還需要我們改動幾個地方。
1)將13行的classes的值改為classes = ["myobject"]
2)將35行改為cls = "myobject"
3)將32,33行改為
mypath = "Labels/myobject/"
outpath = "traindata/lables/"
這裡的outpath改為你自己的臨時目錄。
4)如果你在window下跑這個py,那麼你還需要改58行,lines = txt_file.read().split('\n') 把\r\n改為\n.
最後執行這個指令碼python27 convert.py,輸出如下資訊
這裡寫圖片描述
然後你就可以在outpath下找到轉換後的標註資訊。

我們已經得到了一個影象集,在你的Images/myobject目錄下, 一個對該影象集的標註資訊,在你的outpath目錄下, 現在把這2個目錄下的jpeg和txt檔案合併到一個資料夾,我這裡是放到darkne目錄下的data\myobject目錄下, 下一步我們就要配置YOLO來進行訓練了。

二、配置YOLO

YOLO的配置主要為3個檔案myobj.data, myobj.name, myobj.cfg.

1. myobj.data

我的myobj.data內容如下
classes= 1
train = data/myobject/train.txt
valid = data/myobject/test.txt
names = data/myobject/myobj.names
backup = backup
classes為你要detect的目標種類個數, 檢測一種的話就是1。 train指向一個txt檔案,用於描述訓練時用哪些圖片進行訓練。 valid用於描述測試時用哪些圖片進行測試。這兩個檔案可以使用如下指令碼生成

import glob, os

# Current directory
current_dir = os.path.dirname(os.path.abspath(__file__))

# 圖片的儲存目錄
path_data = 'data/myobject/'

# Percentage of images to be used for the test set percentage_test = 10;

# Create and/or truncate train.txt and test.txt file_train = open('train.txt', 'w') file_test = open('test.txt', 'w') # Populate train.txt and test.txt counter = 1 index_test = round(100 / percentage_test) for pathAndFilename in glob.iglob(os.path.join(current_dir, "*.jpg")): title, ext = os.path.splitext(os.path.basename(pathAndFilename)) #file = open(title + '.txt', 'w') #file.write('0 0.5 0.5 1 1') #file.close() if counter == index_test: counter = 1 file_test.write(path_data + title + '.jpg' + "\n") else: file_train.write(path_data + title + '.jpg' + "\n") counter = counter + 1 

把該指令碼放到data/myobject目錄下,然後執行,就會在該目錄生成2個txt檔案。

2.myobj.names

這個檔案只有一行,也就是你要檢測物體的名稱, 他會在檢測完後顯示在圖片上,每行對應一種物體。我們這裡是myobj

3.myobj.cfg

這個檔案用於描述網路結構, 我們可以直接拿cfg/yolo-voc.cfg來使用, 不過要改幾個地方.
1) batch改為合適值, 一般64,如果你記憶體不夠的話跑起來發現記憶體分配失敗,可以改下點,比如32,16
2)subdivisions, 與上面類似,可以試試8,4,2,越小需要記憶體越大。
3)classes=1
4)倒數的第一個filters=(classes + 5)*5,這裡我們就是30

三、 訓練YOLO

訓練前我們先去YOLO官網下載已經訓練好的權值檔案darknet19_448.conv.23(76M)
然後執行命令./darknet detector train data/myobject/myobj.data data/myobject/myobj.cfg darknet19_448.conv.23
預設情況下,每1000次會將訓練好的權值存放到backup/myobj_1000.weights檔案裡, 所以下次開始訓練時,可以從上一次訓練結果中繼續訓練,命令如下
./darknet detector train data/myobject/myobj.data data/myobject/myobj.cfg backup/myobj_2000.weights, 這裡我們從第2000次開始繼續進行訓練。

四、何時停止訓練

請戳這裡搬運工, 一般來講2000次左右基本就夠了, 當然如果你要更好的精度,那麼需要觀察avg這個值的變化, 如果這個值基本不再變小,那麼訓練就可以停止了。此時,你需要觀察前幾次的avg的值,選出幾個最小的,然後根據avg最前面的數字,找到對應backup目錄下的權值檔案,之後執行如下命令
darknet detector recall data/myobject/myobj.data data/myobject/myobj.cfg backup\yolo-obj_XXXX.weights
根據輸出IOU和Recall 值, 找到最好的weight檔案。一般IOU越大越好,Recall也是越大越好。

五、小結

到這裡我們已經可以使用YOLO對某一類物體進行檢測了, 在此感謝國外友人Nils Tijtgat
的文章, 另:CPU跑慢的要死,一次要10分鐘, 我看國外那哥們的貼圖,只要2s, 喵生灰暗。想把darknet在GPU上執行,請戳這裡。除了Bbox-lable-tool外,這裡還有個YoloMark也可以用於bbox的生成,大家有興趣可以看看。