今回はJetson Nanoに接続したIntel社のRealSenseのRGBカメラの映像に対して、リアルタイム物体検出する方法を解説します。物体検出には機械学習ライブラリPyTorchと学習済みモデルYOLOv5を使用します。
また、Jetson Nanoに関する記事を以下のページでまとめていますので、あわせてご覧ください。
環境
ハードウェア:Jetson Nano A02 4GB
JETPACK SDK:4.6.2
Python:3.6.9
Jetson Nanoの本体については、私が使用しているモデルは旧モデルのA02ですが、これから購入される方はインタフェースなどが増えているB01モデルがおすすめです。
機械学習モデル PyTorch+YOLOv5
今回、物体検出に使用する機械学習ライブラリはMETA社が公開しているPyTorchです。また、学習済みモデルはYOLOv5を使用します。
Jetson NanoでのPyTorchとYOLOv5のセットアップ方法は以下の記事で解説していますので、事前に済ませておいてください。
イメージセンサー Intel RealSense D435
今回使用するカメラはIntel社が開発、販売しているステレオカメラRealSense D435です。Depthカメラを搭載しており深度計測が可能です。今回はD435のRGBカメラの映像を使用して物体検出を行います。
D435をPythonのプログラムから使用する場合には、Pythonのラッパーライブラリであるlibrealsenseを事前にセットアップしておく必要があります。librealsenseのセットアップ方法については以下の記事で解説していますので、事前に済ませておいてください。
作成したソースコード
今回使用するソースコードは、先ほど紹介した「REALSENCE D435のカメラ映像でPyTorchとYOLOv5を使ってリアルタイムに物体検出する方法」で掲載しているコードと全く同じものを使用しました。
Jetson NanoでこちらのソースコードをそのままJetson Nano上で実行するだけで動作します。
import pyrealsense2 as rs
import numpy as np
import cv2
import cv2
import torch
# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
#YOLOのモデルをロード
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
#YOLOを使った物体検出
def predict(img):
#推論を実行
result = model(img)
result.render()
#戻り値
return result.ims[0]
#メイン処理
def main():
# Start streaming
pipeline.start(config)
try:
while True:
# Wait for a coherent pair of frames: depth and 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
# Convert images to numpy arrays
depth_image = np.asanyarray(depth_frame.get_data())
color_image = np.asanyarray(color_frame.get_data())
#推論実行
color_image = predict(color_image)
# Apply colormap on depth image (image must be converted to 8-bit per pixel first)
depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
# Stack both images horizontally
images = np.hstack((color_image, depth_colormap))
# Show images
cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
cv2.imshow('RealSense', images)
cv2.waitKey(1)
finally:
# Stop streaming
pipeline.stop()
if __name__ == '__main__':
main()
実行結果
RealSenseをJetson NanoのUSB3.0ポートに接続します。
先ほどのプログラムを実行するとRealSenseのRGBカメラとDepthカメラの映像が表示されます。スマホを手にもってカメラの前にかざすと、スマホの周りにバウンディングボックスが表示され「cell phone」と正しく検出できました。
まとめ
今回はJetson Nanoに接続したRealSense D435のRGBカメラの映像を使って物体検出する方法について解説しました。
librealsenseが動作する環境さえ作ってしまえば非常に簡単に実現することができました。
機械学習を効率よく学びたい方には、自分のペースで動画で学べるUdemyの以下の講座がおすすめです。数学的な理論からPythonでの実装までを習得できます。(私自身もこの講座を受講しています)
【徹底的に解説!】人工知能・機械学習エンジニア養成講座(初級編~統計学から数字認識まで~)また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。
スキルアップや副業にぜひ活用してみてください。
スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。
講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。
それでは、また次の記事でお会いしましょう。
コメント