目標
本篇文章靈感發想自MIT的Dukietown (https://www.duckietown.org/) 。 如同之前我們在部落格分享過的自駕車文章 (https://blog.cavedu.com/2019/08/20/openvino2/) , 機器人小車已經具備有辨識行走及辨識路牌的能力了, 那麼接下來我們希望可以更進一步的提昇辨識能力到物件偵測(Object Detection), 並加入一個新的類別(小鴨,在這裡作為路人),並設法偵測到牠的位置, 再搭配Intel RealSense深度攝影機去量測距離, 藉此來讓小車可以知道前方是否可以通行。
由於篇幅限制,本文將著重在演算法的部份, 關於如何結合到實體的自駕車上以及對應的電控,將於之後的文章為您揭曉,還請多多關注!
環境準備
本文所使用的嵌入式控制板是研揚的UP Squared, 以及所使用的深度學習推論裝置為Intel Movidius NCS 2, 如果想看他們的介紹的話可以參考我們之前寫過的文章 [OpenVINO & Movidius™ 2運算棒] 使用台灣路況即時影像對九份老街做街景辨識 。
Image may be NSFW.
Clik here to view.
此外,還有本文的主角深度攝影機 Intel RealSense D435!
Image may be NSFW.
Clik here to view.
本文將會含括訓練深度學習模型的部份,建議準備有一台有GPU的電腦,本文以一台有GTX 1060的筆電為例,其上的作業系統為Linux。
最後,請下載本次的範例程式
然後記得切換工作目錄到agv-object-detection
收集資料
之前路牌的資料可以從我們公開的資料下載(https://drive.google.com/open?id=13odeFnUYNWQS2ysVijOttjzpB53W4FY_) 。 接著為了要能夠辨識出路人(也就是小鴨),我們需要手動先拍攝幾張不同角度的小鴨照片。 本範例約略整理出”左轉路牌”,”右轉路牌”,”停止號誌”以及”黃色小鴨”四個類別數張後, 整理如下的檔案格式
agv-object-detection/data/images
├── duck-001.jpg
├── duck-002.jpg
├── duck-003.jpg
…
標記資料
有了影像資料後,為了要能夠訓練深度學習模型學會Object Detection, 我們還必須手動label這些資料,在此所使用的軟體是有名的開源軟體labelimg(https://github.com/tzutalin/labelImg) 。
緊接著我們就標記每張圖片的框框以及其對應的類別,如下圖。
Left | Right | Stop | Duck |
Image may be NSFW. Clik here to view. ![]() |
Image may be NSFW. Clik here to view. ![]() |
Image may be NSFW. Clik here to view. ![]() |
Image may be NSFW. Clik here to view. ![]() |
最後存成檔案格式如下
agv-object-detection/data/annotations
├── duck-001.xml
├── duck-002.xml
├── duck-003.xml
…
準備Tensorflow Object Detection
我們所使用的深度學習框架為Google的Tensorflow,然後為了能夠使用Tensorflow的Object Detection API, 我們必須先下載函式庫到前面的agv-object-detection這個資料夾底下
由於函式庫相當大,所以下載可能會需要一些時間。
下載完成後,請輸入以下的指令完成安裝Python相依套件
再輸入以下的指令完成初始設
準備Protobuf
訓練模型
首先請先下載預訓練的模型,
將前面準備好的資料轉換格式
Step 1. 從xml檔轉成csv檔
Step 2. 存成Tensorflow指定的tfrecord格式
完成後就會看到在data的資料夾下會有一個叫做data.record的檔案囉!
agv-object-detection/data
└─── data.record
接著就可以開始訓練了!
Image may be NSFW.
Clik here to view.
訓練過程中出現的loss代表誤差度多少,越低代表學得越好,以這個範例而言,如果時間充足的話盡量讓loss壓到1.0以下, 但其實1~2之間就蠻夠用了。
如果想要解析訓練的過程,可以輸入以下的指令來啟動Tensorboard
Image may be NSFW.
Clik here to view.
訓練完後,為了要能夠轉成OpenVINO的形式,我們必須輸出我們訓練完後的模型
Image may be NSFW.
Clik here to view.
最後將inference-graphs這個資料夾搬到UP Squared上面, 注意到UP Squared上面也必須下載本文章的專案
在UP2上下載agv-object-detection
把inference-graphs放到agv-object-detection中,並切換工作目錄到agv-object-detection中
檔案形式如下
agv-object-detection/inference-graphs
├── checkpoint
├── frozen_inference_graph.pb
├── model.ckpt.data-00000-of-00001
├── model.ckpt.index
├── model.ckpt.meta
├── pipeline.config
└── saved_model
├── saved_model.pb
└── variables
下來會用到OpenVINO的Model Optimizer,關於怎麼在UP2上面安裝OpenVINO可以參考我們之前的文章 [OpenVINO & Movidius™ 2運算棒] 使用台灣路況即時影像對九份老街做街景辨識
輸入以下的指令來將Tensorflow的模型轉成OpenVINO的格式
Image may be NSFW.
Clik here to view.
轉譯成功後程式會將結果存在IR這個資料夾底下
agv-object-detection/IR
├── frozen_inference_graph.bin
├── frozen_inference_graph.mapping
└── frozen_inference_graph.xml
安裝RealSense函式庫
為了要在UP 2上面執行RealSense,我們必須先來安裝一些基本套件
加入新的apt key
Image may be NSFW.
Clik here to view.
新增Repo
Image may be NSFW.
Clik here to view.
安裝librealsense
Image may be NSFW.
Clik here to view.
確認Kernel是否更新
Image may be NSFW.
Clik here to view.
接上Intel RealSense,執行以下程式看看是否正常運作
Image may be NSFW.
Clik here to view.
Demo
如果已經有了IR資料夾底下的.xml跟.bin檔後, 就可以輸入以下的指令來跑一下Demo。
Image may be NSFW.
Clik here to view.
參考
- Training Custom Object Detector https://tensorflow-object-detection-api-tutorial.readthedocs.io/en/latest/training.html
- Creating your own object detector https://towardsdatascience.com/creating-your-own-object-detector-ad69dda69c85
- Librealsense Installation https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md