WWDC Quick Look 💓 By SwiftGGTeam
Build dynamic iOS apps with the Create ML framework

Build dynamic iOS apps with the Create ML framework

元の動画を見る

ハイライト

Create ML フレームワークは、macOS から iOS 15 および iPadOS 15 に拡張されました。開発者は、ユーザー デバイス上で Core ML モデルを直接トレーニングして、適応的でパーソナライズされたアプリ エクスペリエンスを実現でき、ユーザー データがデバイスの外に出ることはありません。

主な内容

静的モデルから動的学習へ

以前は、アプリ内の機械学習モデルは静的でした。開発者は Create ML アプリを使用して Mac 上でモデルをトレーニングし、アプリにパッケージ化します。ユーザーがダウンロードした後、モデルは変更されません。この解決策にはいくつかの問題があります。モデルは各ユーザーの固有の好みに適応できません。モデルを更新するには、新しいバージョンのアプリが必要です。トレーニングのためにユーザー データをサーバーにアップロードする必要があるため、プライバシーが危険にさらされます。

WWDC2021 では、Create ML フレームワークが iOS と iPadOS に導入されます。アプリはデバイス上でモデルを直接トレーニングし、ユーザーの行動や好みを学習し、リアルタイムでエクスペリエンスを調整できるようになりました。データは常にローカルに維持され、プライバシーは保護されます。トレーニングが完了すると、モデルをサーバーにデプロイすることなく、推論に直接使用できます。

サポートされているタスクの種類

iOS での Create ML は複数のタスク テンプレートをサポートしています (02:27):

  • 画像分類、スタイル転送(Style Transfer)
  • テキストの分類
  • 音の分類
  • 表形式のデータの分類と回帰 (表形式の分類子/回帰子) -手のポーズ/アクション分類子

スタイル転送: パーソナライズされたフィルターのオンサイト トレーニング

講演者は写真フィルター アプリをデモしました。ユーザーがスタイル画像 (子供の落書きなど) を選択すると、アプリはデバイス上でスタイル転送モデルをトレーニングし、すぐにこのモデルを使用して写真を処理します (03:42)。

トレーニングに必要なのは、スタイル イメージとコンテンツ イメージのセットのみです。ユーザーは自分の写真をコンテンツ画像として提供し、モデルにそのような写真にスタイルを適用する方法を学習させることができます。トレーニング パラメーターには、スタイルの強さ、スタイルの密度、反復回数が含まれており、効果に応じて調整できます。

表形式回帰: レストラン推薦システム

別の例は、レストラン注文アプリ (10:07) です。アプリは料理の内容(キーワード、食材)、コンテキスト(食事時間)、ユーザーの行動(注文内容)の3種類の情報を収集します。この情報は、各料理のユーザーの好みスコアを予測する線形回帰モデルをトレーニングするために使用されます。

モデルのトレーニングでは、いくつかの命令を実行するだけで、推奨事項の作成が開始されます。ユーザーがランチを注文すると、モデルはランチに適した料理を推奨します。ディナーを注文すると、モデルがディナーに適した料理を勧めてくれます。注文が増加するにつれて、推奨事項はますます正確になります。

##詳細

スタイル転送モデルのトレーニング コード

07:58

// トレーニングデータソースを定義:1 枚のスタイル画像 + 1 組のコンテンツ画像
let data = MLStyleTransfer.DataSource.images(
    styleImage: styleUrl,
    contentDirectory: contentUrl
)

// セッションパラメータを定義:checkpoint の保存場所を指定
let sessionParameters = MLTrainingSessionParameters(sessionDirectory: sessionUrl)

// トレーニングタスクを定義
let job = try MLStyleTransfer.train(
    trainingData: data,
    sessionParameters: sessionParameters
)

// トレーニング完了後にモデルを保存
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)

キーポイント:

  • MLStyleTransfer.DataSource.imagesスタイル マップとコンテンツ マップ ディレクトリをデータ ソースにカプセル化します。
  • MLTrainingSessionParametersチェックポイント保存パスを含むトレーニング セッションの動作を制御する
  • MLStyleTransfer.train非同期トレーニングを開始し、進行状況を監視できるジョブを返します。
  • モデルは次のとおりである必要があります。writeまたcompileModel、コンパイル済み.mlmodelcできるMLModel負荷
  • 推論するときに使用しますMLDictionaryFeatureProvider入力、キー名を構築します"image"対応モデル入力

表形式回帰モデルのトレーニング コード

13:39

// 料理のキーワードと食事時間から特徴量を生成
func featuresFromMealAndKeywords(meal: String, keywords: [String]) -> [String: Double] {
    // キーワードと食事時間を組み合わせ、内容とコンテキストの相互作用を捉える
    let featureNames = keywords + keywords.map { meal + ":" + $0 }

    // 各特徴量の値を 1.0 とし、その特徴が存在することを示す
    return featureNames.reduce(into: [:]) { features, name in
        features[name] = 1.0
    }
}

キーポイント:

  • 特徴量エンジニアリングの核心は、「食事時間: キーワード」を組み合わせた特徴量として使用し、モデルが「ランチにピザが好き」などのコンテキスト関連の好みを学習できるようにすることです。
  • 各特徴は 1.0 で表されます。これは、疎な特徴の標準表現です。

14:08

var trainingKeywords: [[String: Double]] = []
var trainingTargets: [Double] = []

for item in userPurchasedItems {
    // 正例:ユーザーがこの料理を注文した
    trainingKeywords.append(
        featuresFromMealAndKeywords(meal: item.meal, keywords: item.keywords)
    )
    trainingTargets.append(1.0)

    // 負例:ユーザーが注文しなかった他のキーワード
    let negativeKeywords = allKeywords.subtracting(item.keywords)
    trainingKeywords.append(
        featuresFromMealAndKeywords(meal: item.meal, keywords: Array(negativeKeywords))
    )
    trainingTargets.append(-1.0)
}

キーポイント:

  • モデルが好きな料理と嫌いな料理を区別できるように、肯定的な例と否定的な例の両方を提供する必要があります。
  • 負例は allKeywords.subtracting(item.keywords) で生成され、同じ食事中にユーザーが選択しなかった他のキーワードを表します
  • ターゲット値に 1.0 と -1.0 を使用すると、リグレッサーが正または負の優先スコアを出力できるようになります。

14:37

// データを DataFrame にまとめる
var trainingData = DataFrame()
trainingData.append(column: Column(name: "keywords", contents: trainingKeywords))
trainingData.append(column: Column(name: "target", contents: trainingTargets))

// 線形回帰モデルをトレーニング
let model = try MLLinearRegressor(
    trainingData: trainingData,
    targetColumn: "target"
)

キーポイント:

  • DataFrameそしてColumnCreate MLのデータ構造はpandasのDataFrameに似ています
  • MLLinearRegressorこれは 4 つの表形式回帰アルゴリズムの 1 つであり、特徴が疎で線形分離可能であるため、このシナリオに適しています。
  • targetColumn予測する対象列を指定します

14:58

// 予測対象の入力データを構築
var inputData = DataFrame()
inputData.append(column: Column(name: "keywords", contents: dishKeywords))

// モデルを呼び出して予測
let predictions = try model.predictions(from: inputData)

キーポイント:

  • 予測中に構築されたデータフレームの列名は、トレーニング中の列名と一致している必要があります。
  • predictions各料理の好みスコアを返します。スコアが高いほど、ユーザーがそれを好む可能性が高くなります。

重要ポイント

1.パーソナライズされた写真フィルター アプリ

  • やるべきこと: ユーザーが自分の写真や絵画で専用のフィルターをトレーニングし、カメラで撮影した写真にリアルタイムで適用できるようにします。
  • 実行する価値がある理由: スタイル転送モデルは数秒でトレーニングでき、ユーザーは効果をすぐに確認でき、エクスペリエンスは高度にパーソナライズされています。
  • 開始方法: を使用しますMLStyleTransfer.trainデバイスでトレーニングするには、コードを参照してくださいMLStyleTransfer.DataSource.imagesデータソースの構築

2.インテリジェントなメモ分類アシスタント

  • 何をすべきか: ユーザーの過去の分類習慣に基づいて、新しいメモのタグとフォルダーを自動的に推奨します。
  • 実行する価値がある理由: メモのコンテンツをクラウドにアップロードすることなく、テキスト分類子をデバイス上でトレーニングし、ユーザーの個人的な分類パターンを学習できます。
  • 開始方法: を使用しますMLTextClassifierユーザーの履歴メモをトレーニング データとして使用するトレーニング。ラベルはユーザーが以前に手動で設定したカテゴリです。

3.アダプティブ音楽レコメンデーション

  • 何をすべきか: さまざまな時間、場所、アクティビティ状態でのユーザーのリスニング履歴に基づいて、ユーザーが現在のシナリオで何を聴きたいかを予測します。
  • 実行する価値がある理由: 表形式回帰では、複数の状況に応じた特徴 (時間、場所、アクティビティ) を統合して、単純なルールよりも正確な推奨事項を提供できます。
  • 開始方法: を使用しますMLLinearRegressorまたはMLBoostedTreeRegressor、機能には時間、場所、曲のメタデータが含まれ、目標はユーザーが曲を完全に再生したかどうかです。

4.カスタマイズされたジェスチャー コントロール ゲーム

  • 内容: ユーザーが独自のジェスチャを定義して、ゲーム キャラクターを制御したり、特殊効果をトリガーしたりできるようにします
  • 実行する価値がある理由: ハンド ジェスチャ分類器は、Vision の手のキー ポイント検出と組み合わせてユーザー定義のジェスチャを認識し、学習コストゼロの操作を実現します。
  • 開始方法: Create ML を使用したトレーニングMLHandPoseClassifier、入力はビジョンですVNHumanHandPoseObservation.keypointsMultiArray()

関連セッション

コメント

GitHub Issues · utterances