みらいテックラボ

音声・画像認識や機械学習など, 管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

Jetson NanoでIntel Realsenseを試してみる(1)

以前から開発を進めているピープルカウンタ[1]で, 人物の検出にYOLOv3を試してみたいと思い, Jetson Nanoを購入した.
まずは, Jetson NanoでIntel Realsense D415を繋いで, 開発環境を整えるところから.


1. Jetson Nanoセットアップ
準備したもの.
新規購入品:
 ・NVIDIA Jetson Nano
 ・microSDXC 64GB SanDisk Extreme UHS-1 U3 V30 4K Ultra HD A2対応
 ・ACアダプタ 5V4A
 ・アクリルケース









保有品:
 ・モニタ(IODATA GigaCrysta EX-LDGCQ241DB, LCD-DTV223XBE)
 ・キーボード/マウス
 ・HDMIケーブル/Display Portケーブル
 ・LANケーブル
 等

Jetson Nanoのセットアップについては, 公式サイト[2]を始め, 多くの記事[3][4]があるのでそちらを参照ください.
developer.nvidia.com

簡単にセットアップできると思ったのだが, Jetson Nanoが起動しない(?)のか, モニタ画面に「入力信号なし」と表示される.
SDカードが問題かと, 他のSDカードで試すも症状同じ.
いろいろと試し悩んだが, どうもDisplay PortケーブルでEX-LDGCQ241DBに繋いでいたのが原因のようで, HDMIで繋ぐとnVIDIAのロゴ画面が表示され一応Ubuntuが起動したが , 画面表示がおかしい.
結局, LCD-DTV223XBEにHDMI接続すると, 問題なく動作(Ubuntu起動&表示)した.
Jetson NanoとEX-LDGCQ241DBの相性の問題かとも思ったが, どうも2560x1440の解像度がダメのようだ!!

Ubuntuの「System Configuration」を行い, ログインするとこんな感じ.
f:id:moonlight-aska:20190821234303p:plain:w500

2. Intel Realsense SDK 2.0インストール
Jetson NanoからIntel Realsense D415を使用したいので, Intel RealSense SDK 2.0[5]をインストールする.
インストール方法はJetsonHacks[6]を参照した.
www.jetsonhacks.com

(1) swapファイル

$ git clone https://github.com/jetsonhacksnano/installSwapfile
$ cd installSwapfile
$ ./installSapfile.sh

(2) librealsense
ビルド時にPythonからも利用可能なように, コンパイルオプションが設定されていることを確認.

$ git clone https://github.com/jetsonhacksnano/installLibrealsense
$ cd installLibrealsense
$ ./installLibrealsense.sh

さらに, カーネルにpatchをあてる場合には, 以下を実行する.
D435iを使用する場合は必須のようだ.
カーネルのビルドが始まるが, ビルドに1時間以上かかった.

$ ./patchUbuntu.sh

新しいTerminalを起動して, python3からpyrealsense2のimportを試みたところ, 問題はなさそうだ.

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyrealsense2
>>>


3. OpenCVセットアップ
OpenCVは'3.3.1'がデフォルトでインストールされているが, python3からはimportできなかった.

$ python
Python 2.7.15+ (default, Nov 27 2018, 23:36:35) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.3.1'
>>> 

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
ImportError: numpy.core.multiarray failed to import
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: numpy.core.multiarray failed to import
>>>

Numpyのバージョンが古いようなので, アップデートする.

$ sudo apt install python3-pip
 (省略)

$ pip3 install numpy --upgrade
Collecting numpy
  Downloading https://files.pythonhosted.org/packages/da/32/1b8f2bb5fb50e4db68543eb85ce37b9fa6660cd05b58bddfafafa7ed62da/numpy-1.17.0.zip (6.5MB)
    100% |████████████████████████████████| 6.5MB 78kB/s 
Building wheels for collected packages: numpy
  Running setup.py bdist_wheel for numpy ... | 
done
  Stored in directory: /home/aska/.cache/pip/wheels/cc/99/ab/d71e4d18bd33901983b7caf3e1ab75ad0c9a6d6f55b2b7939c
Successfully built numpy
Installing collected packages: numpy
Successfully installed numpy-1.17.0

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.3.1'
>>> 


4. D415動作確認
以前作成していたプログラムで, 動作確認.

#############################################
##      D415 Depth画像の表示
#############################################
import pyrealsense2 as rs
import numpy as np
import cv2

TARGET_DISTANCE = 2.0 # meter
WIDTH = 640
HEIGHT = 480
FPS = 30

# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, WIDTH, HEIGHT, rs.format.z16, FPS)
config.enable_stream(rs.stream.color, WIDTH, HEIGHT, rs.format.bgr8, FPS)

# ストリーミング開始
profile = pipeline.start(config)

# Depthスケール取得
#   距離[m] = depth * depth_scale 
depth_sensor = profile.get_device().first_depth_sensor()
depth_scale = depth_sensor.get_depth_scale()
# 対象範囲の閾値
distance_max = TARGET_DISTANCE/depth_scale
print('Depth Scale = {} -> {}'.format(depth_scale, distance_max))

try:
    while True:
        # フレーム待ち(Depth & Color)
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()
        if not depth_frame or not color_frame:
            continue
        color_image = np.asanyarray(color_frame.get_data())
        # Depth画像前処理(2m以内を画像化)
        depth_image = np.asanyarray(depth_frame.get_data())
        depth_image = (depth_image < distance_max) * depth_image
        depth_graymap = depth_image * 255. / distance_max
        depth_graymap = depth_graymap.reshape((HEIGHT, WIDTH)).astype(np.uint8)
        depth_colormap = cv2.cvtColor(depth_graymap, cv2.COLOR_GRAY2BGR)

        # 入力画像表示
        images = np.hstack((color_image, depth_colormap))
        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RealSense', images)
        if cv2.waitKey(1) & 0xff == 27:
            break

finally:
    # ストリーミング停止
    pipeline.stop()
    cv2.destroyAllWindows()

一応, Jetson Nano上で, D415動いていそうだ.
f:id:moonlight-aska:20190824010216p:plain

あまりJetson Nanoさわる時間取れなかったこともあるが, D415を動かすのに思った以上に時間がかかってしまった.
次は, Jetson Nano上でYOLO v3を動かしてみよう!!

----
参照URL:
[1] ピープルカウンタを考えてみる(1) ~ (5)
[2] https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit=Getting Started With Jetson Nano Developer Kit | NVIDIA Developer
[3] 小型 AI コンピュータ NVIDIA Jetson Nano 開発者キットのセットアップ
[4] Jetson Nanoをセットアップしてディープラーニングで画像認識を試してみた
[5] Intel RealSense SDK 2.0 | Intel Software
[6] Jetson Nano - RealSense Depth Camera - Jetson Hacks