【乾貨】聖誕老人是否真實存在?訓練Tensorflow的物件檢測API能夠告訴你答案
背景:最近我們看到了一篇文章,關於如何用於你自己的資料集,訓練Tensorflow的物件檢測API。這篇文章讓我們對物件檢測產生了關注,正巧聖誕節來臨,我們打算用這種方法試著找到聖誕老人。
- 文章地址:https://medium.com/towards-data-science/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9
程式碼在下面的地址中。從這段程式碼中生成的模型可以擴充套件,以發現其他類別的角色是動畫還是真實的。
- 地址:https://github.com/turnerlabs/character-finder
正在活動的聖誕老人
收集資料 與任何機器學習模型一樣,資料是最重要的方面。因為我們想要找到不同型別的聖誕老人,我們的訓練資料必須是多樣化的。為了收集資料,我們編寫了一個流處理器,它使用VLC(多媒體播放器)從任何線上資源流播放視訊,並從中捕獲幀。流處理器在視訊中捕獲幀,而不需要等待視訊載入。如果當前播放的視訊是2秒,那麼流處理器將從4或5秒的標記中捕獲幀。作為額外的獎勵,你可以在ASCII觀看視訊,這是觀看視訊的最酷的方式。
- 流處理器的使用說明:https://github.com/turnerlabs/stream-processor
在ASCII上聖誕老人衝浪的視訊
下面是我們收集的不同型別的聖誕老人照片的一小部分。所有這些圖片都是從YouTube上收集的。正如你所看到的,有不同型別的動畫版和真人版聖誕老人。
不同種類的聖誕老人
給資料貼標籤 下一步是給資料貼上標籤,比如在聖誕老人的臉上畫一個邊界框。影象標記的一個常見選擇是使用工具貼標籤,但是我們使用了“辛普森一家的角色識別和檢測(第2部分)”這篇文章中出現的自定義指令碼。
- 文章地址:https://medium.com/alex-attia-blog/the-simpsons-characters-recognition-and-detection-part-2-c44f9d5abf37
要給影象貼上標籤,先點選人物面部的左上角,然後再點選右下角。如果影象中沒有出現人物角色,雙擊相同的點並刪除影象。
- 指令碼的程式碼:https://github.com/turnerlabs/character-finder/blob/master/detect_labels.py
建立Tensorflow記錄檔案 一旦邊界框資訊儲存在一個csv檔案中,下一步就是將csv檔案和影象轉換為一個TF記錄檔案,這是Tensorflow的物件檢測API使用的檔案格式。將csv檔案轉換為TF記錄的指令碼可以在下面地址中找到。
地址:https://github.com/turnerlabs/character-finder/blob/master/object_detection/create_characters_tf_record.py
還需要一個protobuf(可擴充套件的序列化結構資料格式)文字檔案,用於將標籤名轉換為數字id。對於我們的例項,它只是一個類。
item {
id: 1
Name: santa
}
建立配置檔案 對於訓練,我們使用faster_rcnn_inception_resnet配置檔案作為基礎。我們將配置檔案中的類引數更改為1,因為我們只有一個類——“聖誕老人(santa)”,並將輸入路徑引數更改指向我們在上一步中建立的TFrecord檔案。我們使用了預先訓練過的檢查點用作faster_rcnn_inception_resnet配置檔案。我們使用這個模型是因為模型的準確性比模型訓練的速度更重要。還有其他一些提供不同訓練速度和準確性的模型,可以在下面這個地址中找到。
- https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
訓練 訓練程式碼是在本地計算機上執行的,以檢查是否一切都在正常工作。一旦它在正常的工作,它就會被部署到Google雲平臺的ML引擎上。該模型接受了超過10萬步長的訓練。
- ML引擎:https://cloud.google.com/ml-engine/
動畫版聖誕老人
這個模型對動畫和真人的圖片都很有效果。
真人版聖誕老人
輸出模型 訓練結束後,該模型被匯出用於在不同影象上進行測試。為了匯出模型,我們選擇了從訓練工作中獲得的最新的檢查點,並將其輸出到一個凍結的推理圖中。
- 將檢查點轉換為凍結推理圖的指令碼:https://github.com/turnerlabs/character-finder/blob/master/object_detection/export_inference_graph.py
我們還為我們的模型建立了一個網頁,網頁從google搜尋中提取影象,並試圖在還原的影象中找到聖誕老人。這個網頁的結果被過濾了,只顯示了超過60%的置信度。下圖是網頁的快照。
我們發現了聖誕老人! !
下一個步驟 當訓練工作開始的時候,我們注意到總損失很快就降到1以下,這就意味著這個模型在尋找聖誕老人方面做得很好。
總損失
我們知道我們的模式不可能變得完美。雖然該模型在準確地找到聖誕老人方面做得相當不錯,我們也得到了錯誤的判斷。錯誤的判斷對於這種情況來說是指,影象中沒有聖誕老人,但模型卻預測影象中會有。
錯誤的判斷
結論 在使預測變得更準確和減少錯誤判斷的數量上,還有很大的改進空間。接下來的步驟是瞭解更多關於配置檔案中不同引數的資訊,並更好地瞭解它們如何影響模型的訓練及其預測。我們希望你現在能夠為你自己的資料集訓練物件檢測器。