實踐操作:六步教你如何用開源框架Tensorflow對象檢測API構建一個玩具檢測器
TensorFlow對象檢測API是一個建立在TensorFlow之上的開源框架,可以輕鬆構建,訓練和部署對象檢測模型。
到目前為止,API的性能給我留下了深刻的印象。在這篇文章中,我將API的對象設定為一個可以運動的玩具。本文將用六個步驟突出API的性能並教你如何構建一個玩具探測器,你也可以根據這六個步驟擴展與實踐你想要構建的任何單個或多個對象檢測器。

TensorFlow玩具檢測器
代碼在我的GitHub repo上。
地址:https://github.com/priya-dwivedi/Deep-Learning/tree/master/tensorflow_toy_detector
第一步:收集數據
第一步是為你的項目收集圖像,你可以從穀歌上下載。在我的例子中,我創建了一個飛機玩具的視頻,並使用Opencv從視頻中提取圖像。這節省了我很多時間。我確保圖像是從多個角度拍攝的。你也可以隨機改變一些圖像的亮度,這樣探測器就可以在不同的光線條件下工作了。大致來說,你需要提供總共100-150張圖片就足夠了。參見下麵的一些示例圖片:

玩具的不同角度
第二步:為圖像添加注釋
我使用Labelimg來注釋圖像,它是一個圖形化的圖像注釋工具。
這是一個非常有用的工具,注釋是在Pascal VOC的格式中創建的,稍後你可以看到這個格式的用處。Labelimg是用Python編寫的,並使用Qt作為接口。我使用了Python3 + Qt5這個組合來操作,事實證明是沒有問題的(請參見帶注釋的圖像示例)。從本質上說,我們為對象識別x和y的最大值與最小值,並將其傳遞給模型以及用於訓練的圖像。
使用labelimg為玩具添加注釋
****第三步:創建TFR數據集****
Tensorflow API想讓數據集最終變為TFRecord文件格式。這一步驟可能是最棘手的部分。但是,Tensorflow提供了一些方便的腳本,以幫助你啟動- create_pascal_tf_record.py和create_pet_tf_record.py。由於labelimg已經以正確的格式創建了注釋,所以我使用最小編輯的create_pet_tf_record.py。同時,這個腳本隨機抽取30%的數據並創建了一個驗證TFR文件。
需要注意的是,你還需要創建一個label.pbtxt文件,用於將標簽名轉換為一個數字id。這個過程非常簡單:
item {
id: 1
name: ‘toy’
}
**第四步:創建一個模型配置文件
**
一旦創建了TFR數據集,那麼首先你需要確定你是否將使用現有的模型,並對其進行微調,或者從頭開始構建。我強烈推薦使用現有的模型,因為卷積神經網絡(CNNs)所了解的大多數特性通常都是對象不可知論的,而對現有的模型進行微調通常是一個簡單而準確的過程。但是請注意,如果你決定從頭開始構建,你將需要150多個圖像,還要花費好幾天時間來訓練。該API提供了5種不同的模型,可以在執行速度和放置包圍盒的精度之間進行權衡。見下表:

TensorFlow檢測模型
對於這個項目,我決定使用在coco數據集上訓練的faster_rcnn_resnet101。如果你想了解更多關於RCNN的模型的內容,請移步→https://blog.athelas.com/a-brief-history-of-cnns-in-image-segmentation-from-r-cnn-to-mask-r-cnn-34ea83205de4
Tensorflow提供了幾個示例配置文件,以開始創建。
示例配置文件地址:https://github.com/tensorflow/models/tree/master/research/object_detection/samples/configs
使用faster_rcnn_resnet101_coco文件,並更新任何需要在文件中配置的路徑。記住,不要忘記更新類的個數。
第五步:訓練模型
終於!所有困難的(和無聊的)部分都完成了,我們可以開始訓練模型了。因為我有一個可以合理使用的GPU,所以我決定在本地進行訓練。然而,你也可以在雲上進行訓練。
你可以同時在兩個獨立的終端上啟動訓練工作和評估工作。並啟動Tensorboard來監控性能。經過2-3個小時的訓練後,可以看到總損失下降到0.077,精確到0.99。通過查看Tensorboard中的圖像,我們可以看到這個模型很快就變得準確了。



模型很快就能得到準確的數據
第六步:測試模型
為了測試這個模型,我們首先選擇一個模型檢查點(通常是最新的),然後導出到一個凍結的推理圖中。這個腳本也可以在我的github上找到。我在iPhone上錄製的一段新視頻中測試了這個模型。在我的前一篇文章中,我使用Python moviepy庫將視頻解析成幀,然後在每個幀上運行對象檢測器,並將結果返回到視頻中。
接下來的步驟
在測試過程中,我發現Faster RCNN模型有點慢。接下來,我將探索使用最快的模型-SSD mobilenet,看看是否有明顯的準確性下降的問題。
對於這個模型,我隻是使用了faster_rcnn_resnet101_coco的模型配置文件中的默認參數。如果它們能被調整以獲得更好的性能,那就值得探索了。通過更多的努力,這個過程可以擴展到其他類別。
本文為編譯作品,轉載請注明出處。更多內容關注微信公眾號:atyun_com
最後更新:2017-10-12 12:03:44