【OpenVINO x UP Squared x RealSense 深度攝影機】 使用深度影像實做道路避障偵測
目標
本篇文章靈感發想自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運算棒] 使用台灣路況即時影像對九份老街做街景辨識 。
此外,還有本文的主角深度攝影機 Intel RealSense D435!
本文將會含括訓練深度學習模型的部份,建議準備有一台有GPU的電腦,本文以一台有GTX 1060的筆電為例,其上的作業系統為Linux。
最後,請下載本次的範例程式
[pastacode lang="python" manual="git%20clone%20https%3A%2F%2Fgithub.com%2Fcavedunissin%2Fagv-object-detection" message="" highlight="" provider="manual"/]
然後記得切換工作目錄到agv-object-detection
[pastacode lang="python" manual="cd%20agv-object-detection" message="" highlight="" provider="manual"/]
收集資料
之前路牌的資料可以從我們公開的資料下載(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 |
![]() |
![]() |
![]() |
![]() |
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這個資料夾底下 [pastacode lang="python" manual="%23%20Inside%20agv-object-detection%0Agit%20clone%20https%3A%2F%2Fgithub.com%2Ftensorflow%2Fmodels%0A" message="" highlight="" provider="manual"/] 由於函式庫相當大,所以下載可能會需要一些時間。 下載完成後,請輸入以下的指令完成安裝Python相依套件 [pastacode lang="python" manual="sudo%20pip3%20install%20-r%20requirements.txt" message="" highlight="" provider="manual"/] 再輸入以下的指令完成初始設 [pastacode lang="python" manual="make%20init" message="" highlight="" provider="manual"/] 準備Protobuf [pastacode lang="python" manual="make%20compile_protobuf" message="" highlight="" provider="manual"/]訓練模型
首先請先下載預訓練的模型, [pastacode lang="python" manual="make%20download_model" message="" highlight="" provider="manual"/] 將前面準備好的資料轉換格式 Step 1. 從xml檔轉成csv檔 [pastacode lang="python" manual="make%20xml_to_csv" message="" highlight="" provider="manual"/] Step 2. 存成Tensorflow指定的tfrecord格式 [pastacode lang="python" manual="make%20generate_tfrecord" message="" highlight="" provider="manual"/] 完成後就會看到在data的資料夾下會有一個叫做data.record的檔案囉! agv-object-detection/data └─── data.record 接著就可以開始訓練了! [pastacode lang="python" manual="make%20train" message="" highlight="" provider="manual"/]
訓練過程中出現的loss代表誤差度多少,越低代表學得越好,以這個範例而言,如果時間充足的話盡量讓loss壓到1.0以下, 但其實1~2之間就蠻夠用了。
如果想要解析訓練的過程,可以輸入以下的指令來啟動Tensorboard
[pastacode lang="python" manual="make%20log_train" message="" highlight="" provider="manual"/]
訓練完後,為了要能夠轉成OpenVINO的形式,我們必須輸出我們訓練完後的模型
[pastacode lang="python" manual="make%20export" message="" highlight="" provider="manual"/]
最後將inference-graphs這個資料夾搬到UP Squared上面, 注意到UP Squared上面也必須下載本文章的專案
在UP2上下載agv-object-detection
[pastacode lang="python" manual="git%20clone%20https%3A%2F%2Fgithub.com%2Fcavedunissin%2Fagv-object-detection" message="" highlight="" provider="manual"/]
把inference-graphs放到agv-object-detection中,並切換工作目錄到agv-object-detection中
[pastacode lang="javascript" manual="cd%20agv-object-detection" message="" highlight="" provider="manual"/]
檔案形式如下
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的格式
[pastacode lang="python" manual="make%20model_optimize" message="" highlight="" provider="manual"/]
轉譯成功後程式會將結果存在IR這個資料夾底下
agv-object-detection/IR
├── frozen_inference_graph.bin
├── frozen_inference_graph.mapping
└── frozen_inference_graph.xml
安裝RealSense函式庫
為了要在UP 2上面執行RealSense,我們必須先來安裝一些基本套件 加入新的apt key [pastacode lang="java" manual="sudo%20apt-key%20adv%20--keyserver%20keys.gnupg.net%20--recv-key%20C8B3A55A6F3EFCDE%20%7C%7C%20sudo%20apt-key%20adv%20--keyserver%20hkp%3A%2F%2Fkeyserver.ubuntu.com%3A80%20--recv-key%20C8B3A55A6F3EFCDE" message="" highlight="" provider="manual"/]
新增Repo
[pastacode lang="python" manual="sudo%20add-apt-repository%20%22deb%20http%3A%2F%2Frealsense-hw-public.s3.amazonaws.com%2FDebian%2Fapt-repo%20bionic%20main%22%20-u" message="" highlight="" provider="manual"/]
安裝librealsense
[pastacode lang="python" manual="sudo%20apt-get%20install%20librealsense2-dkms%20librealsense2-utils" message="" highlight="" provider="manual"/]
確認Kernel是否更新
[pastacode lang="python" manual="modinfo%20uvcvideo%20%7C%20grep%20realsense" message="" highlight="" provider="manual"/]
接上Intel RealSense,執行以下程式看看是否正常運作
[pastacode lang="python" manual="realsense-viewer" message="" highlight="" provider="manual"/]
Demo
如果已經有了IR資料夾底下的.xml跟.bin檔後, 就可以輸入以下的指令來跑一下Demo。 [pastacode lang="python" manual="make%20demo" message="" highlight="" provider="manual"/]
參考
- 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




留言 💬 (0)
還沒有留言,來當第一個。