【實踐操作】:六步教你如何用開源框架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來註釋影象,它是一個圖形化的影象註釋工具。
安裝地址:https://github.com/tzutalin/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庫將視訊解析成幀,然後在每個幀上執行物件檢測器,並將結果返回到視訊中。
文章地址:https://medium.com/towards-data-science/is-google-tensorflow-object-detection-api-the-easiest-way-to-implement-image-recognition-a8bd1f500ea0
接下來的步驟
- 在測試過程中,我發現Faster RCNN模型有點慢。接下來,我將探索使用最快的模型-SSD mobilenet,看看是否有明顯的準確性下降的問題。
- 對於這個模型,我只是使用了faster_rcnn_resnet101_coco的模型配置檔案中的預設引數。如果它們能被調整以獲得更好的效能,那就值得探索了。
- 通過更多的努力,這個過程可以擴充套件到其他類別。