[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。

最後,請下載本次的範例程式

git clone https://github.com/cavedunissin/agv-object-detection

然後記得切換工作目錄到agv-object-detection

cd 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) 。

緊接著我們就標記每張圖片的框框以及其對應的類別,如下圖。

LeftRightStopDuck

最後存成檔案格式如下

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這個資料夾底下

# Inside agv-object-detection
git clone https://github.com/tensorflow/models

由於函式庫相當大,所以下載可能會需要一些時間。

下載完成後,請輸入以下的指令完成安裝Python相依套件

sudo pip3 install -r requirements.txt

再輸入以下的指令完成初始設

make init

準備Protobuf

make compile_protobuf

訓練模型

首先請先下載預訓練的模型,

make download_model

將前面準備好的資料轉換格式

Step 1. 從xml檔轉成csv檔

make xml_to_csv

Step 2. 存成Tensorflow指定的tfrecord格式

make generate_tfrecord

完成後就會看到在data的資料夾下會有一個叫做data.record的檔案囉!

agv-object-detection/data

└─── data.record

接著就可以開始訓練了!

make train

訓練過程中出現的loss代表誤差度多少,越低代表學得越好,以這個範例而言,如果時間充足的話盡量讓loss壓到1.0以下, 但其實1~2之間就蠻夠用了。

如果想要解析訓練的過程,可以輸入以下的指令來啟動Tensorboard

make log_train

訓練完後,為了要能夠轉成OpenVINO的形式,我們必須輸出我們訓練完後的模型

make export

最後將inference-graphs這個資料夾搬到UP Squared上面, 注意到UP Squared上面也必須下載本文章的專案

在UP2上下載agv-object-detection

git clone https://github.com/cavedunissin/agv-object-detection

把inference-graphs放到agv-object-detection中,並切換工作目錄到agv-object-detection中

cd 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的格式

make model_optimize

轉譯成功後程式會將結果存在IR這個資料夾底下

agv-object-detection/IR

├── frozen_inference_graph.bin

├── frozen_inference_graph.mapping

└── frozen_inference_graph.xml

安裝RealSense函式庫

為了要在UP 2上面執行RealSense,我們必須先來安裝一些基本套件

加入新的apt key

sudo apt-key adv --keyserver keys.gnupg.net --recv-key C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C8B3A55A6F3EFCDE

新增Repo

sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo bionic main" -u

安裝librealsense

sudo apt-get install librealsense2-dkms librealsense2-utils

確認Kernel是否更新

modinfo uvcvideo | grep realsense

接上Intel RealSense,執行以下程式看看是否正常運作

realsense-viewer

Demo

如果已經有了IR資料夾底下的.xml跟.bin檔後, 就可以輸入以下的指令來跑一下Demo。

make demo

參考

  1. Training Custom Object Detector https://tensorflow-object-detection-api-tutorial.readthedocs.io/en/latest/training.html
  2. Creating your own object detector https://towardsdatascience.com/creating-your-own-object-detector-ad69dda69c85
  3. Librealsense Installation https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *