NVIDIAが価格99ドルをうたって発表した組み込みAIボード「Jetson Nano」。本連載では、技術ライターの大原雄介氏が、Jetson Nanoの立ち上げから、一般的な組み込みAIとしての活用までを含めていろいろと試していく。第5回では、猫とその種類の判別結果をLED点灯(Lチカ)で知らせる機能を作成してみる。
⇒連載「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()
ここでメインになるのは、19行目のwhile display.IsOpen()以降である。要するに、スクリーンにビデオ入力をそのまま表示させることに成功したら、まずcamera.CaptureRGBA()でビデオ画像をキャプチャー。それをnet.Classify()でClassificationし、さらにnet.GetClassDesc()を使って特定する。その結果がclass_descという文字列として返されるので、それを画面にオーバーレイ表示しているだけである。であれば、class_descが戻ってきたら、その結果をパースしてやるだけで「特定のモノを見つける」処理が実装できることになる。
見つける処理の実装は後で説明するとして、では見つけた後どうするか。ここは基本に立ち返って、LEDを点灯するLチカを実装してみたいと思う。本番ではネットワークなりシリアルポートなりで通信を送る、という形になるのだろうが、今回はお試しということでLチカをやってみたい。
Copyright © ITmedia, Inc. All Rights Reserved.