1. 程式人生 > >【AI實戰】動手訓練自己的目標檢測模型(YOLO篇)

【AI實戰】動手訓練自己的目標檢測模型(YOLO篇)

在前面的文章中,已經介紹了基於SSD使用自己的資料訓練目標檢測模型(見文章:手把手教你訓練自己的目標檢測模型),本文將基於另一個目標檢測模型YOLO,介紹如何使用自己的資料進行訓練。

 
YOLO(You only look once)是目前流行的目標檢測模型之一,目前最新已經發展到V3版本了,在業界的應用也很廣泛。YOLO的基本原理是:首先對輸入影象劃分成7x7的網格,對每個網格預測2個邊框,然後根據閾值去除可能性比較低的目標視窗,最後再使用邊框合併的方式去除冗餘視窗,得出檢測結果,如下圖:
 
YOLO的特點就是“快”,但由於YOLO對每個網格只預測一個物體,就容易造成漏檢,對物體的尺度相對比較敏感,對於尺度變化較大的物體泛化能力較差。

本文的目標仍舊是在影象中識別檢測出可愛的熊貓

基於YOLO使用自己的資料訓練目標檢測模型,訓練過程跟前面文章所介紹的基於SSD訓練模型一樣,主要步驟如下:
 
1、安裝標註工具
本案例採用的標註工具是labelImg,在前面的文章介紹訓練SSD模型時有詳細介紹了安裝方法(見文章:手把手教你訓練自己的目標檢測模型),在此就不再贅述了。
成功安裝後的labelImg標註工具,如下圖:

2、標註資料
使用labelImg工具對熊貓照片進行畫框標註,自動生成VOC_2007格式的xml檔案,儲存為訓練資料集。操作方式跟前面的文章介紹訓練SSD模型的標註方法一樣(見文章:手把手教你訓練自己的目標檢測模型

),在此就不再贅述了。

3、配置YOLO
(1)安裝Keras
 
本案例選用YOLO的最新V3版本,基於Keras版本。Keras是一個高層神經網路API,以Tensorflow、Theano和CNTK作為後端。由於本案例的基礎環境(見文章:AI基礎環境搭建)已經安裝了tensorflow,因此,Keras底層將會呼叫tensorflow跑模型。Keras安裝方式如下:

# 切換虛擬環境
source activate tensorflow
# 安裝keras-gpu版本
conda install keras-gpu
# 如果是安裝 keras cpu版本,則執行以下指令
#conda install keras

keras版本的yolo3還依賴於PIL工具包,如果之前沒安裝的,也要在anaconda中安裝

# 安裝 PIL
conda install pillow

(2)下載yolo3原始碼
在keras-yolo3的github上下載原始碼(https://github.com/qqwweee/keras-yolo3),使用git進行clone或者直接下載成zip壓縮檔案。

(3)匯入PyCharm
開啟PyCharm,新建專案,將keras-yolo3的原始碼匯入到PyCharm中

4、下載預訓練模型
YOLO官網上提供了YOLOv3模型訓練好的權重檔案,把它下載儲存到電腦上。下載地址為https://pjreddie.com/media/files/yolov3.weights

5、訓練模型
接下來到了關鍵的步驟:訓練模型。在訓練模型之前,還有幾項準備工作要做。
(1)轉換標註資料檔案
YOLO採用的標註資料檔案,每一行由檔案所在路徑、標註框的位置(左上角、右下角)、類別ID組成,格式為:image_file_path x_min,y_min,x_max,y_max,class_id
例子如下:
 
這種檔案格式跟前面製作好的VOC_2007標註檔案的格式不一樣,Keras-yolo3裡面提供了voc格式轉yolo格式的轉換指令碼 voc_annotation.py
在轉換格式之前,先開啟voc_annotation.py檔案,修改裡面的classes的值。例如本案例在voc_2007中標註的熊貓的物體命名為panda,因此voc_annotation.py修改為:

import xml.etree.ElementTree as ET
from os import getcwd

sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

classes = ["panda"]

新建資料夾VOCdevkit/VOC2007,將熊貓的標註資料資料夾Annotations、ImageSets、JPEGImages放到資料夾VOCdevkit/VOC2007裡面,然後執行轉換指令碼,程式碼如下:

mkdir VOCdevkit
mkdir VOCdevkit/VOC2007
mv Annotations VOCdevkit/VOC2007
mv ImageSets VOCdevkit/VOC2007
mv JPEGImages VOCdevkit/VOC2007

source activate tensorflow
python voc_annotation.py

轉換後,將會自動生成yolo格式的檔案,包括訓練集、測試集、驗證集。

(2)建立類別檔案
在PyCharm匯入的keras-yolo3原始碼中,在model_data目錄裡面新建一個類別檔案my_class.txt,將標註物體的類別寫到裡面,每行一個類別,如下:

(3)轉換權重檔案
將前面下載的yolo權重檔案yolov3.weights轉換成適合Keras的模型檔案,轉換程式碼如下:

source activate tensorflow
python convert.py -w yolov3.cfg yolov3.weights model_data/yolo_weights.h5

(4)修改訓練檔案的路徑配置
修改train.py裡面的相關路徑配置,主要有:annotation_path、classes_path、weights_path

其中,train.py裡面的batch_size預設是32(第57行),指每次處理時批量處理的數量,數值越大對機器的效能要求越高,因此可根據電腦的實際情況進行調高或調低

(5)訓練模型
經過以上的配置後,終於全部都準備好了,執行train.py就可以開始進行訓練。

訓練後的模型,預設儲存路徑為logs/000/trained_weights_final.h5,可以根據需要進行修改,位於train.py的第85行,可修改模型儲存的名稱。

6、使用模型
完成模型的訓練之後,呼叫yolo.py即可使用我們訓練好的模型。
首先,修改yolo.py裡面的模型路徑、類別檔案路徑,如下:

class YOLO(object):
    _defaults = {
        "model_path": 'logs/000/trained_weights_final.h5',
        "anchors_path": 'model_data/yolo_anchors.txt',
        "classes_path": 'model_data/my_classes.txt',
        "score" : 0.3,
        "iou" : 0.45,
        "model_image_size" : (416, 416),
        "gpu_num" : 1,
    }

通過呼叫 YOLO類就能使用YOLO模型,為方便測試,在yolo.py最後增加以下程式碼,只要修改影象路徑後,就能使用自己的yolo模型了

if __name__ == '__main__':
    yolo=YOLO()
    path = '/data/work/tensorflow/data/panda_test/1.jpg'
    try:
        image = Image.open(path)
    except:
        print('Open Error! Try again!')
    else:
        r_image, _ = yolo.detect_image(image)
        r_image.show()

    yolo.close_session()

執行後,可愛的熊貓就被乖乖圈出來了,呵呵

通過以上步驟,我們又學習了基於YOLO來訓練自己的目標檢測模型,這樣在應用中可以結合實際需求,使用SSD、YOLO訓練自己的資料,並從中選擇出效果更好的目標檢測模型。

後面還會陸續推出更多【AI實戰】內容,敬請留意。
 

推薦相關閱讀

 

關注本人公眾號“大資料與人工智慧Lab”(BigdataAILab),獲取更多資訊