物件偵測(Object Detection)是影像辨識中重要的一環。是指在影像中,利用方形的框標出物件的位置,並針對該物件進行分類,能快速且有效的達到分類及位置判斷的目的。下圖是物件偵測的案例,在圖中把偵測到的物件(狗、腳踏車與汽車)分別用方框進行標記:
物件偵測有很多種演算法,傳統上方式有HOG(Histogram of Oriented Gradient);在深度學習領域則有R-CNN(Region-based Convolutional Neural Networks)、SSD(Single Shot MultiBox Detector)與YOLO(You Only Look Once)等。在此不會深入探討各種演算法的內容,而是應用這項技術來進行型態識別。接下來都會使用TensorFlow Object Detection API來建構與訓練物件偵測深度學習模型。
程式實作:建置物件偵測模型
今天主要在說明如何建置物件偵測模型,因此會使用使用公開資料集「Fruit Images for Object Detection」來建置一個模型以做為演示。關於技術型態辨識的物件偵測模型建置則會於明後兩日說明;明天(Day28)會先建立底部型態的實驗資料集,後天(Day29)則是使用實驗資料集進行模型的建置與訓練。
以下參照「TensorFlow 2 Object Detection API With Google Colab」文章的描述在 Google Colab環境中使用GPU進行模型之建構與訓練,用以說明物件偵測模型訓練所需的所有步驟。該文章將已將所有步驟以條列方式說明;並且很多步驟都已寫在Jupyter Notebook內,因此只要按步執行即可。但很不幸的是這篇文章寫於2020年,至今Colab與TensorFlow已有不少的改動;為此我對於原本Jupyter Notebook進行修改以符合現今環境,詳細請參照「第二十七天:簡述物件偵測技術.ipynb」。接下來我會概略的說明每個步驟,細節部份還請參照原文:
- 第1步(Step 1) - 先決條件(收集/標記圖像、創建 label_map...等)
- 在此就直接使用公開資料集「Fruit Images for Object Detection」並創建label_map.pbtxt
- 下載預訓練模型(SSD Resnet50 V1 FPN 640X640)以進行遷移學習
- 下載generate_tfrecords.py腳本將資料集轉換為TFRecord格式
- 第2步(Step 2) - 在 Google雲端硬碟上設置目錄結構:就請參照原文建立目錄,並把下載的資料集、模型與檔案放在指定位置。結果如下所示:
TensorFlow
├───scripts
│ └───preprocessing
│ └───generate_tfrecord.py
└───workspace
└───training_demo
├───annotations
│ └───label_map.pbtxt
├───exported-models
├───images
│ ├───test
│ │ └───test images with corresponding XML files
│ └───train
│ └───train images with corresponding XML files
├───models
│ └───my_ssd_resnet50_v1_fpn
│ └───pipeline.config
└───pre-trained-models
└───ssd_resnet50_v1_fpn_640x640_coco17_tpu-8
- 第3步(Step 3) - 選擇硬體加速器:在Google Colab上開啟「第二十七天:物件偵測概述.ipynb」,然後變更執行階段類型為GPU(先說明一下我訂閱了Colab Pro+以期能於參賽期間內完成模型訓練,選擇的類型為「T4」與「大量RAM」)
- 第4步(Step 4) - 掛載Google雲端硬碟:請執行「#Step 4- Mount Google Drive.」的程式碼儲存格,之後會跳出需授權從Google Colab存取Google雲端硬碟的提示,就請同意授權
- 第5步(Step 5) - 下載TensorFlow模型庫:請執行「#Step 5- Download TensorFlow Model Garden.」的程式碼儲存格。這步驟程序有做修改,以對應目前TensorFlow版本
- 第6步(Step 6) - 安裝一些必需的程式庫與工具:請執行「#Step 6- Install some required libraries and tools.」的程式碼儲存格。這步驟程序有做修改,以對應目前Google Colab環境
- 第7步(Step 7) - 編譯Protobuf程式庫:請執行「#Step 7- Compile the Protobuf libraries.」的程式碼儲存格
- 第8步(Step 8) - 設置環境:請執行「#Step 8- Set the environment.」的程式碼儲存格
- 第9步(Step 9) - 構建並安裝 setup.py:TensorFlow版本變更造成原本方式無法使用,因此我做了修改讓這步可以執行;請執行「#Step 9- Build and Install setup.py.」的程式碼儲存格
- 第10步(Step 10) - 測試安裝:請執行「#Step 10- Test the installation.」的程式碼儲存格,最後出現『OK (skipped=1) Done』訊息表示安裝成功
- 第11步(Step 11) - 產生Tfrecord:這一步會將資料集轉換成TFRecord格式,請執行「#Step 11- Generate TFrecords.」的程式碼儲存格
- 第12步(Step 12) - 複製一些檔案
- 從"TensorFlow/models/research/object_detection"檔案夾中複製"model_main_tf2.py"檔案並將其貼至training_demo檔案夾中。因為需要這個檔案來訓練模型
- 從"TensorFlow/models/research/object_detection"檔案夾中複製"exporter_main_v2.py"檔案並將其貼至training_demo檔案夾中。因為需要這個檔案來導出已訓練的模型
- 第13步(Step 13) - 配置管道文件:請參考原文修改"training_demo/models/my_ssd_resnet50_v1_fpn/pipeline.config"之檔案內容
- 第14步(Step 14) - 啟動TensorBoard:請執行「#Step 14- Start Tensorboard.」的程式碼儲存格,以啟動TensorBoard
- 第15步(Step 15) - 訓練模型:請執行「#Step 15- Train the model.」的程式碼儲存格,訓練過程如下圖所示:
- 第16步(Step 16) - 導出已訓練的模型:請執行「#Step 16- Export the Trained Model.」的程式碼儲存格
- 第17步(Step 17) - 測試模型(載入已保存的模型):請執行「#Step 17- Test the Model.」的程式碼儲存格
- 第18步(Step 18) - 測試模型(載入label_map):請執行「#Step 18- Testing the Model.」的程式碼儲存格
- 第19步(Step 19) - 測試模型(載入圖像):先將兩張圖片img1.jpg與img2.jpg上傳至Colab儲存空間後再執行「#Step 19- Testing the Model.」的程式碼儲存格
- 第20步(Step 20) - 執行推論:請執行「#Step 20- Running the Inference.」的程式碼儲存格,執行結果如下圖所示: