ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Create MLフレームワークを使ったダイナミックなiOS Appの構築
Create MLフレームワークを使って、Core MLモデルを完全にデバイス上でトレーニングすることで、データのプライバシーを守りながら、適応性の高いカスタマイズされたAppエクスペリエンスを実現する方法を紹介します。スタイル変換や画像識別といった画像ベースのタスク、カスタム音声識別などのオーディオタスク、またはテキスト識別、表形式データの識別、および表形式データの回帰分析などのタスクといった、オンザフライ方式で作成できるモデルタイプについて確認します。また、Appをよりパーソナルでダイナミックなものにするため、これらのモデルから提供される多数の可能性を紹介します。 参考として、WWDC21の「Create MLによる手のポーズや動きの識別」と「SoundAnalysisのビルトイン音声識別」をご確認ください。
リソース
関連ビデオ
WWDC22
WWDC20
-
ダウンロード
♪ (Create MLフレームワークを使った ダイナミックなiOS Appの構築) こんにちはタオです 今日は同僚のJackと 一緒に Create ML フレームワークを使った ダイナミックな iOS Appの構築についてお話しします 動的Appとは どういうことかというと 特定の要素について ユーザーがカスタマイズできる 柔軟さを備えた Appということです 動的Appはまた ユーザーの多様なニーズに 一番合うようにコンテンツを 仕立てます こうした応用力を備えた App内機能は ユーザーに よりインテリジェントで 彼らにぴったり合う パーソナライズされた体験を もたらします こうした体験は 単純な経験則や 事前定義されたルールによって 提供が可能です しかしこうしたアプローチが Appユーザー全員の ベストな経験とならないことも 多々あります なぜなら彼らの背景や 好みは変動するからです 一方で 機械学習の テクニックを使うことで ユーザーデータから直接学習する モデルを作ることが可能です これは一般化の柔軟性が より高く また発見的・ 事前定義ルールより多くの ユーザーにマッチしやすいです では こうした体験の提供には どんなツールを使うのでしょうか? Macに搭載されている Create ML Appです トレーニングデータを選択して トレーニングボタンを 押すだけで モデルを 簡単に作れます 豊富なテンプレートセットで あらゆる種類の モデルタイプに対応しています Create MLフレームワークの 上に構築されており 機械学習モデルの トレーニングを 高速で行えます Create ML フレームワークは、もともと macOS Mojaveで導入されたもので、 モデルをSwiftコードで macOSアプリ内から トレーニングできるようになっています。 今年 iOS 15 や iPadOS 15 にも 導入します これがデバイス上で 使えると 斬新で動的なあらゆることが Appで行えるようになります つまり デバイス上でモデルを作成する プログラム用APIに Appから直接 アクセスできるのです ユーザーから学習し ユーザーに適応する能力が Appにもたらされます 最後に これが一番大事ですが ユーザーデータがデバイスから 出ていく事がありません 従ってユーザープライバシーは 守られます では 掘り下げていきます Create MLでは様々な タスクが利用可能です macOSで使えるのは これですが iOSでも多くの タスクが利用可能です 中でも人気があるのは 画像や音声そして テキストの分類です です 最近では画風変換 が追加され ハンドポーズや ハンドアクションの分類も 今年新機能として 加わりました こうしたツールからは 多くの面白いアイデアや ユースケースが生まれます いくつか例を紹介します 画像分類を使うと Appが子供のお気に入りの ぬいぐるみの外見を 学習して その画像をもっと 探せるようにして 彼らの冒険ストーリーを 一緒に作ることができます テキスト分類は ユーザーが書いたばかりの メモを 過去の行動から 学習したタグやフォルダの 予測によりすばやく 整理できるようにします 今年追加された ハンドアクション分類では カスタム定義のハンドアクション を認識して、 視覚効果をトリガーできます iOSのCreate MLでは 様々な素敵なことができますが 分かりやすいように実例で 説明します 一見Photo Booth風の Appですが もっと動的に カスタムの画像フィルターを 作成できます 例を見てみましょう これは私のiPadですが トップには 私がCreate MLの Style Transferタスクを使って トレーニングした既存の フィルター一覧が出ています それぞれフィルター作成に 使われた特定のスタイルの画像が 表示されています 一番下には これらフィルターをかける 画像を撮影するか 選択するかが 示唆されています ここで写真を撮ります
セルフィーを撮って
フィルターをかけてみましょう まずは最初にある波の画像を クリックします 私の顔や髪が水滴で 表現され かなり前に行ったマイアミ 休暇を思い出します 鳥の絵だとどうでしょうか? とてもカラフルになりましたね 3番目の砕いた氷のような 絵だとどうなるでしょうか? クールで冷たい感じですね これらはとても楽しいですが どこか物足りないように 思えます 自分で選んだ任意の画像から フィルターを作れたら どうでしょうか? とても楽しいアプリに なりそうですね やってみましょう
ここに私の娘が 3歳の時に描いた 絵があります このテクスチャと色を とても気に入っています 娘の芸術スタイルで フィルターを作ったら どんな自撮りになるでしょうか この「+Filter」 ボタンをクリックして カメラを選択し 写真を撮ります
“Use Photo” これでフィルターができました ここでトレーニングしているのは カスタムの画風変換モデルです その仕組みを説明しましょう まず1つの画風の 画像を選択します 私は娘の絵を 画風に使いました 次にコンテンツ画像を いくつか用意して スタイルをどう適用するか モデルに学習させます 画像のオリジナルコンテンツを 残しながらです このデモでは 風景写真や 自撮りなど 自分のアルバムから 数十枚を使いました 同じスタイルを 他のタイプの画像に適用したい場合 例えば ペットの写真を 何枚か コンテンツセットに 入れておきましょう そしてフィルタータイプを アプリケーションシナリオに応じて 画像または動画から 選択します このデモでは画像を選びました スタイルを静止画に 適用したいからです またお気に入りのスタイルと オリジナルコンテンツの 組み合わせを得られるまで スタイルの強度や密度 反復回数を 実験することもできます これらのパラメーター 設定方法の詳細は 去年のWWDCセッションを ご覧ください では新しく作ったフィルターを 画像にかけてみましょう すごい 娘の絵では 私はこんな風なのですね テクスチャや色が しっかり反映されています 違う画像では どんな風に見えるでしょうか? このウサギは 娘の大のお気に入りで よく遊んでいますが このウサギと自撮りを撮って フィルターを掛けたら どうでしょうか?
ウサギにも娘の絵の スタイルが適用されていますね 娘に見せて他の絵も 試すのが楽しみです とても楽しいでしょう このデモでは iOSのCreate ML フレームワーク にあるStyle Transferモデルで カスタムの画像フィルターを 作る方法を説明しました では これはコードでは どうなっているでしょうか まず 1つのスタイル画像 とコンテンツ画像セットを 指定するデータソースの トレーニングを定義します 次に チェックポイントの 保存先などを 指定するための セッションパラメーターを 定義します そしてこれらのパラメーターで ジョブのトレーニングを定義します 最後にジョブの トレーニングを振り分け 正常に完了したら 画像のスタイル化を行うための 学習を行なったCore MLモデルを保存し コンパイル インスタンス化を行い 推論を開始します それだけです これがCreate MLフレームワークの Style Transfer APIを使って カスタムの画像フィルターを 作る方法です 同じようなAPIパターンに従う タスクは他にもあります ここまで 画像やテキスト 音声や動画など リッチメディア データタイプからの モデル作成を可能にする タスクについてお話ししました でも Appがこうした データタイプを扱わない場合は? ここからはJackが このようなケースでAppを 動的にする方法を説明します タオ ありがとう ここまで説明してきたような タスクに加えて iOSのCreate ML フレームワークは 構造化された表形式データの 分類や回帰にも 対応しています これによってより動的な App体験を創り出す 方法を見ていきましょう まず 分類と回帰に ついてですが 分類はトレーニングデータセット のデータから 特定のクラスを予測することを 学習します 回帰も同様ですが 個別のクラスラベルではなく 数値の予測を 学習します これらは一般的な 表形式データの 分類や回帰の トレーニング用のAPIで それらを様々なシナリオで 使えるようになっています 特にiOSの Create MLでは 各シナリオに4種類の アルゴリズムが提供されています 通常の表形式モデル を使うには ちょっと作業が必要です モデルで使いたい 機能やターゲット値を 決めなければならないからです しかし これはもっと 簡単にできます ここで 表形式の回帰器で Appをよりパーソナライズ されたものにしてみましょう これはシンプルな 出前注文Appですが このエリアにある レストランを見てみると Amazing Thaiという レストランがありますね これを選択すると レストランから注文可能なメニューや 各メニューの 情報が表示されます シンプルなAppですがもっと 良くするにはどうすれば良いでしょう 使うにつれてAppが 私の行動を学習し 私が気に入りそうな店や メニューのおすすめを インテリジェントに出せる ようになると便利ですよね ただのシンプルなアプリが 本当に動的なAppへと 進化するでしょう これはアプリで表形式の回帰器を トレーニングすることで 実現可能です 3種類の情報を 構造化された表にまとめ 新しく動的な 体験を作れるように モデルのトレーニングを 行いたいと思います まずはコンテンツです Appに読み込む データのことです レストランAppの ケースで言うと メニュー情報です 次はコンテキストで ここではユーザーが 注文をする時間帯です 最後に注文履歴を 追加して デバイス上で ユーザーにぴったり合った 体験を作ります コンテンツとコンテキスト 過去のユーザーとの インタラクションを 組み合わせることで 今後のインタラクションを 予測できます パーソナライゼーションの 絶好の機会です ここでは ユーザーが今後 気に入りそうなメニューを 予測可能にしてみましょう モデルを追加した Appに戻って 今日のランチは ピザの気分です ランチと指定して Pizza Parlorを選択し マルゲリータを選んで 注文します このウィンドウに 表示されているのは まさに表形式回帰器で トレーニングされた情報です コンテンツはメニューに 関連するキーワードです トマトやモッツァレラチーズ など材料や レストラン情報 --ここでは Pizza Parlorですね そしてメニューのジャンル ここではピザです このモデルのコンテキストは その日の時間帯です 今回はランチなので 私がランチに気に入りそうなものは こういうものだと モデルに学習させます 最後に インタラクションは 私が他ではないこのメニューを 注文したということです トレーニング中の回帰器が 私が注文しそうな 各メニューのお気に入り スコアを予測します 今回は私が 特にこのメニューを注文したと 学習しました メイン画面に戻ると モデルのトレーニングが完了し ウィンドウが新しくなって 私に合わせたメニューを おすすめしています 私が実際に注文した マルゲリータピザは 最初のおすすめに 出ていますが 次のおすすめには 全く別の店の カプレーゼサンドが 表示されています また 他のピザもいくつか トップ近くに出ています 別の例を試してみましょう ディナーを注文するとして
今回はAmazing Thaiの イエローカレーにします モデルが更新されていますね 私の好みや注文する時間帯の コンテキストを学習しています 今は注文したばかりの イエローカレーがトップで 似たようなカレーが次の おすすめに出ています その次はベジタリアンピザです 今注文したカレーと同じく マッシュルームと ピーマン入りです Appは私がピザを 気に入ると知っているのです 私のディナーの第一候補では ないとしても 翌日にランチを 注文しようとすると モデルは私がランチに 注文しそうなメニューと ディナーのそれの 区別を学習していました これは本当にパーソナライズ された体験につながり たった2回注文しただけで 私がいつ何を食べたいか 正確に見つけられるように なりました 表形式分類器や 回帰器を Appに追加するには 3つのステップがあります データセットの用意と トレーニングそして予測です この最初の関数は メニューやキーワードから 回帰で使われる 特徴量を作るものです 各メニューに関連する keywords を 現在の meal(コンテキスト) と組み合わせて新しい モデルがコンテンツ(メニュー)と コンテキスト(注文)キーワードの 間のインタラクションを 検出できるようにする 新しいキーワードを 作成します データエントリに 特定のキーワードが 存在することを 単純に示すために 辞書に1.0という値を入れました まず ユーザーが注文した メニューごとに 先に生成した特徴量と 正の目標値を エントリーとして追加します しかし これだけでは モデルは私が気に入るメニューと そうでないものの 区別を学習しません そのため メニューに含まれていない 全てのキーワードを マイナスの目標値 -1で入力しています これでモデルはどの キーワードが ユーザーの好みに一番 マッチするか学習できます この組み合わせた情報を DataFrame として keywords と target 両方を 指定します 最後に 予測したい列が 1または-1に設定した target の列であると 指定して モデルのトレーニングを 行います ここではモデルが単純な 線形回帰器になっていて Appで使える 意味のある 結果を生成します 予測時には 推測を実行したい データを指定して トレーニングしたモデルから predictions を呼び出すだけです ここまで iPadOSとiOS アプリで Style Transferモデルと 表形式回帰器のトレーニング 方法を見てきました 機械学習トレーニングを アプリに統合する ベストプラクティスを 見ていきましょう 一般的に 機械学習では ベストプラクティスに 従うほうが良いです 例えば、トレーニングデータセットに 含まれていないデータで モデルがどのように動作するかを 常にテストします 時間がかかる トレーニングタスクでは 非同期の トレーニングコントロールや チェックポイントメカニズムを 活用して モデル作成ワークフローを カスタマイズしましょう モデル作成は場合によって 計算量が多く メモリを消費したり 追加のアセットのダウンロードが 必要なケースがあります Appと統合するときには これらを念頭に入れてください 詳しくは 当社APIや 資料をご覧ください ベストプラクティスを もっと知りたい方は 過去の「Designing Great ML Experiences」や 「Control training in Create ML with Swift」の 他のWWDCセッションを チェックしてください このセッションではiOSの Create MLフレームワーク の使い方を説明しました Style Transferや 表形式回帰器を使った 例を用いましたが Create MLテンプレートの ほとんどはiPhoneやiPad で直接トレーニングできます iOSでのトレーニングを通じ ユーザープライバシーを守りつつ ユーザーにカスタムの パーソナライズされた体験を 与える動的なアプリを作れます トレーニングとインターフェイスが 完全に内蔵されているため どちらもモデルデプロイメントの 心配は無用です どんなAppができるか 楽しみですね ご視聴ありがとうございました WWDCをお楽しみください ♪
-
-
7:58 - Training a style transfer model
// define training data source let data = MLStyleTransfer.DataSource.images(styleImage: styleUrl, contentDirectory: contentUrl) // define session parameter let sessionParameters = MLTrainingSessionParameters(sessionDirectory: sessionUrl) // define training job let job = try MLStyleTransfer.train(trainingData: data, sessionParameters: sessionParameters) // dispatch training job // save out model upon receiving successful completion, compile for later use // make prediction with CoreML model try model.write(to: writeToUrl) let compiledURL = try MLModel.compileModel(at: writeToUrl) let mlModel = try MLModel(contentsOf: compiledURL) let inputImage = try MLDictionaryFeatureProvider(dictionary: ["image": image]) let stylizedImage = try mlModel.prediction(from: inputImage)
-
13:39 - Collecting features for a regressor
func featuresFromMealAndKeywords(meal: String, keywords: [String]) -> [String: Double] { // Capture interactions between content (the dish keywords) and context (meal) by // adding a copy of each keyword modified to include the meal. let featureNames = keywords + keywords.map { meal + ":" + $0 } // For each keyword, create an entry in a dictionary of features with a value of 1.0. return featureNames.reduce(into: [:]) { features, name in features[name] = 1.0 } }
-
14:08 - Preparing training data
var trainingKeywords: [[String: Double]] = [] var trainingTargets: [Double] = [] for item in userPurchasedItems { // Add in the positive example. trainingKeywords.append( featuresFromMealAndKeywords(meal: item.meal, keywords: item.keywords)) trainingTargets.append(1.0) // Add in the negative example. let negativeKeywords = allKeywords.subtracting(item.keywords) trainingKeywords.append( featuresFromMealAndKeywords(meal: item.meal, keywords: Array(negativeKeywords))) trainingTargets.append(-1.0) }
-
14:37 - Training a linear regressor model
// Create the training data. var trainingData = DataFrame() trainingData.append(column: Column(name: "keywords" contents: trainingKeywords)) trainingData.append(column: Column(name: "target", contents: trainingTargets)) // Create the model. let model = try MLLinearRegressor(trainingData: trainingData, targetColumn: "target")
-
14:58 - Making a prediction
// Setup the data to run an inference on. var inputData = DataFrame() inputData.append(column: Column(name: "keywords", contents: dishKeywords)) // Call predictions on the trained model with the data. let predictions = try model.predictions(from: inputData)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。