AIを使って人間の子どもを「飼い慣らす」: ハードコアな子育ての楽しさを発見した父親

AIを使って人間の子どもを「飼い慣らす」: ハードコアな子育ての楽しさを発見した父親

技術オタクの父親たちは、Netflix のエピソードを数本静かに観るために何をするのでしょうか?

[[375395]]

昔から「お父さん」+「かわいい赤ちゃん」は人気のない組み合わせで、「お父さんの愛は地滑りのようなもの」とさえ言われています。信じられないなら、ここに証拠があります:

誰もが知っているように、人間の赤ちゃんは一日中いつでも攻撃を仕掛けてくる永久機関のようです。ぐっすり眠るには日中にエネルギーを消費するしかないようで、人々はさまざまな方法を編み出してきました。

もちろん、すべての父親が信頼できないわけではありません。ごく普通に子どもを育てている父親もいます。アグスティヌス・ナルワンもその一人です。

Agustinus Nalwan は Medium のブロガーです。コンピューター ビジョン、3D/アニメーション、ゲーム開発などの分野で働いてきました。現在はオーストラリア最大の自動車取引プラットフォームである carsale.com.au で働いています。

彼にはデキシーという名前の2歳半の息子がいる。デクシーはとても活発で、動物、特にワシが大好きです。ワシの真似をして家中を飛び回ることもしばしばあります。

子どものこうした行動はたいてい親を笑わせる(中には短い動画にしてネットに投稿する人もいる)が、ナルワンさんは普通の親ではない。テクノロジーを使って子育てをもっと楽しくしようと努めている。ナルワンさんは昨年3月、息子とやりとりし、手に持っているおもちゃに基づいて関連する動画を再生できるおもちゃ認識機能を備えたシステムを開発した。

このプロジェクトのおかげで、彼は NVIDIA の「今月の Jetson プロジェクト: Qrio - インタラクティブ AI ボット」イベントで最優秀賞 (NVIDIA Jetson AGX Xavier) を獲得しました。

Jetson AGX Xavier の構成情報。

これはかなりの計算能力を備えた開発キットであり、JD.com、Meituan、Cainiao の無人配送車両のコンピューティング コアとして使用されています。 Jetson AGX Xavier の構成が優れていることから、Nalwan 氏はそれを活用して息子のために新しいおもちゃを作り、「高く飛ぶ」という息子の夢を実現することにしました。

新しいおもちゃはグリフィン(神話上のグリフィン)と呼ばれ、最終的な効果は次のとおりです。

もちろん、お父さんも一緒に参加できます。

または自分でプレイしてみましょう:

もちろん、子育てにおけるこのような良い経験は共有されるべきです。ナルワンさんは最近のブログ投稿で、グリフィンを作った全過程を詳しく紹介した。赤ちゃんがいる人は参考にしてほしい。

ライオンの体と鷲の頭を持つ伝説のグリフィン。 『ハリー・ポッターと死の秘宝』のグリフィンドール寮は黄金のグリフィンを意味します。

以下は、Nalwan がジェスチャー認識ゲーム全体を「ゼロから」構築するまでの過程です。

材料の準備

上の図に示す効果を実現するには、Griffin に次のモジュールが必要です。

  • 3D ゲーム エンジン: OpenGL で記述されたフライト シミュレーターを使用して、山、空、グリフィンのある 3D ファンタジー ワールドを生成します。
  • 人間の姿勢推定: OpenPose 姿勢推定モデルと SSD オブジェクト検出モデルを使用して、プレイヤーの体の姿勢をシステムへの入力として継続的に検出し、Griffin を制御します。
  • アクション マッピングとジェスチャ認識: 体の姿勢を、左/右の翼を上げる、体を左右に転がす、離陸するなどの意味のあるアクションとジェスチャに変換します。
  • 通信システム: ソケットを使用してジェスチャ入力を 3D ゲーム エンジンに送信します。

システム全体に必要なハードウェアは次のとおりです。

  • NVIDIA Jetson AGX Xavier: これは、上記のすべてのモジュールを実行する小型の GPU 搭載組み込みデバイスです。シンプルな HDMI インターフェースを介してオーディオとビデオの出力をサポートできます。さらに、簡単にネットワーク接続できるイーサネット ポートも備えています。このデバイスには完全に機能する Ubuntu 18.04 OS が搭載されているため、マウスとキーボードを接続して開発やデバッグを行うこともできます。
  • テレビ(HDMI 入力と内蔵スピーカー付き):ゲーム エンジンのディスプレイとして機能します。
  • カメラ: Sony IMX327 を使用しています。実際、ここで必要なのは 224 x 224 の画像解像度だけなので、よりローエンドのカメラを選択することもできます。
  • Blu-Tack: すべてのハードウェアを結びます。

Jetson AGX Xavier、IMX327 カメラ、Blu Tack。

成し遂げる

3D ゲーム エンジンの構築

飛行体験をより良くシミュレートするために、Griffin システムは 3D の世界を三人称視点でレンダリングします。グリフィンの真後ろにカメラがあって、彼が見ている方向を監視できると想像してください。フライトシミュレーターのような一人称視点を使用してみませんか?ワシの翼と腕の動きが同期しているのを見ると、デクシーはゲームのコントロール方法をすぐに学び、より没入感のある体験をすることができます。

3D ゲーム エンジンを自分で構築するのは簡単な作業ではなく、数週間かかることもあります。今日の開発者のほとんどは、Unity や Unreal などの特殊なゲーム エンジンのみを使用しています。しかし残念ながら、Ubuntu OS/ARM チップセットで実行できるゲーム エンジンは見つかりませんでした。別の方法としては、OpenGL で動作するオープンソースのフライトシミュレーターを探すことです。これにより、OpenGL ES (OpenGL の軽量バージョン) をサポートし、ハードウェア アクセラレーションが行われるため、ゲーム エンジンを AGX 上で実行できるようになります。ゲーム エンジンを遅い速度で実行したくない場合は、これが必要です。

幸運なことに、私は基準を満たす C++ のオープン ソース フライト シミュレーターを見つけたので、次の変更を加えました。

  • ボタンベースの飛行制御システムをターゲットベースのシステムに置き換えました。これにより、Griffin の体の目標回転を随時設定することができ、これは Dexie の腕の向きをマッピングするジェスチャー認識モジュール自体によって設定されます。
  • 階層構造をサポートするために静的 3D モデル管理を強化しました。元の飛行機モデルは剛体として動きます。可動部分はありません。しかし、グリフィンには体とは独立して動かす必要のある2つの翼があります。これを実現するために、ボディの上に 2 つの翼を別々の 3D モデルとして追加しました。それぞれの翼を個別に回転させることも、グリフィンの体を動かして間接的に両方の翼を動かすこともできます。この目標を達成する適切な方法は、体の部位をツリー構造に整理するスケルトン アニメーション システムを構築することです。ただし、扱う必要がある体の部分は 3 つ (体と 2 つの翼) だけなので、簡単な方法を選択できます。ワシと木の 3D モデルを編集するために、無料で使いやすい 3D 編集ツールである Blender を使用しました。

Blender でワシの 3D モデルを編集します。

  • Griffin の離陸状態用のツリー モデルと、アプリを再起動せずにゲームを再開できるゲーム状態を追加しました。グリフィンには、立っている状態(枝の上)と飛んでいる状態の 2 つの状態があります。
  • libSFML を使用してサウンド効果を追加しました。グリフィンが飛び立つと、ワシの叫び声と風の音が聞こえます。

人間の姿勢推定モジュールの構築

このモジュールは、カメラ入力から人間の姿勢を検出するように設計されています。具体的には、グリフィンの翼と体を制御し、特定のポーズをトリガーするために、左/右の肘、左/右の肩、首、鼻の位置を知る必要があります。 OpenPose は、人間のポーズ、手の姿勢、顔の特徴を推定するための AI モデルを多数備えた人気のオープンソース ライブラリです。私は、バックボーン特徴抽出器として resnet18 を使用した Human Pose Estimation COCO モデルを使用しています。このモデルは、上で述べた必要な 6 つのポイントを含む 18 個の関節ポイントをリアルタイムで検出できます。

COCO アーティキュレーション マップ。

ここで大きな問題があります。OpenPose は PyTorch フレームワーク上に構築されており、高度に最適化された TensorRT フレームワークを活用できないため、NVIDIA AGX Xavier 上では非常に低速 (4FPS) で実行されます。幸いなことに、PyTorch モデルを TensorRT フレームワークに自動的に移植できる優れたツール torch2trt もあります。具体的な手順は、OpenPose をインストールし、PyTorch を TensorRT に変換し、事前トレーニング済みの resnet18 バックボーン モデルをダウンロードすることです。

カメラからビデオ コンテンツを取得するには、別のライブラリ Jetcam を使用します。実行にはたった 4 行のコードしか必要ありません。

人間の姿勢の推定。

これにより、100FPS で実行できる人間の姿勢推定モジュールが実現します。

いくつかのテストを行った後、モデルがランダムなオブジェクトをジョイントとして誤認することがあり (下の画像に示すように、誤検知)、Griffin のモーション コントロールに問題が発生する可能性があることがわかりました。

Amazon SageMaker JumpStart を使用してオブジェクト検出モデルを構築する

この問題を解決する 1 つの方法は、補助 AI モデルを追加し、オブジェクト検出モジュールを使用して人間の境界ボックスを提供することで、境界ボックスの外側で検出された人間の関節を除外できるようにすることです。さらに、これらの境界ボックスは、群衆の中のメインプレイヤーを識別するのに役立ちます。カメラに最も近い人がメインプレイヤーになるはずです。

以前のプロジェクトでは、SSDMobileNetV2 オブジェクト検出モデルを手動でトレーニングしました。今回は、TensorFlowHub と PyTorchHub から AI モデルをワンクリックでデプロイできる Amazon SageMaker JumpStart を使用することにしました。完全に事前トレーニング済みの SSDMobileNetV2 を含む 150 を超えるモデルから選択できます。

Amazon SageMaker Studio から JumpStart を起動します。

Amazon JumpStart で SSDMobileNetV2 を選択すると、ワンクリックでモデルをデプロイできます。オブジェクト検出モデルができたので、境界ボックスの外側にあるジョイント ポイントの除外ロジックを追加して、誤検出を大幅に削減できます。

人体の境界ボックスの外側にある関節点は除外されます。

モーションマッピングとジェスチャー認識モジュールの構築

このモジュールは、人間の姿勢推定モジュールによって検出された 6 つの関節動作をより意味のある入力に変換するために不可欠です。これには、次の 3 つの直接アクション マッピングが含まれます。

  • 飛行中の体の回転: 飛行中のグリフィンの方向を制御するために使用されます。体の回転は、水平軸と左右の肘のベクトルの間の角度によって計算できます (下の図の上部)。飛行中、2 つの翼はこの回転角度に基づいて同期して動きます。手首はカメラの視界から外れたり、体の他の部分に隠れたりすることが多いため、視認性を最大限に高めるために手首ではなく肘が選択されました。
  • 立っているときの翼の回転: これは純粋に美的なものであり、ゲームをより面白くし、立っているときに各翼を個別に制御できるという印象を与えます。これは、水平軸と肩肘ベクトル間の角度として計算されます (下の画像)。最終的に翼の回転角度は15度増加し、翼の動きが大きくなります。やはり、長時間腕を上げ続けるのは人にとって疲れるでしょう。

体の回転と翼の回転のモーション マッピング。

  • しゃがむ: これは、飛び立つ前にグリフィンのしゃがんだ姿勢を制御できるという感覚を与える、もう 1 つの美しい動きです。これは、首と鼻のベクトルと肩のベクトルの間の長さの比率として計算されます。深くかがむと、首と鼻の間の距離が短くなりますが、左肩と右肩の間の距離は同じままなので、長さの比率は小さくなります。

しゃがみモーションマッピング。

  • 離陸姿勢:左右の肩の中心点が1秒以内に閾値以上上下に動くと、その動作は離陸姿勢として認識されます。閾値は肩の間の長さです。この動きが発動すると、グリフィンは枝から飛び降りて飛び始めます。
  • ゲームリセット姿勢:左右の肩の水平位置が逆になっているときは、プレイヤーがカメラに背を向けているようなゲームリセット姿勢です。ゲームはリセットされ、グリフィンは木の上に立ち、次の飛行の準備が整います。

離陸とリセットのジェスチャー認識。

通信システム

これで 3 つの主要コンポーネントが完成したので、あとはそれらを接着するだけです。姿勢推定モジュールによって検出された人間の関節点をジェスチャ認識モジュールに送信する必要があります。このタスクは比較的簡単です。ただし、ゲーム エンジンは C++ で記述されているため、モーションとポーズのマッピング結果を 3D ゲーム エンジンに送信するのはそれほど簡単ではありません。 3D ゲーム エンジンの構築に Python を使用しないのはなぜかと疑問に思うかもしれません。その理由は、Python を使用して OpenGL にアクセスする信頼できる方法がないからです。さらに、たとえ可能だとしても、C++ を Python コードに変換するのに何週間も費やしたくありませんでした。

この時点で、最小限のオーバーヘッドで 2 つの間で情報を効率的に転送する必要があります。オーバーヘッドの最小化はゲーム エンジンにとって非常に重要な要素であり、コントローラーの入力とアクションの実行の間に 100 ミリ秒の遅延があると、プレイヤーの没入感が失われる可能性があります。したがって、2 つの別々のアプリケーション間の最適な通信媒体はソケットです。両方のアプリケーションが同じコンピューター上にあるため、遅延は 5 ミリ秒以内になります。

C++ では、単に sys/socket ライブラリを使用しますが、Python ではソケット フレームワークを使用できます。これからは、ジェスチャ認識およびポーズ推定モジュールを Python アプリと呼びます。このクライアントは、roll_target、lwing_target、rwing_target、body_height、game_state の 5 種類の情報を送信します。 3D ゲーム エンジンは C++ アプリと呼ばれ、上記の情報をリッスンして継続的に受信するサーバーとして機能します。

これら 5 つの情報/変数を Python から C++ に正しくマッピングするには、送信する前に Python C のような構造に配置する必要があります。

  1. クラスペイロード(構造):
  2. _fields_ = [("roll_target", c_int32),
  3. ("lwing_target", c_int32),
  4. ( "rwing_target" 、 c_int32)、
  5. ( "body_height" 、 c_int32)、
  6. ( "ゲーム状態" , c_int32)]

C++ アプリでは、ネイティブ C 構造体として受信されます。

  1. typedef 構造体 payload_t
  2. {
  3. ロールターゲット。
  4. int32_t lwing_target;
  5. int32_t rwing_target;
  6. int32_t ボディ高さ;
  7. int32_t ゲーム状態;
  8. } ペイロード;

以下のアーキテクチャ図からわかるように、通信層は Python アプリにあるクライアント モジュールと C++ アプリにあるサーバー モジュールで構成されています。

Griffin の全体的なアーキテクチャ図。

校正とテスト

すべての準備が整ったら、Griffin システムをセットアップして調整とテストを実行しました。このシステムのパフォーマンスは予想以上に優れており、リアルタイム 3D レンダリングと姿勢推定をすべて実行しても 60FPS のフレーム レートを維持しています。NVIDIA の Jetson AGX Xavier の威力はすごいようです。以下のビデオでは、キャリブレーションとテストのプロセスが実際に行われている様子を見ることができます。このビデオのフレーム レートが低いのは、Griffin への影響を最小限に抑えるために、Ubuntu デスクトップで 15FPS で画面を録画したためです。

Griffin システムの調整とテスト。

脱ぐ

ついに、デクシーがグリフィンと一緒に初めての飛行に挑戦する時が来ました。これが本当のテストでした。私はリビングルームにシステムを設置し、息子は待ちきれずにその動作を待っていました。

デキシーがグリフィンと一緒に飛行した体験。

Griffin システムの操作方法を一度だけ実演しました。ジャンプして離陸し、腕を広げてジェスチャーで翼を操作するだけで、Dexie はそれを習得しました。ゲームは三人称視点でプレイされるため、画面上の翼の動きが自分の姿勢と直接同期していることにすぐに気付きました。それから彼は飛行体験を楽しむようになりました。自分のゲーム コントローラーより優れたものはありません。初代 iPhone を発表したときにスタイラスを嘲笑したスティーブ ジョブズの言葉を思い出してください。

興味深いことに、デクシーが山にぶつかりそうになったとき、彼は腕を上げて急旋回しようとしましたが、最大回転角度制限を設定したため、グリフィンは彼がそのような極端な角度で飛ぶことを許可せず、その後山にぶつかりました...これはその様子です:

デキシーのグリフィンでの初飛行。

彼は疲れが襲ってくるまで、腕を激しく振りながら30分間演奏し続けた。何よりも、彼はその夜ぐっすり眠ったので、私たちにとっては幸運でした。 Netflix を見る時間が増えました :)

要約する

このようなシステムを構築することは私に多くのことを教え、とても楽しかったです。全体的に学んだこと:

  • Torch2trt は、PyTorch モデルを TensorRT バージョンに自動的に変換し、Jetson AGX Xavier 上で AI モデルをより高速に実行できるようにする強力なツールです。最先端の AI モデルの多くは PyTorch で構築されていますが、それらを手動で TensorFlow に移植するのは良い経験ではありません。
  • NVIDIA Jetson AGX Xavier のパフォーマンスは非常に強力です! 30 個の 1080p ビデオ ストリームのコンピューター ビジョン モデル処理タスクをリアルタイムで処理できると多くの人が言っていますが、それは本当のようです。
  • Amazon SageMaker JumpStart は、多数の人気の AI モデルを提供し、それらを簡単にデプロイできるようにします。
  • 3D ゲーム エンジンを構築した経験により、ゲームおよび映画の SFX 開発者としての以前の経験を再確認し、錆びついた OpenGL、C++、三角法のスキルを再活用することができました。
  • モーション認識ゲームといえば、当然 Xbox を思い浮かべるでしょう。Unity エンジンと Kinect センサーを使用して Xbox 上で Griffin を構築することもできましたが、それは無意味ではないでしょうか。システムをゼロから構築するのは楽しいこともあります。
  • イーグルをプレイするのは、特に腕を長時間上げ続けるのは非常に疲れる仕事です。しかし、本物のワシは上昇気流を利用して空を滑空します。

この経験があなたに何かインスピレーションを与えるでしょうか?

最後に、作者は近い将来にプロジェクト コードをオープン ソース化することを計画しています。

<<:  海運業界は人工知能を活用して海賊行為と戦うことができる

>>:  このAIはマスクをハゲにし、テスラの設計を手伝った

推薦する

Google が TensorFlow Lite を Play サービスに導入

近年、大手テクノロジー企業は人工知能と機械学習の研究に力を入れています。その中でも、Googleはこ...

李開復氏はAIバブルが年末までに崩壊すると予測、ルクン氏:それは本当だ

[[218838]] Innovation Works の創設者である Kai-Fu Lee 氏は、...

顔認識システムのセキュリティに関する簡単な分析: どの業界が攻撃に対して脆弱ですか?

顔認識システムは、今日では物議を醸す技術だと考えられています。 IBM、Google、Microso...

...

AIの限界を理解することがその可能性を実現する鍵となる

人工知能は多くの業界のワークフローを変革しました。デジタル顧客サービスアシスタント、自動運転車、無人...

火山エンジンは大型モデル用の大きなベースを作ります! MiniMax、Zhipu AIなどが上陸

Volcano Engine は、大規模モデルのトレンドに関する解答用紙を提出しました。大型モデルサ...

生成型 AI は急速な発展期を迎えています。その応用はどのように実装されるのでしょうか?

先月、国際的に有名な学術誌「ネイチャー」が2023年のトップ10を発表しました。世界的な科学イベント...

...

チームメイトが機械の場合: CISO が AI について尋ねるべき 8 つの質問

AI は、私たちが行うほぼすべての方法を変えています。私たちが行くところすべてで、かつては人間が行っ...

...

Python 密度クラスタリング アルゴリズム - DBSCAN の実践

この記事の主な内容:序文DBSCAN クラスタリング アルゴリズムパラメータ選択DBSCANアルゴリ...

...

週刊「ニュース速報」 | AIエリートは数百万ドルを稼ぐ? !李開復氏がAI業界のチャンスを明かす!

AIエリートが100万以上稼ぐ!マスク氏が設立したOpenAIが誤って給与情報を公開4月23日のニ...

AI分析で遠隔ビデオ監視をより利用しやすくする方法

[[400505]] AI(人工知能)がさらに発展するにつれて、新たな用途やメリットが生まれる可能性...

クラウドプラットフォームにおける人工知能の応用は2020年に爆発的な成長を示すだろう

アクセンチュアのアナリストは、2020 年に企業がより多くのイノベーションを獲得するのはクラウド プ...