MediaPipe Image Generator タスクを使用すると、テキスト プロンプトに基づいて画像を生成できます。このタスクでは、テキスト画像変換モデルを使用して、拡散手法で画像を生成します。
このタスクは、テキスト プロンプトを入力として受け取ります。また、モデルが拡張して生成の参照として使用できる条件画像(省略可)も受け取ります。Image Generator は、トレーニングまたは再トレーニング中にモデルに提供された特定のコンセプトに基づいて画像を生成することもできます。詳細については、LoRA でカスタマイズする をご覧ください。
この手順で説明するコードサンプルは GitHubで入手できます。 このタスクの機能、モデル、構成オプション の詳細については、概要をご覧ください。
サンプルコード
MediaPipe Tasks のサンプルコードは、Android 用の Image Generator アプリの基本的な実装です。このアプリは、独自の Android アプリの出発点として使用することも、既存のアプリを変更する際に参照することもできます。画像生成ツールのサンプル コードは GitHubでホストされています。
コードをダウンロードする
次の手順では、git コマンドライン ツールを使用して、サンプル コードのローカルコピーを作成する方法について説明します。
サンプルコードをダウンロードする手順は次のとおりです。
- 次のコマンドを使用して、git リポジトリのクローンを作成します。
git clone https://github.com/google-ai-edge/mediapipe-samples
- 必要に応じて、スパース チェックアウトを使用するように git インスタンスを構成します。これにより、Image Generator サンプルアプリのファイルのみが取得されます。
cd mediapipe-samples git sparse-checkout init --cone git sparse-checkout set examples/image_generation/android
サンプルコードのローカル バージョンを作成したら、プロジェクトを Android Studio にインポートしてアプリを実行できます。手順については、Android の設定ガイドをご覧ください。
主要コンポーネント
次のファイルには、この画像生成サンプル アプリケーションの重要なコードが含まれています。
- ImageGenerationHelper.kt: タスクを初期化し、画像の生成を処理します。
- DiffusionActivity.kt: プラグインまたは LoRA の重みが有効になっていない場合に画像を生成します。
- PluginActivity.kt: プラグイン モデルを実装します。これにより、ユーザーは条件 画像をインプットとして提供できます。
- LoRAWeightActivity.kt: 基盤モデルのカスタマイズに使用され、特定のコンセプトの画像を生成できるようにする LoRA の重みにアクセスして処理します。
設定
このセクションでは、Image Generator を使用するために開発環境とコード プロジェクトを設定する主な手順について説明します。プラットフォーム バージョンの要件など、MediaPipe タスクを使用するための開発環境の設定に関する一般的な情報については、Android の設定ガイドをご覧ください。
依存関係
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 ライブラリの依存関係を追加します。詳細については、
uses-native-library
タグに関するドキュメントをご覧ください。
次の uses-native-library タグを AndroidManifest.xml ファイルに追加します。
<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 Image Generator タスクには、このタスクと互換性のあるトレーニング済みの基盤モデルが必要です。モデルをダウンロードしたら、必要な依存関係をインストールし、モデルを適切な形式に変換します。次に、変換したモデルを Android デバイスにプッシュします。
Image Generator で使用できるトレーニング済みモデルの詳細については、タスク の概要のモデルのセクションをご覧ください。
基盤モデルをダウンロードする
Image Generator では、基盤モデルが次のモデルに基づく
stable-diffusion-v1-5/stable-diffusion-v1-5 EMA-onlyモデル形式と一致している必要があります。
モデル:
stable-diffusion-v1-5/stable-diffusion-v1-5 EMA-only。
依存関係をインストールしてモデルを変換する
$ 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 |
このタスクはプラグイン モデルもサポートしています。これにより、ユーザーはタスク入力に条件画像を含めることができます。基盤モデルは、この条件画像を拡張して生成の参照として使用できます。これらの条件画像は、顔のランドマーク、エッジの輪郭、奥行きの推定値です。モデルは、これらの条件画像を画像生成のための追加のコンテキストと情報として使用します。
基盤モデルにプラグイン モデルを追加する場合は、プラグイン オプションも構成します。顔のランドマーク プラグインは faceConditionOptions を使用し、Canny エッジ プラグインは edgeConditionOptions を使用し、奥行きプラグインは depthConditionOptions を使用します。
Canny エッジ オプション
edgeConditionOptions で次のオプションを構成します。
| オプション名 | 説明 | 値の範囲 | デフォルト値 |
|---|---|---|---|
threshold1 |
ヒステリシス処理の最初のしきい値。 | Float |
100 |
threshold2 |
ヒステリシス処理の 2 番目のしきい値。 | Float |
200 |
apertureSize |
Sobel 演算子の絞りサイズ。一般的な範囲は 3 ~ 7 です。 | Integer |
3 |
l2Gradient |
デフォルトの L1 ノルムの代わりに、L2 ノルムを使用して画像グラデーションの大きさを計算するかどうか。 | 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 |
これらの構成オプションの仕組みの詳細については、 Face Landmarker タスクをご覧ください。
奥行きオプション
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)
Canny エッジ
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)
データの準備
Image Generator は次の入力を受け付けます。
- プロンプト (必須): 生成する画像の説明のテキスト プロンプト。
- 反復 (必須): 画像を生成するための反復の合計数。最初は 20 に設定することをおすすめします。
- シード (必須): 画像生成時に使用される乱数シード。
- 条件画像 (省略可): モデルが生成の参照として使用する画像。プラグイン モデルを使用している場合にのみ適用されます。
- 条件タイプ (省略可): タスクで使用されるプラグイン モデルのタイプ。 プラグイン モデルを使用している場合にのみ適用されます。
基盤モデルのみを使用した入力
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() メソッドを使用して、前のセクションで指定した入力を使用して画像を生成します。これにより、生成された画像が 1 つ生成されます。
基盤モデルのみで生成する
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
}
反復生成
Image Generator は、iterations 入力パラメータで定義されているように、各反復処理で生成された中間画像を出力することもできます。これらの途中結果を表示するには、setInputs メソッドを呼び出してから、execute() を呼び出して各ステップを実行します。showResult パラメータを true に設定すると、中間結果が表示されます。
fun execute(showResult: Boolean): Bitmap {
val result = imageGenerator.execute(showResult)
val bitmap =
BitmapExtractor.extract(result.generatedImage())
return bitmap
}
結果を処理して表示する
Image Generator は ImageGeneratorResult を返します。これには、生成された画像、完了時刻のタイムスタンプ、入力として条件画像が提供された場合は条件画像が含まれます。
val bitmap = BitmapExtractor.extract(result.generatedImage())
次の画像は、基盤モデルのみを使用して、次の入力から生成されました。
入力:
- プロンプト __: 「森の中を歩く杖を持った、だぶだぶのつば広帽子をかぶったカラフルな漫画のアライグマ、アニメーション、4 分の 3 ビュー、絵画」
- シード __: 312687592
- 反復 __: 20
生成された画像: