「Jetson Nano」でにゃんこを判別してLチカで知らせるエッジAIデバイスを作るJetson Nanoで組み込みAIを試す(5)(1/4 ページ)

NVIDIAが価格99ドルをうたって発表した組み込みAIボード「Jetson Nano」。本連載では、技術ライターの大原雄介氏が、Jetson Nanoの立ち上げから、一般的な組み込みAIとしての活用までを含めていろいろと試していく。第5回では、猫とその種類の判別結果をLED点灯(Lチカ)で知らせる機能を作成してみる。

» 2019年10月23日 10時00分 公開
[大原雄介MONOist]

⇒連載「Jetson Nanoで組み込みAIを試す」バックナンバー

 Jetson Nanoが優秀な猫判別機として利用できる(?)ことは、前回ご紹介した通りだが、いくら優秀とは言っても、画面にオーバーレイの形で猫の種別が出てくるだけでは他に応用がきかない。エッジデバイスに使うのであれば、その情報を他に受け渡しできないと意味が無いからだ。

 このあたりはどうなっているか、ということでまずは前回使用した「Live Camera Recognition Demo」の「imagenet-camera」の中身をちょっと確認してみたい。前回まではCで記述されたプログラムをベースにご紹介してきたが、今回はちょっとソースをいじるので、簡単に編集しやすいPythonの方で。中身はCのものと違いは無い。

 冒頭のコメント部を除いたソースはこんな感じである(リスト1)。

import jetson.inference
import jetson.utils
import argparse
# parse the command line
parser = argparse.ArgumentParser(description="Classify a live camera stream using an image recognition DNN.", 
						   formatter_class=argparse.RawTextHelpFormatter, epilog=jetson.inference.imageNet.Usage())
parser.add_argument("--network", type=str, default="googlenet", help="pre-trained model to load, see below for options")
parser.add_argument("--camera", type=str, default="0", help="index of the MIPI CSI camera to use (NULL for CSI camera 0),\nor for VL42 cameras the /dev/video node to use (/dev/video0).\nby default, MIPI CSI camera 0 will be used.")
parser.add_argument("--width", type=int, default=1280, help="desired width of camera stream (default is 1280 pixels)")
parser.add_argument("--height", type=int, default=720, help="desired height of camera stream (default is 720 pixels)")
opt, argv = parser.parse_known_args()
# load the recognition network
net = jetson.inference.imageNet(opt.network, argv)
# create the camera and display
font = jetson.utils.cudaFont()
camera = jetson.utils.gstCamera(opt.width, opt.height, opt.camera)
display = jetson.utils.glDisplay()
# process frames until user exits
while display.IsOpen():
	# capture the image
	img, width, height = camera.CaptureRGBA()
	# classify the image
	class_idx, confidence = net.Classify(img, width, height)
	# find the object description
	class_desc = net.GetClassDesc(class_idx)
	# overlay the result on the image	
	font.OverlayText(img, width, height, "{:05.2f}% {:s}".format(confidence * 100, class_desc), 5, 5, font.White, font.Gray40)
	
	# render the image
	display.RenderOnce(img, width, height)
	# update the title bar
	display.SetTitle("{:s} | Network {:.0f} FPS".format(net.GetNetworkName(), 1000.0 / net.GetNetworkTime()))
	# print out performance info
	net.PrintProfilerTimes()
リスト1 imagenet-cameraのソース

 ここでメインになるのは、19行目のwhile display.IsOpen()以降である。要するに、スクリーンにビデオ入力をそのまま表示させることに成功したら、まずcamera.CaptureRGBA()でビデオ画像をキャプチャー。それをnet.Classify()でClassificationし、さらにnet.GetClassDesc()を使って特定する。その結果がclass_descという文字列として返されるので、それを画面にオーバーレイ表示しているだけである。であれば、class_descが戻ってきたら、その結果をパースしてやるだけで「特定のモノを見つける」処理が実装できることになる。

 見つける処理の実装は後で説明するとして、では見つけた後どうするか。ここは基本に立ち返って、LEDを点灯するLチカを実装してみたいと思う。本番ではネットワークなりシリアルポートなりで通信を送る、という形になるのだろうが、今回はお試しということでLチカをやってみたい。

       1|2|3|4 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.