aptpod Advent Calendar 2021の14日目を担当するHW/OTグループの矢部です。前日の塩出さんの記事でエディタの話がありましたが、私が使用しているエディタはEmacsです。社内では多分2、3人しかいない少数派。何年か前は Spacemacs で使っていましたが、ここ数年は Doom Emacs を Vim キーバインドで利用しています。もはやデフォルトのEmacsのキーバインドはほぼ忘れているレベルです。たまに間違ってキーバインドが変わってしまうととても焦る。
この勢いでエディタの話をしてもよいですが、一応ネタとしては別のものを事前に用意していたので、そちらの話をします。
今回私が紹介するのは、aptpod 製エッジコンピュータ EDGEPLANT T1で動画の処理を行い、かつそのデータをサーバにリアルタイムに上げてみるというお話です。 磯光雄監督の最新作「地球外少年少女」が2022年1月にNetflixで公開されることを記念して、電脳コイル的なAR表現をできたら面白いなと思ってはいましたが、残念ながら力及ばす、今回は比較的簡単なもののご紹介です。
どういうことをやるのか
aptpod でよくあるソリューションとして、intdash Edge を利用してカメラ画像をサーバに上げ、Web UIで動画として見る、というものがあります。以下の図は HPで Device Connector*1 の説明に使われているものですが、ここで書いているところの「データデバイス(カメラ) → Device Connector → Edge Agent → intdash API」という経路でデータが流れていきます。
今回は、この Device Connector に手を加えて、取得した画像に処理を行ってサーバに上げるようにしてみます。エッジコンピューティング的なアレですね。 比較できないとよくわからないと思うので、元画像も同時にサーバに上げるようにします。こちらは Edge Agent にプラグインという形でデータをクローンする機能を追加します。
イメージとしては大体こんな感じです。
VPIとは
記事のタイトルにも入れた、NVIDIA の Vision Programming Interface (VPI) について軽く説明します。
VPIは、CPUやGPUなどJetson内の複数の計算リソースを利用して画像処理を行うことができるAPIです。CUDAのようにゴリゴリにGPUを使い倒す、というようなものではなく、比較的実装しやすい方法で効率的に処理が行えます。バックエンドにCPUやGPUなどの複数のリソースを選択できるようになっており、実装する際にはバックエンドが何かを意識せず共通のコードが書けるため、同じアルゴリズムを容易に様々な環境で動かすことができるようになります。GPUプログラミングとかやらなくていいのは楽ですね。
docs.nvidia.com www.macnica.co.jp
デモ
では、実際に動かしてみましょう。今回は、VPI のページにあるサンプルコードの中から、以下の2つを動かしていきます。
- 2D Image Convolution
- Harris Corners Detector
Device Connector や Edge Agent のプラグイン部分のコードはちょっと量があるため、今回ここでは記載しません。画像処理部分については、処理負荷の都合上変更したところが一部ありますが、NVIDIAのサンプルコードをほぼそのまま使っています。
2D Image Convolution
イメージのエッジを検出する処理になります。
左が元のカメラ画像、右が処理を行った後の画像です。静止画なのでわかりづらいですが、ほぼ遅延なく処理できていました。ちなみに右で見切れているのは aptpod の製品 ANALOG-USB Interface です。
Harris Corners Detector
コーナー検出のアルゴリズムの一つです。Harrisは人の名前。
こちらも同様に、左が元のカメラ画像、右が処理を行った後の画像です。 サンプルにあった写真を印刷してみたんですが、品質の問題か全然検出されてません。その代わり、EDGEPLANTのロゴはがっつり検出されています。あとパンダの鼻もしっかり色ついてますね。
2D Image Convolution & Harris Corners Detector
せっかくなので両方同時に動かして負荷を見てみます。負荷情報などのデータは Edge Agent が常時サーバに上げているため、このようにエッジの状態を容易にチェックできます。
CPUはほとんど上がらず、GPU(グラフの紫ライン)が10%~30%あたりを行ったり来たりしています。まだまだ余裕がある印象です。
走行デモ
最後に、実際に車に EDGEPLANT T1 を乗せて、今回の処理を動かした際のデモ動画。道路の白線や橋などがエッジとしてきれいに検出されていて、結構気に入っています。
この動画は画像処理の精度が上がるように HD(1280x720) 画質で撮っているため、GPU使用率が +10% 程度上がっていますが、問題ないレベルです。
まとめ
EDGEPLANT T1 での VPI 実装をお試しで作ってみましたが、VPI の使い方などまだまだ改善の余地がありそうです。今回紹介した VPI でのエッジ処理の事例は aptpod ではまだありませんが、画像処理を行いたいというニーズは多いですので、ブラッシュアップされたものがどこかで日の目を見るかも?しれません。
aptpod のエッジ側のチームでは、こんな感じでいろいろやっています。がっつり組込みから Linux アプリケーションまで、エンジニア随時募集してますのでぜひぜひご連絡ください。Emacs使い、待ってるよ!
*1:デバイスからデータ送受信を行うためのモジュール