ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Visionの3Dボディーポーズと人物セグメンテーションの詳細
Visionで人物を中心とした機能を構築する方法をご確認ください。人体のポーズを検出し、3D空間で個々の関節の位置を測定する方法を紹介します。また、人物のセグメンテーションAPIを活用して、画像内の最大4人の人物を区別してセグメンテーションする方法も紹介します。 Visionの最新機能については、WWDC23の「Visionで動物のポーズを検出」をご確認ください。
リソース
関連ビデオ
WWDC23
WWDC22
WWDC20
-
ダウンロード
♪ ♪
Vision Frameworkのソフトウェアエンジニア Andrew Rauhです 今日お話しするのは Human Body Poseや Vision frameworkの Depthの使用 インスタンスマスクで 画像から人物を検出する方法です
人の検出と理解は常にVision の焦点でありVisionフレームワークは 数年前から2Dでの 人体ポーズを提供してきました 復習として2Dの人体ポーズは ランドマークポイントの正規化された ピクセル座標を含む観測値を返します これは入力画像に対応する スケルトン上に定義されます さらに詳しく知りたい場合は "Visionで体や手のポーズを検出する" セッションをご確認ください Visionは新しいリクエストである VNDetectHumanBodyPose3DRequestで 環境内の人々を3Dにキャプチャ するためのサポートを拡張しています このリクエストは17個のジョイントを持つ 3Dスケルトンを返す結果を生成します ジョイントには ジョイント名でアクセスも コレクションとして ジョイントグループ名でアクセスもできます 左下の原点に正規化された Visionによって返される 他の認識されたポイントとは異なり 3Dジョイントの位置は ルートジョイントを原点にして 現実にキャプチャされたシーンを基準に メートル単位で返します この最初のリビジョンでは フレーム内で検出された 最も主要な人物の 1つのスケルトンが返されます フィットネスアプリを構築していて ジムでのワークアウトクラスの この画像に対して リクエストを実行したとします この結果はカメラに最も近い女性を 対象にしています コンテキストを含めて3Dスケルトン構造 をよりわかりやすく示すために このヨガのポーズを分解してみましょう 当然ながら 3D Human Bodyスケルトンは 頭の中心と頭頂部にあるポイント を含む頭グループから始まります 次に胴体グループがあり 左右の肩関節や脊椎と ルートジョイント すなわち 股関節および 股関節の中心があります 一部のジョイントは複数のグループで 返されることに注意してください 腕には左右の腕グループがあり それぞれ手首 肩 肘があります 左右は常に人体を基準としており 画像の左側または右側ではありません 最後にスケルトンは 左右の脚グループを含んでおり それぞれに対応する股関節 膝関節 足首関節があります この新しいリクエストで使用するのは 他のリクエストと同じワークフローです 以前コードでVisionを使用していたら このフローに精通しているはずです DetectHumanBodyPose3DRequest のインスタンスを作成し 次に検出を実行したいアセットで 画像リクエストハンドラ を初期化します リクエストを実行するにはリクエスト インスタンスをperformに渡します リクエストが成功するとエラーなしで VNHumanBodyPose3DObservation が返されます すべての写真は3D世界の人物を 2Dで表現したものです VisionではARKit やARSessionを使用せずに 画像から3D位置を取得 できるようになりました 3D空間で主題を理解するための 強力で軽量なオプションであり アプリのまったく新しい 機能範囲を解放します これを理解して視覚化するのに役立つ サンプルアプリを作成しました これを開くと写真ライブラリから 任意の画像を選択できます
同僚と私は 先ほどのヨガインストラクターの 穏やかさに刺激を受けて 休憩を取りました 外に出て自分たちで いくつかのポーズを試してみました さて私は先生ほど柔軟ではありませんが このポーズではかなりうまくいきました 3Dで見栄えが良くなるはずです
リクエストを実行して 私を3Dに戻しましょう
リクエストは成功し 画像内で私がいる場所を示す 3Dスケルトンの位置が 調整されました シーンを回転させると 腕が伸びました 私の立ち方から判断して 脚は腰に対して正しく見えます このピラミッドは 画像をキャプチャしたとき カメラが位置していた場所を表しています 「視点切り替え」ボタンをタップすると ビューはカメラ位置からになります 3D Human Body Poseで 素晴らしい体験を作成するのに 知っておく必要がある コードと概念について説明します
アプリの構築は観察で返された ポイントを使用することから始まります それらを取得するための 2つの主要なAPIがあり 特定の関節位置にアクセスするための recognizedPointまたは recognizedPointsで指定したグループ名の ジョイントのコレクションにアクセスします これらの中心的な方法に加えて 観察によって追加の 役立つ情報がいくつか提供されます まずbodyHeightは被写体の 推定身長をメートル単位で示します 利用可能なDepthメタデータに応じて より正確に測定された高さか 1.8メートルの基準高さになります DepthとVisionについては すぐにお話ししたいことがたくさんあります heightEstimation プロパティを使用して 高さの計算に使用される 手法を決定できます カメラの位置はcameraOriginMatrix を通じて取得できます 実際にはカメラが被写体の方向を 正確に向いていない可能性があり フレームがキャプチャされたときの カメラの人物に対する相対的な値 を理解するのに役立ちます この観測ではジョイント座標を2Dに 投影するためのAPIも提供します これは返されたポイントを 入力イメージにオーバーレイしたり 位置合わせする場合に役立ちます 最後に人が2つの類似した画像で どう変化したか確認し 位置を取得するAPIが ジョイントの相対的な位置を カメラに送ることができます
3D Human Bodyポイント の使い方を説明する前に 継承元のVisionの新しいジオメトリ クラスを紹介したいと思います VNPoint3Dは3D位置を格納するための simd_float 4x4行列を定義する 基本クラスです この表現はARKitなど 他のAppleフレームワークと一致し 利用可能なすべての回転 および変換情報が含まれます 次にVNRecognizedPoint3D があります これはこの位置を継承しますが 識別子も追加します これはジョイント名などの対応情報を 格納するために使用されます 最後に今日の焦点は VNHumanBodyRecognizedPoint3Dで これによりローカル位置と 親ジョイントが追加されます ポイントのプロパティの操作方法を さらに詳しく見てみましょう 認識されたポイントAPIを使用して 左手首の位置を確認しました ジョイントのモデル位置 またはポイントの位置プロパティは 常に股関節の中心にあるスケルトンの ルートジョイントを基準とします 位置行列の3列目に注目すると 変換の値が表示されます 左手首のyの値は このフィギュアの腰から0.9m上にあり このポーズには適切と思われます 次に返されたポイントの localPositionプロパティがあり これは親ジョイントに対する 相対的な位置になります したがってこの場合 左肘が左手首の親ジョイントになります ここの最後の列は x軸の値が -0.1mであることを示し それも正しく見えます 負の値または正の値は 基準点によって決まります このポーズでは手首は肘の左側にあります localPositionはアプリが体の1つの領域 のみを操作する場合に便利です また 子ジョイントと親ジョイント間の 角度の決定も簡単になります この角度をコードで計算する方法 を後ほど説明します 返された3Dポイントを操作する場合 アプリを構築するときに役立つ 概念がいくつかあります まずは子ジョイントと親ジョイント間の 角度を決定する必要があります CalculateLocalAngleToParent メソッドでは 親ジョイントに対する相対位置 を使用して角度を見つけます ノードの回転はx/y/z軸 またはピッチ/ヨー/ロール軸 で回転を構成します ピッチの場合 90度の回転を使用して SceneKitノードジオメトリを デフォルトの向きから 真下に向けて配置し 私たちの骨格に適したものに変えます ヨーの場合 Z座標の逆余弦を ベクトルの長さで割り 適切な角度を取得します ロールの場合 角度測定は y座標とx座標の 逆正接を使用して取得します 次に私のサンプルアプリのように アプリは返された3D位置を 元の画像と関連付ける 必要がある場合があります 私のビジュアライゼーションでは 画像平面への2つの変換 つまりスケールと変換のための point-in-image APIを使用します まず 返されたポイントに比例して 画像平面をスケーリングします 3Dと2Dの両方について 肩の中心と脊椎のような 2つの関節間の距離を取得し それらを比例的に関連付けて 画像平面を その量だけスケールします 変換コンポーネントでは pointInImage APIを使用して 2D画像内のルートジョイント の位置を取得します このメソッドはその位置を使用して x軸とy軸の画像平面 のシフトを決定し 同時にVNPoint座標の左下の原点と 画像の中心にあるレンダリング環境の原点 の間の変換も行います 最後に カメラの視点で シーンを表示したり その位置に点をレンダリングします これはcameraOriginMatrix から取得できます 正しい向きはレンダリング環境 によって異なりますが これが ピボット変換を使用した変換情報で ノードを配置した方法です これでこのノードのローカル座標が シーンの残りの部分に関連付けられます またcameraOriginMatrix の回転情報を使用し 逆変換を使って このコードで画像平面を カメラの方向に正しく回転させました
ここでは回転情報のみが必要なので 最後の列の平行移動情報は無視されます これらすべての部分を組み合わせると サンプルアプリのシーンが可能になります ここでVisionの深度に関する いくつかのエキサイティングな追加について 少しご説明します Visionフレームワークは 画像またはフレームバッファの他に 入力としてDepthを 受け入れるようになりました VNImageRequestHandlerには AVDepthDataの新しいパラメータを取る cvPixelBufferおよびcmSampleBuffer の初期化APIが追加されました ファイルにDepthデータが すでに含まれる場合は 既存のAPIを変更せずに使用できます Visionは自動的に ファイルからDepthを取得します Apple SDKで Depthを使用する場合 AVDepthDataはすべてのDepthメタデータと インターフェイスするコンテナクラスです カメラセンサによってキャプチャされた Depthメタデータには 視差またはDepth形式で表される Depthマップが含まれています これらの形式は互換性があり AVFoundationを使用して 相互に変換できます Depthメタデータには 3Dシーンを再構築するために必要な 内部/外部/歪みパラメータなどの カメラキャリブレーションデータ も含まれています さらに詳しく知りたい場合は 2022年のセッション 「iOSカメラキャプチャの進歩を知る」を ご確認ください Depthはカメラキャプチャセッション または以前にキャプチャされたファイル から取得できます 写真のポートレート画像と同様に カメラアプリでキャプチャされた画像は常に カメラキャリブレーションメタデータと Depthを視差マップとして保存します ライブキャプチャセッションで Depthをキャプチャする場合 デバイスがサポートしていれば LiDARを使用するセッションを 指定できるという追加の利点があります LiDARは強力なので シーンの正確なスケールと 測定を可能にします Visionは画像内の 複数の人物とインタラクションするための APIも導入しています
Visionは現在 GeneratePersonSegmentation リクエストを使用し周囲のシーンから 人々を分離する機能を提供しています このリクエストはフレーム内の すべての人物を含む1つのマスクを返します Visionでは新しい人物インスタンスの マスクリクエストをもう少し 選択できるようになりました この新しいAPIは それぞれに信頼度スコアが付いた 最大4つの個別の人物マスクを出力します これで画像から個別に友達を 選択しリフトできるようになりました 人物以外の被写体を選択して リフトする必要がある場合は VisionKitの被写体リフティングAPI やVisionフレームワークの フォアグラウンドインスタンス マスクリクエストを使用します 詳細については 「アプリ内の画像からの被写体の切り抜き」 セッションをご確認ください 次のサンプルコードは 画像から必要な人物の 特定のインスタンスを 選択する方法を示します 現在すべてのインスタンスを 返すように指定していますが インスタンス1または2 を選択することもできます 画像内でどの友人に 焦点を当てたいかに応じて インスタンス0を使用して背景を取得します この新しいリクエストは 最大4人までセグメント化するため 画像に4人以上の人物が含まれる場合は コード内で処理する 追加の条件がいくつかあります シーンに多くの人物が含まれている場合 人物が欠落したり 結合したりする可能性があります 通常これは 背景に人がいる場合に発生します 混雑したシーンに 対処する必要がある場合 可能な限り最高のエクスペリエンスを 構築するための戦略があります Visionの顔検出APIを使用して 画像内の顔の数をカウントし 4人以上の画像をスキップするか 既存の人物セグメンテーションリクエスト を使用するか選択できます 全員に1つずつマスクを当てて作業します
要約するとVisionは Depthのサポートで 人々とその環境を理解するための 強力な新しい方法 3D Human Body Poseと 人物インスタンスのマスクを提供します しかしVisionが今年リリースするのは それだけではありません 「Visionで動物のポーズを検出」 セッションの毛むくじゃらの友達の画像で 人間を超えた素晴らしい体験を生み出します ご視聴ありがとうございました みなさんが構築する今後の機能が楽しみです ♪ ♪
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。