Android の画像生成ガイド

<ph type="x-smartling-placeholder">で確認できます。

MediaPipe Image Generator タスクを使用すると、テキスト プロンプトに基づいて画像を生成できます。この テキストから画像へのモデルを使用して、拡散技術を使用して画像を生成します。

タスクは入力としてテキスト プロンプトと、オプションの条件画像を受け取ります。 モデルが拡張し、生成用の参照として使用できるようにします。画像生成ツール モデルに提供された特定のコンセプトに基づいて画像を生成することもできます。 再トレーニングをします詳細については、 LoRA

この手順で説明するコードサンプルは、 GitHub。 機能、モデル、構成オプションの詳細については、 概要をご覧ください。

サンプルコード

MediaPipe Tasks のサンプルコードは、Image Generator の基本的な実装例です。 アプリアプリは、独自の Android アプリの出発点として使用できます。 既存のアプリを変更するときに参照することもできます。Image Generator の例 コードは GitHub

コードをダウンロードする

次の手順では、サンプルのローカルコピーを作成する方法を示します。 git コマンドライン ツールを使用してコードを実行します。

<ph type="x-smartling-placeholder">

サンプルコードをダウンロードするには:

  1. 次のコマンドを使用して Git リポジトリのクローンを作成します。
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 必要に応じて、スパース チェックアウトを使用するように Git インスタンスを構成し、 Image Generator サンプルアプリのファイルのみを表示します。
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generator/android
    

サンプルコードのローカル バージョンを作成したら、プロジェクトをインポートできます。 アプリを実行します。手順については、セットアップ ガイド: Android

主要コンポーネント

次のファイルには、この画像生成の例に不可欠なコードが含まれています。 アプリケーション:

  • ImageGenerationHelper.kt: タスクを初期化し、画像生成を処理します。
  • DiffusionActivity.kt: プラグインまたは LoRA の重みが有効になっていない場合に、画像を生成します。
  • PluginActivity.kt: ユーザーが条件を指定できるようにするプラグイン モデルを実装します。 使用できます。
  • LoRAWeightActivity.kt: 基盤のカスタマイズに使用される LoRA 重みにアクセスして処理 特定のコンセプトの画像を生成できます。

セットアップ

このセクションでは、開発環境をセットアップする主な手順と 画像生成ツールを使用するためのコード プロジェクトです。一般的な情報については、 MediaPipe タスクを使用するための開発環境の設定 プラットフォーム バージョンの要件については、 Android

<ph type="x-smartling-placeholder">

依存関係

Image Generator タスクでは、 com.google.mediapipe:tasks-vision-image-generator ライブラリ:この依存関係を追加する Android アプリの build.gradle ファイルに追加します。

dependencies {
    implementation 'com.google.mediapipe:tasks-vision-image-generator:latest.release'
}

Android 12(API 31)以降を搭載したデバイスの場合は、ネイティブ OpenCL ライブラリを追加する AndroidManifest.xml に依存関係を追加します。詳細については、このモジュールの uses-native-library できます。

一部の Android デバイスには、追加のライブラリが必要になる場合があります。

<uses-native-library android:name="libOpenCL.so" android:required="false" />
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false" />

モデル

MediaPipe 画像生成ツールタスクには、互換性のあるトレーニング済みの基盤モデルが必要 見ていきましょう。モデルをダウンロードしたら、必要な依存関係をインストールして、 モデルを適切な形式に変換できます。次に、変換された Android デバイスに提供します。

画像生成ツールで使用可能なトレーニング済みモデルの詳細については、タスクを参照してください。 モデル セクションの概要

基盤モデルをダウンロード

Image Generator では、基盤モデルがモデルに一致する必要があります。 以下に基づく runwayml/stable-diffusion-v1-5 EMA-only モデル形式 model: runwayml/stable-diffusion-v1-5.

依存関係をインストールしてモデルを変換する

$ pip install torch typing_extensions numpy Pillow requests pytorch_lightning absl-py

次のコマンドを実行します。 convert.py スクリプト:

$ python3 convert.py --ckpt_path <ckpt_path> --output_path <output_path>

変換されたモデルをデバイスにプッシュする

<output_path> フォルダの内容を Android デバイスにプッシュします。

$ adb shell rm -r /data/local/tmp/image_generator/ # Remove any previously loaded weights
$ adb shell mkdir -p /data/local/tmp/image_generator/
$ adb push <output_path>/. /data/local/tmp/image_generator/bins

プラグイン モデルをダウンロードして LoRA の重みを追加する(省略可)

プラグイン モデルを使用する場合は、プラグイン モデルが ダウンロードする必要があります。追加のモデルを必要とするプラグインの場合、 モデルは APK にバンドルされているか、オンデマンドでダウンロードする必要があります。プラグイン モデル 軽量(約 23 MB)で、APK に直接バンドルできます。ただし、 プラグイン モデルをオンデマンドでダウンロードすることをおすすめします。

カスタム ディメンションを使ってモデルを LoRA、 オンデマンドでダウンロードできます。詳細 詳しくは、LoRA 重みのプラグイン モデルをご覧ください。

タスクを作成する

MediaPipe Image Generator タスクでは、createFromOptions() 関数を使用して タスクを実行します。createFromOptions() 関数は構成の値を受け入れます。 。構成オプションの詳細については、構成 オプションをご覧ください。

構成オプション

このタスクには、Android アプリ用に次の構成オプションがあります。

オプション名 説明 値の範囲
imageGeneratorModelDirectory モデルの重みを保存する画像生成ツールのモデル ディレクトリ。 PATH
loraWeightsFilePath LoRA 重みファイルのパスを設定します。省略可。次の場合のみ該当 モデルは LoRA でカスタマイズされています PATH
errorListener オプションのエラーリスナーを設定します。 N/A

このタスクはプラグイン モデルもサポートしており、ユーザーは条件画像を含めることができます。 タスク入力に生成され、基盤モデルがそれを補強してリファレンスとして使用 生成します。これらの状態画像は、顔のランドマーク、端の輪郭、 深度推定。モデルはこれを追加のコンテキストや情報として 画像を生成できます。

基盤モデルにプラグイン モデルを追加する場合は、プラグインの構成も行う 。Face ランドマーク プラグインが faceConditionOptions(Canny エッジ)を使用する プラグインでは edgeConditionOptions を使用し、Depth プラグインでは depthConditionOptions

Canny Edge のオプション

edgeConditionOptions で次のオプションを構成します。

オプション名 説明 値の範囲 デフォルト値
threshold1 ヒステリシス手順の 1 つ目のしきい値。 Float 100
threshold2 ヒステリシス手順の 2 番目のしきい値。 Float 200
apertureSize Sobel オペレーターの絞りサイズ。一般的な範囲は 3 ~ 7 です。 Integer 3
l2Gradient L2 ノルムを使用して画像勾配の大きさを計算するかどうか デフォルトの L1 ノルムではなく BOOLEAN False
EdgePluginModelBaseOptions パスを設定する BaseOptions オブジェクト 使用します。 BaseOptions オブジェクト N/A

これらの構成オプションの仕組みについて詳しくは、 Canny エッジ検出機能

顔のランドマークのオプション

faceConditionOptions で次のオプションを構成します。

オプション名 説明 値の範囲 デフォルト値
minFaceDetectionConfidence 顔検出に必要な最小信頼スコア 成功したとみなされます。 Float [0.0,1.0] 0.5
minFacePresenceConfidence 顔存在の最小信頼スコア 顔のランドマーク検出のスコアが出力されます。 Float [0.0,1.0] 0.5
faceModelBaseOptions パスを設定する BaseOptions オブジェクト モデルに対して条件の画像を作成します。 BaseOptions オブジェクト N/A
FacePluginModelBaseOptions パスを設定する BaseOptions オブジェクト 使用します。 BaseOptions オブジェクト N/A

これらの設定オプションの仕組みについて詳しくは、 顔認識ツールタスク:

奥行きのオプション

depthConditionOptions で次のオプションを構成します。

オプション名 説明 値の範囲 デフォルト値
depthModelBaseOptions パスを設定する BaseOptions オブジェクト モデルに対して条件の画像を作成します。 BaseOptions オブジェクト N/A
depthPluginModelBaseOptions パスを設定する BaseOptions オブジェクト 使用します。 BaseOptions オブジェクト N/A

基盤モデルのみで作成する

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

プラグインを使用して作成する

オプションのプラグイン モデルを適用する場合は、 setPluginModelBaseOptions を持つプラグイン モデル。プラグイン モデルで 追加のダウンロード済みモデルを使用して条件イメージを作成し、 BaseOptions

顔のランドマーク

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

val faceModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("face_landmarker.task")
    .build()

val facePluginModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("face_landmark_plugin.tflite")
    .build()

val faceConditionOptions = FaceConditionOptions.builder()
    .setFaceModelBaseOptions(faceModelBaseOptions)
    .setPluginModelBaseOptions(facePluginModelBaseOptions)
    .setMinFaceDetectionConfidence(0.3f)
    .setMinFacePresenceConfidence(0.3f)
    .build()

val conditionOptions = ConditionOptions.builder()
    .setFaceConditionOptions(faceConditionOptions)
    .build()

imageGenerator =
    ImageGenerator.createFromOptions(context, options, conditionOptions)
    

キャニーエッジ

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

val edgePluginModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("canny_edge_plugin.tflite")
    .build()

val edgeConditionOptions = EdgeConditionOptions.builder()
    .setThreshold1(100.0f)
    .setThreshold2(100.0f)
    .setApertureSize(3)
    .setL2Gradient(false)
    .setPluginModelBaseOptions(edgePluginModelBaseOptions)
    .build()

val conditionOptions = ConditionOptions.builder()
    .setEdgeConditionOptions(edgeConditionOptions)
    .build()

imageGenerator =
    ImageGenerator.createFromOptions(context, options, conditionOptions)
    

奥行き

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

val depthModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("depth_model.tflite")
    .build()

val depthPluginModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("depth_plugin.tflite")
    .build()

val depthConditionOptions =
    ConditionOptions.DepthConditionOptions.builder()
        .setDepthModelBaseOptions(depthModelBaseOptions)
        .setPluginModelBaseOptions(depthPluginModelBaseOptions)
        .build()

val conditionOptions = ConditionOptions.builder()
    .setDepthConditionOptions(depthConditionOptions)
    .build()

imageGenerator =
    ImageGenerator.createFromOptions(context, options, conditionOptions)
    

LoRA の重みを使用して作成する

LoRA の重みを含める場合は、loraWeightsFilePath パラメータを使用して以下を行います。 パスの場所を指定します。

val options = ImageGeneratorOptions.builder()
    .setLoraWeightsFilePath(weightsPath)
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

データの準備

画像生成ツールでは、次の入力を使用できます。

  • prompt(必須): 生成する画像を説明するテキスト プロンプト。
  • iterations(必須): 画像を生成する繰り返し回数の合計。 20 から始めるのが良いでしょう
  • seed(必須): 画像生成時に使用されるランダムなシード。
  • condition image(省略可): モデルが参照として使用する画像 生成できます。プラグイン モデルを使用する場合にのみ適用されます。
  • condition type(省略可): タスクで使用されるプラグイン モデルのタイプ。 プラグイン モデルを使用する場合にのみ適用されます。

基盤モデルのみを含む入力

fun setInput(prompt: String, iteration: Int, seed: Int) {
    imageGenerator.setInputs(prompt, iteration, seed)
}

プラグインを使用した入力

オプションのプラグイン モデルを適用する場合は、conditionType も使用します。 パラメータでプラグイン モデルを選択し、sourceConditionImage パラメータを 状態の画像を生成します。

オプション名 説明
conditionType 基盤モデルに適用されるプラグイン モデル。 {"FACE", "EDGE", "DEPTH"}
sourceConditionImage 条件イメージの作成に使用されるソースイメージ。 MPImage オブジェクト

プラグイン モデルを使用している場合は、createConditionImage を使用して 状態の画像:

fun createConditionImage(
    inputImage: MPImage,
    conditionType: ConditionType
): Bitmap {
    val result =
        imageGenerator.createConditionImage(inputImage, conditionType)
    return BitmapExtractor.extract(result)
}

条件画像を作成したら、 反復処理の回数などです

imageGenerator.setInputs(
    prompt,
    conditionalImage,
    conditionType,
    iteration,
    seed
)

LoRA の重みを使用した入力

LoRA の重みを使用している場合は、次の場合にトークンがテキスト プロンプトに含まれていることを確認してください。 モデルで表される特定のコンセプトを持つ画像を生成しようとしています。 トレーニングされます。

fun setInput(prompt: String, iteration: Int, seed: Int) {
    imageGenerator.setInputs(prompt, iteration, seed)
}

タスクを実行する

generate() メソッドを使用して、提供された入力を使用して画像を生成します。 説明します。これにより、単一の画像が生成されます。

基盤モデルのみで生成する

fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
    val result = imageGenerator.generate(prompt, iteration, seed)
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

プラグインで生成

fun generate(
    prompt: String,
    inputImage: MPImage,
    conditionType: ConditionType,
    iteration: Int,
    seed: Int
): Bitmap {
    val result = imageGenerator.generate(
        prompt,
        inputImage,
        conditionType,
        iteration,
        seed
    )
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

LoRA の重みを使用して生成する

LoRA の重みでカスタマイズされたモデルを使用して画像を生成するプロセスは、 標準的な基盤モデルのプロセスと類似しています。トークンが、 プロンプトに含まれ、同じコードを実行します。

fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
    val result = imageGenerator.generate(prompt, iteration, seed)
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

反復生成

画像生成ツールでは、出力ごとに生成された中間画像を iterations 入力パラメータで定義された反復処理。これらを表示するには 中間結果の場合は、setInputs メソッドを呼び出し、execute() を呼び出して実行します。 確認できます。中間を表示するには、showResult パラメータを true に設定します。 表示されます。

fun execute(showResult: Boolean): Bitmap {
    val result = imageGenerator.execute(showResult)

    val bitmap =
        BitmapExtractor.extract(result.generatedImage())

    return bitmap
}

結果の処理と表示

画像生成ツールは、生成された画像を含む ImageGeneratorResult を返します。 画像、完了時刻のタイムスタンプ、条件付き画像(存在する場合) 入力として渡されます。

val bitmap = BitmapExtractor.extract(result.generatedImage())

次の画像は、 基盤モデルです。

入力:

  • プロンプト: 「つばの広い帽子をかぶったカラフルなアライグマ 森の中を歩く棒を持っている 3 分の 3 のアニメーション表示 絵画」
  • シード: 312687592
  • 反復処理: 20

生成された画像: