Jetson NanoでOAK-D OpenCV DepthAIカメラを使ってみる!

はじめに

Deep learning技術はたくさんのコンピュータリソースが必要なため, それを効率的に演算するFPGA, GPU, TPU, VPU等のプロセッサがいます. それらのプロセッサはエッジデバイスにも搭載され, Nvidia製のJetsonシリーズのボードやIntel 製のVPUを備えたカメラがあります. 今回はそうしたデバイスを組み合わせたDeep learning を行うのに適した環境を構築したので, それを紹介します.

今回試した組み合わせ

今回はGPUを備えているJetson NanoとVPUを備えているOpenCV AI Kitを組み合わせてみました. それぞれ単体で効率的にDeep learningの推論を行うことができます.

ボードCUDAコア128基(Jetson Nano)
カメラIntel® Movidius™ Myriad™ X Vision Processing Units(OpenCV AI Kit)

準備したもの

セットアップ

OAK-D OpenCV DepthAIカメラでMediaPipe実行用にDepthAI, Jetson Nanoで推論用にTensorflowをインストールします.

DepthAI

# Disable ZRAM:
sudo systemctl disable nvzramconfig
# Create 4GB swap file
sudo fallocate -l 4G /mnt/4GB.swap
sudo chmod 600 /mnt/4GB.swap
sudo mkswap /mnt/4GB.swap

sudo -H apt install -y python3-pip

#Download and install the dependency package
sudo wget -qO- http://docs.luxonis.com/_static/install_dependencies.sh | bash

#Clone github repository
git clone https://github.com/luxonis/depthai.git
cd depthai

echo "export OPENBLAS_CORETYPE=ARMV8" >> ~/.bashrc
python3 install_requirements.py

Tensorflow

# dependency
sudo apt-get update
sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran

# update pip
sudo apt-get install python3-pip
sudo pip3 install -U pip testresources setuptools==49.6.0

sudo pip3 install -U --no-deps numpy==1.19.4 future==0.18.2 mock==3.0.5 keras_preprocessing==1.1.2 keras_applications==1.0.8 gast==0.4.0 protobuf pybind11 cython pkgconfig

# tensorflow
sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v46 tensorflow

サンプル

Jetson Nano + OpenCV AI Kitで手のジェスチャー認識を試してみます.
手の形の認識ができれば成功です.

git clone --recursive https://github.com/tech-life-hacking/HandGestureRecognition.git
cd HandGestureRecognition
python3 example.py

検証

手のジェスチャー認識は

  1. 手の画像から手の代表点の座標を抽出
  2. その座標をクラスタリングしてどんなジェスチャーをしているか判別

ということをしています.

前者はOpenCV AI Kitに搭載されているVPUが行っており, この処理におおよそ20msくらいかかっています.

後者はJetson NanoのGPUが行っており, おおよそ0.7msかかっています.

このようにJetson NanoとOAK-Dカメラを組み合わせると, 手のジェスチャー認識の処理時間は20ms程度になります. 他に処理をいれなければ40-50FPS程度でることになります.

OAK-D vs Raspberry Pi

手の画像から手の代表点の座標を抽出する部分の処理時間をOAK-DとRaspberry Piで実行したときで比較しました. Raspberry Pi 4によるCPU推論に比べてOAK-DのVPU推論の方が40msほど早いです.

おわりに

Jetson NanoとOAK-Dカメラを組み合わせると, 手のジェスチャー認識の処理時間は20ms程度になり, エッジデバイスでも40-50FPS出すことができました. エッジデバイスでDeep learning技術を実装する場合はRaspberry Pi以外のものも選択肢に入ってくると思います.