ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Create MLを使用したアクションクラシファイアの構築
Create MLでAction Classificationモデルを作成する方法を説明します。カスタムアクションクラシファイアを使用すると、Appはビデオまたはカメラを介してリアルタイムで身体の動きを認識し、理解することができます。ジャンピングジャック、スクワット、ダンスの動きなどの人間の動作を識別するために、サンプルを使用してCore MLモデルを容易にトレーニングする方法についてご説明します。これを支えるVision FrameworkのBody Pose推定機能の働きについてもご説明します。フィットネスのルーチンをコーチングしたり、スポーツのフォームに関してフィードバックを提供したりすること等が可能なAppを作ることもできます。このセッションの前に、Create MLに親しんでおくことをお勧めします。概要については、"Introducing the Create ML app"を参照してください。また、Action ClassificationとセンサーベースActivity Classificationの違いについて詳しくは、"Building Activity Classification Models in Create ML"も参照してください。Action Classification機能を可能にする優れたテクノロジーについて詳しく知るには、"Detect Body and Hand Pose with Vision"をチェックしてください。また、この分類機能を他のテクノロジーと組み合わせて、独自のサンプルAppを作成する方法については、"Explore the Action & Vision App"を参照してください。
リソース
関連ビデオ
WWDC22
WWDC21
WWDC20
WWDC19
-
ダウンロード
こんにちは WWDCにようこそ “Create MLを使用した アクション分類子の作成” Create MLチームのエンジニア ユシンです 今日は同僚のアレックスと 新しいテンプレートをご紹介します それはCreate MLのアクション分類です 昨年はアクティビティ分類を導入し モーションデータを使った分類器が 作成できるようになりました ただ 動画のアクションを分類したい場合は どうすればよいでしょう 今日 カメラは広く普及し スマートフォンで 簡単に動画を撮れるようになりました ジムでも自宅でも セルフガイドの エクササイズで気軽に気分転換できます
他にも 例えば体操を見ると 人間の体がいかに複雑に動くかが分かります これらの動作を自動的に認識できれば 選手の練習や競技に役立つでしょう
今年は人体のポーズを学習する アクション分類を開発しました このかっこいいダンスの振りを見てください この動きを認識し さらにそれを基に 娯楽用のAppが作れたらきっと面白いでしょう では アクション分類とは何でしょうか 第一に これは標準的な分類タスクであり 定義済みのクラスのリストから アクションのラベルを割り当てるのが目的です
今年のモデルはVisionの 人体ポーズ推定機能を搭載しています そのため 人体のアクションには最適ですが 動物や物体の動きには向いていません
一定時間のアクションを認識するには 1枚の画像では不十分です 代わりに 一連のフレームで構成された時間枠で 予測が行われます
カメラや動画ストリーミングに対して ウィンドウごとに継続して予測を行います
Visionのポーズに関する詳細は “Body and Hand Pose Estimation”を ご覧ください では Create MLでその仕組みを見てみましょう
仮に ある人物のエクササイズの動きを認識する フィットネス分類器を作るとします 挙手ジャンプ 屈伸 スクワットなどです まず 各クラスの動画クリップを用意し― Create MLを立ち上げて訓練します 最後にフィットネス分類器モデルを保存し フィットネスエクササイズAppを作ります
段階ごとに説明しましょう まずは同僚のアレックスがデータと アクション分類の訓練について話します
ありがとう ユシン 今はジムに行けませんが 自分のエクササイズ状況を見てくれるAppが あれば 健康が維持できそうです 私はCreate MLチームのエンジニア アレックスです 今日は アクション動画をキャプチャし Create ML Appで新たなアクション分類器 モデルを訓練する方法を紹介します まずは動画のアクションをキャプチャしましょう 人がいつ どんな運動をしているかを 認識できるモデルにするため あらゆるエクササイズの動画を集めます 挙手ジャンプ スクワットなど5種類です 各動画につきアクション1種 1人の人物だけを収めます 撮影後 動画の冒頭や末尾に 余分な動きが入っていたら フォトAppでトリミングしましょう
全身を使ってアクションを特定するので 必ずカメラに腕と脚の動き全体が 収まるようにします 少し離れて撮るといいですね
では 各アクションを 格納するフォルダを作ります アクションをモデルが予測できるような フォルダ名にしましょう
休憩 ストレッチ 座るといった動作の サンプルが集まったら “その他”のフォルダにまとめましょう
以上で訓練の準備は完了ですが ここで少し 別の種類のデータが あった場合も考えます 他人が撮った動画や インターネットから ダウンロードした動画であれば― 合成をしましょう 合成をすれば 複数のアクションを 1本の動画に収められます タイトルや状況設定 休憩を映しただけのショットも入れられます
この動画を通して見ると アクションのない部分と 訓練用のアクションが混在しています 選択肢は2つです 動画編集ソフトで動画をトリミング または分割して必要なアクションのみに絞り 先ほどのようなフォルダに分類する方法か アクションの始まる時点で停止し CSVやJSONフォーマットの注釈ファイルに 記録する方法です これはその一例です
詳しくは developer.apple.comの Create MLドキュメントをご覧ください
合成については以上です 既に用意したエクササイズ動画の 説明を続けます
Mac上で Create ML Appを 立ち上げます
Mac OS Big Surであれば 新テンプレート アクション分類が入っています
エクササイズモデル用に アクション分類のプロジェクトを作成しましょう
適切な名前を付けます
後で分かりやすいよう 説明も加えましょう
新規アクション分類プロジェクトは モデルソース設定ページで開きます ここで訓練の準備をします キャプチャしたデータを追加し 訓練のプロセスについての設定をするのです 作成した動画フォルダを 訓練データソースにドラッグします 今からやってみます
すべての動画を“訓練”フォルダに集めました 中には 訓練したいアクションの名前の サブフォルダが入っています
“ジャンプ”のフォルダの中には 挙手ジャンプの動画がそろっています
“訓練”フォルダも訓練データにドラッグします
Create ML Appはデータを正しいフォーマットで 確認し 結果を表示します “7つのクラスを記録した”と出ています 5つのエクササイズに加え 陰性クラス“その他”と“なし”です
また 362本の動画が 記録されていることも分かります データソースビューで詳細を見てみましょう
このとおり アクションごとに 約50本の動画があります
プロジェクトを構築する時は これくらいの本数を目指してください
データ入力の下で パラメータを設定できます ここでは“アクション継続期間”と “拡張”について説明します “アクション継続期間”は 認識したいアクションの長さです ダンスの振りのような複雑なアクションの場合 動作全体をキャプチャするのに 十分な長さが必要です 今回は10秒程度でしょうか
ただし 今回のように 短いアクションを繰り返す場合は ウィンドウを約2秒に設定します
アクションの長さは予測ウィンドウとも呼ばれ フレーム単位で区切られます Create MLは フレームレートとアクションの長さを基に フレーム数が60であると自動的に算出します
“拡張”は訓練データを膨らませます 追加で撮影に行かなくても 既存の動画を現実世界のシナリオに従って 変形してくれるのです 左を向いた人の動画しかなくても “水平反転”で左右逆の動画を生成し モデルが両方向で機能するようにできます 有効にしてみましょう
他にもデータが追加できるボックスが 2つありますね これは“検証”と“テスト”です モデルのテスト用に別のデータがあれば ここでテストデータに追加できます Create MLは モデルの訓練が終了すると 自動的にテストを実行します
機械学習のベテランは独自の検証データを 使っているかもしれませんが Create MLは あなたの訓練データを テストに使うよう初期設定されています
“訓練”ボタンをクリックし モデルの作成を始めます
Macが動画を使ってアクション分類器を 訓練するには 2つの手順があります まず 特徴抽出を行います 動画を基に人間のポーズを計算するのです 完了すると モデルを訓練できます
特徴抽出は大きなタスクで時間がかかるので さらに詳しく説明します
Vision APIの機能を使い 動画の全フレームを見て 手 脚 腰 目など身体上の18ヵ所の 目印の位置をコード化します 各目印のx座標とy座標に加え 信頼性スコアを記録します これらが訓練に利用する特徴を形成します
戻ってその状況を確認しましょう
特徴抽出には30分ほどかかります 時間がないのでこの訓練プロセスを停止し 前に作成したモデルのプロジェクトを開きます
このモデルは先ほどと同じデータを使って 訓練済みです さらに検証データも追加しました
訓練タブと評価タブでは 最終レポートが見られます
モデルのパフォーマンスの経時的変化が 確認できます 80回の反復は妥当な選択だったようです ラインが右肩上がりの後に 平らになっているので 訓練が安定した状態に達したと分かります
評価タブでは クラス別のパフォーマンスが分かるので 各アクションが均等に 十分な成果を上げているかを確認できます データの検証やテストの結果は こちらに表示されます
しかし 何よりもモデルの動作を見たいです プレビュータブでは 訓練に使っていない動画でモデルを試せます これは昨日 庭で撮った動画です
動画を処理してポーズを特定し モデルがそれをアクションに分類します 今は動画全体を事前に分類していますが ご自身でAppを作成する際は ストリーミングも選択できます ライブ動画を使う場合や 応答性がほしい場合に便利です “再生”ボタンを押し 検出結果を見ましょう 動画上のラベルを見てください 動画のアクションの展開に伴い 分類の変化を確認できます
もう一度 再生します
動画上にポーズの骨組みが表示されていますが 非表示にもできます
ポーズの骨組みだけを 黒色を背景に見ることもできます
動画の下にタイムラインがあります 先ほど設定したとおり 動画が2秒のウィンドウに分割されています 下の各ウィンドウには最適な予測と 確率の低いその他の予測が表示されます
このモデルを使ってAppを作るには プロジェクトからモデルをエクスポートします アウトプットタブを使えば可能です アウトプットタブには サイズなどモデルの概要が示されています サイズはモバイルAppのアセットとして 検討すべき重要事項です このモデルのオペレーティングシステムの バージョンも確認できます
アイコンをファインダにドラッグして モデルを保存しましょう
FitnessClassifier.MLmodelと名前を付けます
これをユシンとシェアし すごいiOS Appの作り方を教えてもらいましょう アレックスからフィットネスエクササイズAppを 動かす分類器が届きました まずモデルを使って予測をする方法を 見てみましょう 例えば カメラまたは動画ファイルから 挙手ジャンプを認識したいとします
しかし モデルはポーズを動画というよりも 入力として認識しています ポーズの抽出には Vision APIの VNDetectHumanBodyPoseRequest関数を使います
動画URLを利用する場合は VNVideoProcessorで 動画全体のポーズのリクエストを処理できます 全フレームのポーズ結果は 完了ハンドラで取得できます
代わりにカメラストリームを使う場合は VNImageRequestHandlerを使えば― キャプチャした各画像に対し 同様のポーズをリクエストできます
各フレームからポーズを取得したら それを3次元配列の予測ウィンドウに モデル入力として集約しなければなりません
ややこしそうですが Visionの便利な keypointsMultiArray APIを使えば 細かい対処の必要はありません フィットネスモデルのウィンドウサイズは60です 60フレームのポーズを連結するだけで 1つの予測ウィンドウを作成できます
ウィンドウを準備したら 入力としてモデルに渡します 最終的に モデル出力結果には 上位予測のアクション名と 信頼性スコアが含まれています
では Xcodeで手順を追っていきましょう
これがフィットネスAppです 開きます
これがトレーニングした フィットネス分類器です メタデータページには 利用者とモデル情報が表示されます 例えば 作成者や説明 クラスラベル名の他にも レイヤ分布などが表示されます
予測ページには モデルの入力や 出力情報の詳細が表示されます 例えば 必要な入力多次元配列や 出力の名前と種類などです
他のAppロジックは省略して モデル予測を進めましょう
私の予測子で フィットネス分類器モデルと Vision身体ポーズリクエストを まずは初期化します この操作は1回だけです
モデルは予測ウィンドウを 入力と捉えるので ウィンドウバッファも維持して 過去2秒間の末尾の60ポーズを保存します 60とはトレーニングに使ったモデルの 予測ウィンドウのサイズです
カメラからフレームを受け取ったら ポーズを抽出する必要があります
ここにはVision APIの呼び出しと スライドで見たポーズの リクエストの実行が含まれています ウィンドウに抽出したポーズを追加する前に
アクション分類器が対象とするのは 1人だけと覚えておきます つまり Visionが複数人を検出した場合は 人を選出するロジックの実装が必要です このAppで サイズに基づいて 最も突出した人を選ぶだけです 他の方法で選ぶことも可能です では ウィンドウにポーズを追加しましょう
ウィンドウが埋まったら 予測を開始できます このAppは0.5秒ごとに予測を行いますが 使用目的によって 間隔やトリガーを設定したりすることもできます
では モデル予測を行いましょう
モデル入力を用意するため ウィンドウの各ポーズを 多次元配列に変換する必要があります Visionの便利なAPIや keypointsMultiArrayを使います 人物が検出されない場合は ゼロを当てるだけです
そして この多次元配列のうち60点を 単一の配列に連結したのがモデル入力です
最終的には わずか1行のコードで予測を実行できます
出力に含まれるのは上位予測のラベル名と すべてのクラスの ディクショナリの信頼性スコアです 最後にポーズウィンドウのリセットをお忘れなく 再び埋まった時に すぐに次の予測を作れるようにするためです
アクション分類器を使った 予測作成の手順は以上です 実際にこのAppを使って 機能を確認しましょう
体力が有り余っているので エクササイズをしようと思います
Appを開いて―
開始ボタンでエクササイズを始めます
すべての入力フレームから 私のポーズが抽出され 継続的に予測モデルを作成します Appの一番下に表示されています これはデバッグビューの 信頼性スコアとラベルです では 始めますよ
5秒間チャレンジを終えました 見てのとおりです モデルがアクションを認識した時点で タイマーが起動します 運動をやめると 私のアクションを その他のアクションクラスと判断します 次に 下半身のエクササイズを行います 始めます
エクササイズは終了ですが 急いでないので 休憩して水を飲むことにします
すべてインタラクティブに起動するので デバイスを操作するために 戻る必要はありません 自宅でのエクササイズに とても便利です
最後にスクワットをします
3つのチャレンジをすべて終えました ここに 時間のレポートが出ています 今日はたくさん運動をしました
予測を行う際のアクション分類器の トレーニングについて説明しました アレックスのベストプラクティスで このセッションをまとめます ありがとう このAppは エクササイズの開始を 待つのがいいですね エクササイズで 手足の動きを覚えるには時間がかかります 優れた機能の構築には 優れたデータが必要です アスリートや子どもたちから 最高のパフォーマンスを引き出し 動画に命を吹き込みます
繰り返し様々な素材に触れて モデルは学習します
先ほど 分類したいエクササイズごとに 約50本の動画があることを確認しましたが 皆さんのAppにもお勧めします
必ず 様々な人でトレーニングしてください モデルは それらのスタイルや能力 速さを認識する必要があります
ユーザの動きが激しい場合は 正面と同じく 側面と背面から アクションをキャプチャしてください
エクササイズをしていない時や 静止している時も 認識する必要があります フォルダを2つ作ります 1つは歩行とストレッチ用で もう1つは座ってたり動かない時用です
アクション分類器に 優れた動画を キャプチャする方法を考えましょう
撮影者の動きも 被写体の動きとして 解釈される可能性があります 三脚を使うなどして カメラを安定させましょう
ポーズ検出器で 体の輪郭をはっきり見せる必要があります 背景と区別のつきにくい服装では うまくいきません 大きすぎる服だと 動きが隠れて検出できません
これで アクション分類器に最適な 動画を撮る方法が分かりました Create MLでトレーニングを 最大限に活用する方法を教えて?
いいわよ アレックス データを集めたら トレーニングパラメータを設定してください 重要なパラメータは アクション期間の秒数― または 時間枠内のフレーム数である 予測ウィンドウサイズです この長さは動画のアクションと 合致していなければなりません すべてのアクションを ほぼ同じ長さにしてください
動画のフレームレートは 予測ウィンドウの有効な長さに影響します トレーニング動画とテスト動画の間で 平均フレームレートを一定に保つことが 正確な結果を得るには重要です
アプリケーションでモデルを使う時は 必ず1人だけを選択してください 複数人を検出した時は 1人だけ撮るように促すのもいいでしょう または 独自の選択ロジックを実装して 人物のサイズやフレーム内の位置をもとに 1人を選ばせることもできます これはポーズの目印の座標を使えば実装可能です
アクションの反復を数えたいなら トレーニング動画の準備に必要なのは 1つのアクションを1回行うだけです そしてAppで予測を行う際に 正しいタイミングで予測を開始する 確実なトリガーを見極めましょう またはカウンターを適切に更新するための 平滑化ロジックを実装します
最終的に アクション分類器で アクションの回数の評価や判断ができます 例えば Appで 予測の信頼性スコアの値を使います トレーニング動画のサンプルアクションと 比較して アクションの品質を評価できます
これがCreate MLのアクション分類器です この機能を活用した すばらしいAppの誕生が楽しみです ありがとうございました 引き続き WWDCをお楽しみください
-
-
5:28 - Working with montage videos
[ { "file_name": "Montage1.mov", "label": "Squats", "start_time": 4.5, "end_time": 8 } ]
-
14:05 - Getting poses
import Vision let request = VNDetectHumanBodyPoseRequest()
-
14:10 - Getting poses from a video
import Vision let videoURL = URL(fileURLWithPath: "your-video-file.MOV") let startTime = CMTime.zero let endTime = CMTime.indefinite let request = VNDetectHumanBodyPoseRequest(completionHandler: { request, error in let poses = request.results as! [VNRecognizedPointsObservation] }) let processor = VNVideoProcessor(url: videoURL) try processor.add(request) try processor.analyze(with: CMTimeRange(start: startTime, end: endTime))
-
14:26 - Getting poses from an image
import Vision let request = VNDetectHumanBodyPoseRequest() // Use either one from image URL, CVPixelBuffer, CMSampleBuffer, CGImage, CIImage, etc. in image request handler, based on the context. let handler = VNImageRequestHandler(url: URL(fileURLWithPath: "your-image.jpg")) try handler.perform([request]) let poses = request.results as! [VNRecognizedPointsObservation]
-
14:57 - Making a prediction
import Vision import CoreML // Assume pose1, pose2, ..., have been obtained from a video file or camera stream. let pose1: VNRecognizedPointsObservation let pose2: VNRecognizedPointsObservation // ... // Get a [1, 3, 18] dimension multi-array for each frame let poseArray1 = try pose1.keypointsMultiArray() let poseArray2 = try pose2.keypointsMultiArray() // ... // Get a [60, 3, 18] dimension prediction window from 60 frames let modelInput = MLMultiArray(concatenating: [poseArray1, poseArray2], axis: 0, dataType: .float)
-
16:27 - Demo: Building the app in Xcode
import Foundation import CoreML import Vision @available(iOS 14.0, *) class Predictor { /// Fitness classifier model. let fitnessClassifier = FitnessClassifier() /// Vision body pose request. let humanBodyPoseRequest = VNDetectHumanBodyPoseRequest() /// A rotation window to save the last 60 poses from past 2 seconds. var posesWindow: [VNRecognizedPointsObservation?] = [] init() { posesWindow.reserveCapacity(predictionWindowSize) } /// Extracts poses from a frame. func processFrame(_ samplebuffer: CMSampleBuffer) throws -> [VNRecognizedPointsObservation] { // Perform Vision body pose request let framePoses = extractPoses(from: samplebuffer) // Select the most promiment person. let pose = try selectMostProminentPerson(from: framePoses) // Add the pose to window posesWindow.append(pose) return framePoses } // Make a prediction when window is full, periodically var isReadyToMakePrediction: Bool { posesWindow.count == predictionWindowSize } /// Make a model prediction on a window. func makePrediction() throws -> PredictionOutput { // Prepare model input: convert each pose to a multi-array, and concatenate multi-arrays. let poseMultiArrays: [MLMultiArray] = try posesWindow.map { person in guard let person = person else { // Pad 0s when no person detected. return zeroPaddedMultiArray() } return try person.keypointsMultiArray() } let modelInput = MLMultiArray(concatenating: poseMultiArrays, axis: 0, dataType: .float) // Perform prediction let predictions = try fitnessClassifier.prediction(poses: modelInput) // Reset poses window posesWindow.removeFirst(predictionInterval) return ( label: predictions.label, confidence: predictions.labelProbabilities[predictions.label]! ) } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。