浣熊檢測器例項, 如何用TensorFlow的Object Detector API來訓練你的物體檢測器
這篇文章是“用Tensorflow和OpenCV構建實時物件識別應用”的後續文章。具體來說,我在自己收集和標記的資料集上訓練了我的浣熊檢測器。完整的資料集可以在我的Github repo上看到。
看一下這個動圖,這是執行中的浣熊探測器:
浣熊檢測器
如果你想知道這個探測器的更多細節,就繼續讀下去!
在這篇文章中,我將解釋所有必要的步驟來訓練你自己的檢測器。特別地,我建立了一個具有相對良好結果的物件檢測器來識別浣熊。
建立資料集
你需要做的第一件事是建立自己的資料集:Tensorflow的Object Detection API使用TFRecord檔案格式,因此在最後我們需要將資料集轉換為該檔案格式。
有幾個選項可以生成TFRecord檔案。如果你有一個與PASCAL VOC資料集或者Oxford Pet資料集相似的資料集,那麼它們對本操作就有了一個現成的指令碼(參見py和create_pet_tf_record.py)。如果你沒有其中之一,那麼你需要編寫自己的指令碼來生成TFRecords。
為了準備API的輸入檔案,你需要考慮兩件事。首先,你需要一個RGB影象,它被編碼為jpeg或png,其次你需要一個影象的包圍盒(xmin,ymin,xmax,ymax),以及在包圍盒中的物件的類。
我在谷歌圖片和Pixabay上湊齊了200只浣熊的照片(主要格式是jpeg,還有一些pngs),這些圖片在比例、姿勢和光線上都有很大的變化。以下是我收集的浣熊影象資料集的一個子集:
浣熊影象資料集的子集
之後,我用LabelImg手動給它們貼上標籤。LabelImg是一種圖形化的影象註釋工具,它是用Python編寫的,並且使用Qt作為圖形介面。它支援Python2和Python3,但是我用Python2和Qt4來構建它,因為我用Python3和Qt5會出現一些問題。LabelImg非常容易使用,而且註釋被作為XML檔案儲存在PASCAL VOC格式中,這意味著我也可以使用該檔案的create_pascal_tf_record.py指令碼。但是我並沒有這樣做,因為我想要建立我自己的指令碼。
在某種程度上,LabelImg在MAC OSX上開啟jpeg會出現問題,所以我不得不先把它們轉換成pngs格式,然後再把它們轉換成jpeg格式。實際上,我可以把它們放在pngs格式中,API也是應該支援這一點的。
最後,在對影象進行標記之後,我編寫了一個指令碼,該指令碼將XML檔案轉換為csv,然後建立TFRecords。我使用了160張圖片用於進行訓練(train.records)和40張用於測試的圖片(test.records)。這個指令碼也可以在我的repo中找到。
備註:
- 我還發現了另一個叫做FIAT(快速影象資料註釋工具)的註釋工具,它看起來也很不錯。你可以嘗試一下。
- 對於命令列中的影象處理,例如將多個影象轉換為不同的檔案格式,我推薦你使用ImageMagick,它是一個非常好的工具。如果你沒有使用過,那就值得嘗試一下。
- 確保影象的大小是中等的。如果影象太大,你可能會在訓練期間執行記憶體不足,特別是當你不更改預設批處理大小設定時。
一個目標探測訓練管道。它們還在repo上提供了樣本配置檔案。在我的訓練中,我使用ssd_mobilenet_v1_pets.config作為基礎。我需要將num_classes調整為1,併為模型檢查點(checkpoint)、訓練和測試資料檔案以及標籤對映(label map)設定路徑(PATH_TO_BE_CONFIGURED)。至於其他配置,比如學習速率、批處理大小等等,我使用了它們的預設設定。
注意:如果你的資料集沒有很大的變化,比如不同的縮放比例、姿態等等,那麼資料增強選項(data_augmentation_option)是非常有趣的。這裡可以找到一個完整的選項列表(參閱PREPROCESSING_FUNCTION_MAP)。
資料集(TFRecord檔案)及其相應的標籤對映。如何建立標籤對映的例子可以在這裡找到。下面是我的標籤對映,它很簡單,因為只有一個類:
item {
id: 1
name: 'raccoon' }
注意:很重要的一點是,你的標籤對映應該始終從id 1開始。索引0是一個佔位符索引(請參閱這篇討論以獲得關於此主題的更多資訊)。
(可選)預訓練模型檢查點。我們建議使用一個檢查點,從預訓練模型開始訓練總是更好的,因為從頭開始的訓練可能需要幾天的時間才能得到好的結果。在我的例子中,我使用了ssd_mobilenet_v1_coco模型,因為模型速度對我來說比精確度更重要。
現在你可以開始訓練了:
- 訓練可以在本地完成,也可以在雲端完成(AWS、Google cloud等)。如果你在家裡有GPU(至少超過2 GB),那麼你可以在本地做,否則我建議你使用雲端計算。在我的例子中,我這次使用了Google Cloud,基本上遵循了他們文件中描述的所有步驟。
- 對於Google Cloud,你需要定義一個YAML配置檔案。還有一個樣本檔案也被提供,並且基本上我只取預設值。
- 在訓練開始時,也建議你開始做評估工作。你可以通過在你的本地機器上執行Tensorboard來監控訓練和評估工作的過程。
tensorboard — logdir=gs://${YOUR_CLOUD_BUCKET}
以下是我的訓練和評估的結果。總的來說,我以一個批尺寸為24的22k步長運行了大概一個小時,但是我已經在大約40分鐘內取得了很好的效果。
這是總損失的演變過程:
由於預訓練模型,總損失相當快。
由於我只有一個類,所以只看總mAP(平均準確率)就足夠了。
mAP在大約20k步長的時候達到了0.8是非常好的。
這裡有一個在訓練模型時對一個影象進行評估的例子。
浣熊周圍的檢查框隨著時間的推移變得越來越好。
輸出模型
在完成訓練之後,我將訓練過的模型匯出到單個檔案(Tensorflow graph proto)中,這樣我就可以使用它進行推理。
在我的例子中,我必須將模型檢查點從Google Cloud bucket複製到本地機器上,然後使用所提供的指令碼匯出模型。你可以在我的repo中找到這個模型。
地球上最著名的浣熊
福利:
你可以在Youtube上看一下這個視訊:https://www.youtube.com/watch?v=W0sRoho8COI(浣熊檢測器是令人震驚的)
如果你看過這個視訊,你會發現並不是每個浣熊都被檢測到或是被誤分類。這是合乎邏輯的,因為我們只訓練在一個小的資料集的模型。
此文為編譯作品,作者Dat Tran,原網址:https://webcache.googleusercontent.com/search?q=cache:G8Pazlki568J:https://medium.com/towards-data-science/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9+&cd=1&hl=en&ct=clnk&gl=jp