MediaPipe Image Generator タスクを使用すると、テキスト プロンプトに基づいて画像を生成できます。この テキストから画像へのモデルを使用して、拡散技術を使用して画像を生成します。
タスクは入力としてテキスト プロンプトと、オプションの条件画像を受け取ります。 モデルが拡張し、生成用の参照として使用できるようにします。画像生成ツール モデルに提供された特定のコンセプトに基づいて画像を生成することもできます。 再トレーニングをします詳細については、 LoRA。
この手順で説明するコードサンプルは、 GitHub。 機能、モデル、構成オプションの詳細については、 概要をご覧ください。
サンプルコード
MediaPipe Tasks のサンプルコードは、Image Generator の基本的な実装例です。 アプリアプリは、独自の Android アプリの出発点として使用できます。 既存のアプリを変更するときに参照することもできます。Image Generator の例 コードは GitHub。
コードをダウンロードする
次の手順では、サンプルのローカルコピーを作成する方法を示します。 git コマンドライン ツールを使用してコードを実行します。
<ph type="x-smartling-placeholder">サンプルコードをダウンロードするには:
- 次のコマンドを使用して Git リポジトリのクローンを作成します。
git clone https://github.com/google-ai-edge/mediapipe-samples
- 必要に応じて、スパース チェックアウトを使用するように 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
生成された画像: