同セッションでは、GROOVE X株式会社の画像認識エンジニアである齋藤 鴻さんに、家族型ロボット『LOVOT[らぼっと]』の画像認識を支える技術についてお話しいただきました。LOVOT 3.0で刷新されたハードウェア構成を最大限に活用するために行き着いたRustという選択肢、そしてロボットならではの制約の中でどのような画像認識が行われているのか、幅広く語っていただいた内容をお届けします。ぜひ本編のアーカイブ動画とあわせてご覧ください。
齋藤:GROOVE Xの齋藤と申します。社内ではよく「あず」と呼ばれています。好きな言語は10年以上続けているRustで、ずっと書き続けています。
GROOVE Xは、LOVOTという家族型ロボットをつくっています。開発が始まってから10年以上が経過しており、現時点で18,000体以上が活動しています。
LOVOTはさまざまなプロトタイプを経て2019年に販売を開始しました。4年ほどかけてようやく販売にこぎ着けた形です。その後、LOVOT 2.0が約2年後に登場し、さらに2年ほど経ってLOVOT 3.0という最新モデルが発売されました。LOVOT 3.0ではCPUボードがJetsonに変わるなど大きく進化しています。
家庭用ロボット業界が、実は盛り上がってきています。先日のCES 2026でもさまざまな家庭用ロボットが展示されており、市場として今後も成長していくのではないかと考えています。
LOVOTのうちがわ
LOVOTの内部構造についてご説明します。画像は初代/2.0の仕様ではありますが、モーターやカメラ、CPUなど多数のコンポーネントが組み合わさった構造になっています。ハードウェアもソフトウェアも複雑な構成です。こうしたさまざまなパーツを組み合わせて、人に懐いたり人に愛されるための振る舞いを実現しています。

ソフトウェアの視点で言うと、LOVOT本体の中のソフトウェアをつくるチーム以外にも、クラウドやアプリを担当するチームがあります。1つの製品とはいえ大規模なチーム体制です。
もう少し詳しく見ていくと、メインはPythonでつくられている部分が多いのですが、私が書いているのはRustで実装しているコンポーネントです。GoやC++で書かれている部分もあります。内部通信にはRedisやgRPCを使っており、アプリはUnityで開発しているため基本的にはC#です。

LOVOT OS
LOVOTの中で動いているOSは、どの世代も今のところはUbuntuベースで構築しています。LOVOT用にカスタマイズされたもので、LOVOT 3.0においてはJetson用にNVIDIAがカスタマイズしたUbuntuを、さらにLOVOT向けに調整しています。LOVOT上で動くサービスはUbuntuのパッケージと同じ形式でビルドし、このLOVOT OSの中に大量のパッケージが入ることでLOVOTを構成しています。
LOVOTにとっての画像認識
LOVOTは人に愛されるために生まれてきたので、人のことを詳しく知る必要があります。そのため、基本的には物体検出とトラッキングという2つの仕組みを組み合わせて使っています。物体検出は画像の中にある物体の位置と大きさを認識する深層学習のモデルです。トラッキングは、検出したものがどのように動いているかを追跡するための仕組みです。それ以外にもさまざまな処理がありますが、メインはこの2つです。
LOVOT 3.0のカメラ構成と要求性能
ハードウェア面を比較すると、初代と2.0では半天球カメラ1台を使って人の存在を認識し、個人を識別するところまでを行っていました。LOVOT 3.0になってカメラが2台に増えています。頭頂部にある半天球カメラが周囲を見渡しつつ、正面の小型カメラで目の前にいる人の情報をさらに詳しく認識する仕組みです。人がいることだけでなく、人が何をしているのかまでを詳しく認識しています。

要求性能としては30fpsで認識する必要があります。JetsonシリーズのOrinという世代を使っており、ArmのCPUとGPU、さらに各種の特化型プロセッサが搭載されています。Jetson Orinはそれなりに高性能ではあるものの、さまざまな認識を30fpsという高頻度で行うため、1ミリ秒すら無駄にできないという要件があります。
LOVOT特有の画像認識の課題
LOVOTならではの話として、頭頂部の魚眼カメラで撮影した画像は大きく歪んでいます。一般的な画像認識ではあまり扱わないユニークな条件です。また、家の中をずっと動き続けるロボットですから、映像のブレが常に発生します。暗い場所での認識も必要なのですが、カメラの性能が良いため暗所でも映像は比較的きれいに映ります。
歪んだ画像やブレた画像の認識はあまり事例がないため、独自に実装する必要があります。

画像認識の実装
Jetsonを活用した実装
Jetsonには、CPUとGPUだけでなく処理特化型のプロセッサが多数搭載されています。DLA、VIC、PVA、ISP、NVDECなど、さまざまなプロセッサが載っています。JetsonのCPUはそれほど強力ではないため、画像認識においては処理をGPUやそれ以外のプロセッサに逃がすことが重要です。
CPU、GPU以外の特化型プロセッサは電力効率に優れています。ロボットはバッテリーで動くため、電力効率は非常に重要な要素です。これは一般的なソフトウェア開発とは大きく異なるポイントです。こうしたプロセッサを使うためにはNVIDIA製のライブラリを使う必要があります。
GPUとDLAの使い分け
深層学習モデルの実行にはGPUかDLAを使います。GPUは電力効率が劣るものの、さまざまなモデルを実行できます。一方でDLAは電力効率が良い代わりに、深層学習専用という制約があります。
DLAはGPUほどの処理性能がないため、モデルの精度を落として高速化するアプローチが必要です。通常はFP32精度で実行するモデルをFP16精度にするのは比較的簡単ですが、さらにINT8精度まで落とすのは難しい作業です。しかし、INT8精度のモデルをDLAで動かすと、FP16精度をGPUで動かすのとほぼ同等の処理速度が得られます。つまり、苦労すれば速度はそのままで省電力化が実現できるということです。
また、DLAでは実行できない演算もあります。たとえば、最近流行りのTransformerの仕組みはDLAでは動きません。そうした場合は演算を組み換えてDLAで実行できるようにするか、GPUで実行するかといった判断が必要になります。
VICプロセッサとDeepStreamの関係
画像のリサイズは通常CPUやGPUで行いますが、JetsonではVICというプロセッサで実行します。DeepStreamというNVIDIAのライブラリを使うと、VIC(Video Image Compositor)によるリサイズを標準で行ってくれます。ただし、画像の回転まで行おうとすると、独自にVICプロセッサを叩く必要があります。VICを叩くAPIがVPI(Vision Programming Interface)というライブラリです。
言語選定の技術要件
これまでの要件を整理すると、どのような言語を選ぶべきかが見えてきます。
まず処理速度が速いこと。1ミリ秒すら無駄にできないため、言語自体が速いほうが望ましいです。次に、DeepStreamのライブラリが使えることが大前提となります。DeepStreamにはカメラの入力、推論、トラッキングといった画像認識に必要な一連の機能が組み込まれています。さらに、Cのライブラリを呼び出せることも重要です。DeepStreamの範疇にない機能もあり、たとえばVICを叩くVPIはCのライブラリとして提供されています。
また、サービスの安定性も求められます。LOVOTが動いている最中にサービスが落ちると、LOVOT本体も止まってしまいます。静的解析のしやすさ、例外のキャッチ漏れがないこと、メモリ安全性といった特性が重要です。加えて、生産性の高さも欠かせません。書きやすさ、ライブラリの導入のしやすさ、ライブラリの豊富さが求められます。
Rustが現実的な選択肢である理由
こうした条件を考えると、Rustが現実的な選択肢として浮かび上がります。処理速度はCやC++と同等以上です。DeepStreamはCのライブラリなのでRustから呼び出せます。CのヘッダからRustの宣言を生成するbindgenというツールが公式で提供されており、メンテナンスも行き届いた使いやすいツールです。
静的解析の面では、もともと静的な型付けの言語であり、標準でlintツールのclippyが付属しているため、バグのないプログラムを書きやすい環境が整っています。例外安全については、Rustはエラー処理に例外を使わずResult型を用いる仕組みになっています。メモリ安全性はRustの代名詞とも言える特徴で、CやC++からの置き換えが進んでいる大きな理由の1つだと思います。
書きやすさの面では、パターンマッチや衛生的マクロなど、適度に制限された言語機能があります。C++のように何でもできてしまうのに対して、Rustではある程度制限されているため、コードが読みにくくなりにくいという特徴があります。ライブラリの導入はCargoという公式ツールで依存関係を管理でき、Node.jsにおけるnpmのような位置づけです。
言語の進化を享受しやすいエコシステム
ライブラリの豊富さではPythonも強力ですが、LOVOTの場合はOSに含まれるPythonを使う必要があります。OSを頻繁に更新できないため、Pythonのバージョンが古くなっていくという問題があります。一方、Rustはネイティブコンパイルされる言語なので実行環境を特に意識する必要がなく、6週間に1回のアップデートがあるため最新の機能もすぐに利用できます。
Rustのエコシステムは公式が手厚くサポートしている点も特徴的です。rustupによるバージョン管理、パッケージレジストリのcrates.io、ドキュメント生成ツール、フォーマッターのrustfmt、LSPサーバーのrust-analyzerなど、開発に必要なツールチェーンが公式から提供されています。これは他の言語にはあまり見られない特徴ではないでしょうか。
Rustから利用しているCライブラリ
現在Rustから利用しているライブラリを紹介します。まずDeepStream、そしてGStreamerです。DeepStreamはGStreamerのプラグインとして提供されており、GStreamerの公式でRustがサポートされています。GStreamerの標準機能が最近はRustで実装されるようになるほど、手厚いサポートがあります。
それ以外にも、CUDAやTensorRTといったNVIDIAのハードウェアを効率的に扱うためのライブラリ、先ほど説明したVPI、QRコードのスキャン用ライブラリなどを使っています。
DeepStreamの問題と独自実装への置き換え
DeepStreamを使ってはいるのですが、いくつか問題がありました。画像認識のパイプラインは、カメラ入力、2台のカメラの同期、推論処理、トラッキングという構成です。しかし、必要なメタデータが取得できなかったり、同期処理が非常に遅かったり、処理の柔軟性が不足していたり、バグを踏んだりと、さまざまな課題がありました。

そこで全体を改造するか、独自実装で置き換えていきました。DeepStreamはソースコードの大部分が公開されているため、動作を合わせやすいという利点があります。徐々に独自実装へ置き換えていった結果、DeepStream由来の機能はほとんど使っていない状態になりました。先ほどDeepStreamを使うと申し上げましたが、もはやDeepStreamの機能自体はほぼ使っていない、テセウスの船のような状態です。
機械学習モデルの話
物体検出モデル
物体検出モデルを使っています。画像全体の情報を一括で取得できるのが特徴です。一人ひとりを解析したい場合、1人ずつ全身や顔だけを抜き出して推論する手法もありますが、理想的には物体検出モデル単体で済ませたいと考えています。応用幅も広く、手を検出した際にそれが右手なのか左手なのか、ジェスチャーをしているのかといった情報も取得できます。
使用しているモデルはYOLOXです。これを最適化やカスタマイズして利用しています。DLA向けのINT8量子化については、ティアフォーさんが公開されている資料[1]を大いに参考にさせていただきました。この場を借りてお礼申し上げます。
DLAの2基活用による処理能力の確保
DLAは2基搭載されており、LOVOT 3.0のカメラも2台あります。カメラ1台ごとにDLAを1基ずつ割り当てることで、処理能力を2倍活用できるようにしています。この工夫により、組み込み向けの小さなモデルではなく精度の良いモデルを採用できています。精度向上のためのカスタマイズも各種行っています。
物体検出用データセット
学習用データとしては、人と触れ合うために最低限必要なものに加え、人と楽しく触れ合うために必要なものを含めています。具体的には、全身、頭、顔、手、ジェスチャー、人の様子などを検出しています。LOVOT同士が遊ぶケースもあるため、LOVOT自体の検出も行っています。
魚眼画像の検出については、歪み補正をせずにそのまま検出できるよう学習しています。現状は3万枚の画像で28万個の物体を学習しており、なかなか大変な作業でした。
開発中のモデル
製品ではまだ動いていないモデルもいくつか開発しています。姿勢推定のモデルでは、リアルタイムで実行できるよう物体検出モデルに入れ込む形で実装を進めています。最新のアップデートでLOVOTに動きを教えることができるようになりましたが、覚えられる動きはまだ限定的です。これをより多くの動きに対応させたいと考えています。発想次第では他にもさまざまなことができるようになるのではないでしょうか。
顔識別については、現在は外部の有償ライブラリを使っています。初代と2.0の頃から継続して使用しているものですが、処理が隠蔽されているため最適化がしづらいという問題があります。また、ベースとなるUbuntuを更新したくても、このライブラリが更新先のUbuntuに対応していないとOS自体を更新できないという制約もあります。こうした理由から内製化を進めています。そのほかにも、さまざまなモデルを続々と開発中です。
アノテーション
データセットをつくるためのアノテーション作業についてもお話しします。物体検出では、人の顔や体を四角で囲むようなラベル付けを行います。データ収集はオフィス内での撮影、各自の自宅での撮影、借りた家での撮影、屋外での撮影など、さまざまな環境で実施しています。アノテーション作業はエンジニアではないメンバーが担当しています。
現在は姿勢推定用の骨格アノテーションを進めています。明確な基準を設けており、この精度が低いとモデルの精度にも直結するためです。アノテーションの効率化のために、エンジニアではないメンバーが自主的にツールをつくってきたことがありました。3Dモデルを動かせるというツールで、AIを使ってつくったとのことでした。プログラミング経験のない人でもこうしたツールがつくられるという、新しい時代を感じる出来事でした。

技術選定の振り返り
最後に技術選定の観点で振り返ります。最初にDeepStreamを採用したのは正しい判断でした。その後、テセウスの船のように徐々に独自実装へ置き換えて最適化できたのは良かったと考えています。
顔識別についても同様です。有償ライブラリを比較対象として使いながら内製化を進められるため、作業が進めやすい状態にあります。
一方で、姿勢推定のアノテーションの負荷が高いという問題がありました。一般的な姿勢推定の特化モデルで先に試せるようにしておけば良かったのかもしれません。小さく始めて大きく育てるという進め方が、やはり大事だと改めて感じました。
アーカイブ動画・発表資料
イベント本編は、アーカイブ動画を公開しています。また、当日の発表資料も掲載しています。あわせてご覧ください。
▼動画・資料はこちら
※動画の視聴にはFindyへのログインが必要です。
-
「Edge AIのためのDNN推論処理の最適化」 https://www.docswell.com/s/TIER_IV/KGX2L8-2023-07-24-120048 ↩

