【AI實戰】手把手教你訓練自己的目標檢測模型(SSD篇)
目標檢測是AI的一項重要應用,通過目標檢測模型能在影象中把人、動物、汽車、飛機等目標物體檢測出來,甚至還能將物體的輪廓描繪出來,就像下面這張圖,是不是很酷炫呢,嘿嘿
在動手訓練自己的目標檢測模型之前,建議先了解一下目標檢測模型的原理(見文章:大話目標檢測經典模型RCNN、Fast RCNN、Faster RCNN,以及Mark R-CNN),這樣才會更加清楚模型的訓練過程。
本文將在我們前面搭建好的AI實戰基礎環境上(見文章:AI基礎環境搭建),基於SSD演算法,介紹如何使用自己的資料訓練目標檢測模型。SSD,全稱Single Shot MultiBox Detector(單鏡頭多盒檢測器)
本案例要做的識別便是在影象中識別出熊貓,可愛吧,呵呵
下面按照以下過程介紹如何使用自己的資料訓練目標檢測模型:
1、安裝標註工具
要使用自己的資料來訓練模型,首先得先作資料標註,也就是先要告訴機器影象裡面有什麼物體、物體在位置在哪裡,有了這些資訊後才能來訓練模型。
(1)標註資料檔案
目前流行的資料標註檔案格式主要有VOC_2007、VOC_2012,該文字格式來源於Pascal VOC標準資料集,這是衡量影象分類識別能力的重要基準之一。本文采用VOC_2007資料格式檔案,以xml格式儲存,如下:
其中重要的資訊有:
filename:圖片的檔名
name:標註的物體名稱
xmin、ymin、xmax、ymax:物體位置的左上角、右下角座標
(2)安裝標註工具
如果要標註的影象有很多,那就需要一張一張手動去計算位置資訊,製作xml檔案,這樣的效率就太低了。
所幸,有一位大神開源了一個數據標註工具labelImg,可以通過視覺化的操作介面進行畫框標註,就能自動生成VOC格式的xml檔案了。該工具是基於Python語言編寫的,這樣就支援在Windows、Linux的跨平臺執行,實在是良心之作啊。安裝方式如下:
a. 下載原始碼
通過訪問labelImg的github頁面(https://github.com/tzutalin/labelImg),下載原始碼。可通過git進行clone,也可以直接下載成zip壓縮格式的檔案。
在本案例中直接下載成zip檔案。
b.安裝編譯
解壓labelImg的zip檔案,得到LabelImg-master資料夾。
labelImg的介面是使用PyQt編寫的,由於我們搭建的基礎環境使用了最新版本的anaconda已經自帶了PyQt5,在python3的環境下,只需再安裝lxml即可,進入LabelImg-master目錄進行編譯,程式碼如下:
#啟用虛擬環境
source activate tensorflow
#在python3環境中安裝PyQt5(anaconda已自帶),如果是在python2環境下,則要安裝PyQt4,PyQt4的安裝方式如下
#conda install -c anaconda pyqt=4.11.4
#安裝xml
conda install xml
#編譯
make qt5py3
#開啟標註工具
python3 labelImg.py
成功開啟labelImg標註工具的介面如下:
2、標註資料
成功安裝了標註工具後,現在就來開始標註資料了。
(1)建立資料夾
按照VOC資料集的要求,建立以下資料夾
Annotations:用於存放標註後的xml檔案
ImageSets/Main:用於存放訓練集、測試集、驗收集的檔案列表
JPEGImages:用於存放原始影象
(2)標註資料
將熊貓圖片集放在JPEGImages資料夾裡面(熊貓的美照請找度娘要哦~),注意圖片的格式必須是jpg格式的。
開啟labelImg標註工具,然後點選左側的工具欄“Open Dir”按鈕,選擇剛才放熊貓的JPEGImages資料夾。這時,主介面將會自動載入第一張熊貓照片。
點選左側工具欄的“Create RectBox”按鈕,然後在主介面上點選拉個矩形框,將熊貓圈出來。圈定後,將會彈出一個對話方塊,用於輸入標註物體的名稱,輸入panda作為熊貓的名稱。
然後點選左側工具欄的“Save”按鈕,選擇剛才建立的Annotations作為儲存目錄,系統將自動生成voc_2007格式的xml檔案儲存起來。這樣就完成了一張熊貓照片的物體標註了。
接下來點選左側工具欄的“Next Image”進入下一張影象,按照以上步驟,畫框、輸入名稱、儲存,如此反覆,直到把所有照片都標註好,儲存起來。
(3)劃分訓練集、測試集、驗證集
完成所有熊貓照片的標註後,還要將資料集劃分下訓練集、測試集和驗證集。
在github上下載一個自動劃分的指令碼(https://github.com/EddyGao/make_VOC2007/blob/master/make_main_txt.py)
然後執行以下程式碼
python make_main_txt.py
將會按照腳本里面設定的比例,自動拆分訓練集、測試集和驗證集,將相應的檔名列表儲存在裡面。
3、配置SSD
(1)下載SSD程式碼
由於本案例是基於tensorflow的,因此,在github上下載一個基於tensorflow的SSD,地址是 https://github.com/balancap/SSD-Tensorflow
以zip檔案的方式下載下來,然後解壓,得到SSD-Tensorflow-master資料夾
(2)轉換檔案格式
將voc_2007格式的檔案轉換為tfrecord格式,tfrecord資料檔案tensorflow中的一種將影象資料和標籤統一儲存的二進位制檔案,能更加快速地在tensorflow中複製、移動、讀取和儲存等。
SSD-Tensorflow-master提供了轉換格式的指令碼,轉換程式碼如下:
DATASET_DIR=./panda_voc2007/
OUTPUT_DIR=./panda_tfrecord/
python SSD-Tensorflow-master/tf_convert_data.py --dataset_name=pascalvoc --dataset_dir=${DATASET_DIR} --output_name=voc_2007_train --output_dir=${OUTPUT_DIR}
(3)修改物體類別
由於是我們自定義的物體,因此,要修改SSD-Tensorflow-master中關於物體類別的定義,開啟SSD-Tensorflow-master/datasets/pascalvoc_common.py檔案,進行修改,將VOC_LABELS中的其它無關類別全部刪掉,增加panda的名稱、ID、類別,如下:
VOC_LABELS = {
'none': (0, 'Background'),
'panda': (1, 'Animal'),
}
4、下載預訓練模型
SSD-Tensorflow提供了預訓練好的模型,基於VGG模型(要了解VGG模型詳情,請閱讀文章:大話經典CNN經典模型VGG),如下表:
但這些預訓練的模型檔案都是儲存在drive.google.com上,因此,無法直接下載。只能通過“你懂的”方式進行下載,在這裡下載SSD-300 VGG-based預訓練模型,得到檔案:VGG_VOC0712_SSD_300x300_ft_iter_120000.ckpt.zip,然後進行解壓
5、訓練模型
終於把標註檔案、SSD模型都準備好了,現在準備開始來訓練了。
在訓練模型之前,有個引數要修改下,開啟SSD-Tensorflow-master/train_ssd_network.py找到裡面的DATA_FORMAT引數項,如果是使用cpu訓練則值為NHWC,如果是使用gpu訓練則值為NCHW,如下:
DATA_FORMAT = 'NCHW' # gpu
# DATA_FORMAT = 'NHWC' # cpu
現在終於可以開始來訓練了,開啟終端,切換conda虛擬環境
source activate tensorflow
然後執行以下命令,開始訓練
# 使用預訓練好的 vgg_ssd_300 模型
DATASET_DIR=./ panda_tfrecord
TRAIN_DIR=./panda_model
CHECKPOINT_PATH=./model_pre_train/VGG_VOC0712_SSD_300x300_ft_iter_120000.ckpt/VGG_VOC0712_SSD_300x300_ft_iter_120000.ckpt
python3 SSD-Tensorflow-master/train_ssd_network.py \
--train_dir=${TRAIN_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=pascalvoc_2007 \
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--save_summaries_secs=60 \
--save_interval_secs=600 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate=0.0001 \
--batch_size=16
其中,根據自己電腦的效能情況,設定batch_size的值,值越大表示批量處理的數量越大,對機器效能的要求越高。如果電腦效能普通的,則可以設定為8,甚至4,土豪請忽略。
學習率learning_rate也可以根據實際情況調整,學習率越小則越精確,訓練的時間也越長,學習率越大則可縮短訓練時間,但就會降低精準度。
在這裡使用預訓練好的模型,SSD將會鎖定VGG模型的一些引數進行訓練,這樣能在較短的時間內完成訓練。
6、使用模型
SSD模型訓練好了,現在要來使用了,使用的方式也很簡單。
SSD-Tensorflow-master自帶了一個notebooks指令碼,可通過jupyter直接使用模型。
先安裝jupyter,安裝方式如下:
conda install jupyter
然後啟動jupyter-notebook,程式碼如下:
jupyter-notebook SSD-Tensorflow-master/notebooks/ssd_notebook.ipynb
啟動後在SSD 300 Model的程式碼塊設定模型的路徑和名稱
然後在最後的程式碼塊中,設定要測試的影象路徑path
然後點選選單“Cell”,點選子選單“Run All”,便能按順序全部執行程式碼,並顯示出結果出來
執行後,可愛的熊貓就被圈出來了
經過以上步驟,我們便使用了自己的資料完成了目標檢測模型的訓練。只要以後還有物體檢測的需求,然後找相關的圖片集進行標註,標註後進行模型訓練,就能完成一個定製化的目標檢測模型了,非常方便,希望本案例對大家能有所幫助。
後面將陸續推出更多【AI實戰】內容,敬請留意。
推薦相關閱讀
- 【AI實戰】快速掌握TensorFlow(一):基本操作
- 【AI實戰】快速掌握TensorFlow(二):計算圖、會話
- 【AI實戰】快速掌握TensorFlow(三):激勵函式
- 【AI實戰】快速掌握TensorFlow(四):損失函式
- 【AI實戰】搭建基礎環境
- 【AI實戰】訓練第一個模型
- 【AI實戰】編寫人臉識別程式
- 【AI實戰】動手訓練目標檢測模型(SSD篇)
- 【AI實戰】動手訓練目標檢測模型(YOLO篇)
- 【精華整理】CNN進化史
- 大話卷積神經網路(CNN)
- 大話迴圈神經網路(RNN)
- 大話深度殘差網路(DRN)
- 大話深度信念網路(DBN)
- 大話CNN經典模型:LeNet
- 大話CNN經典模型:AlexNet
- 大話CNN經典模型:VGGNet
- 大話CNN經典模型:GoogLeNet
- 大話目標檢測經典模型:RCNN、Fast RCNN、Faster RCNN
- 大話目標檢測經典模型:Mask R-CNN
- 27種深度學習經典模型
- 淺說“遷移學習”
- 什麼是“強化學習”
- AlphaGo演算法原理淺析
- 大資料究竟有多少個V
- Apache Hadoop 2.8 完全分散式叢集搭建超詳細教程
- Apache Hive 2.1.1 安裝配置超詳細教程
- Apache HBase 1.2.6 完全分散式叢集搭建超詳細教程
- 離線安裝Cloudera Manager 5和CDH5(最新版5.13.0)超詳細教程
關注本人公眾號“大資料與人工智慧Lab”(BigdataAILab),獲取更多資訊。