借助 MediaPipe Image Generator 任务,您可以根据文本提示生成图片。此任务使用文生图模型,通过扩散技术生成图片。
该任务接受文本提示作为输入,以及模型可以扩充并用作生成参考的可选条件图片。Image Generator 还可以根据训练或重新训练期间提供给模型的特定概念生成图片。如需了解详情,请参阅使用 LoRA进行自定义。
GitHub 上提供了这些说明中介绍的代码示例。 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 中或按需下载。插件模型非常轻巧(约 23MB),可以直接捆绑到 APK 中。不过,我们建议按需下载插件模型。
如果您使用 LoRA 自定义了模型, 请按需下载这些模型。如需了解更多 信息,请参阅 LoRA 权重 插件模型。
创建任务
MediaPipe Image Generator 任务使用 createFromOptions() 函数来设置任务。createFromOptions()
函数接受配置选项的值。如需详细了解配置选项,请参阅Configuration
options。
配置选项
此任务具有以下 Android 应用的配置选项:
| 选项名称 | 说明 | 值范围 |
|---|---|---|
imageGeneratorModelDirectory |
存储模型权重的图片生成器模型目录。 | PATH |
loraWeightsFilePath |
设置 LoRA 权重文件的路径。可选,仅在 模型使用 LoRA 进行自定义时适用。 | PATH |
errorListener |
设置可选的错误监听器。 | N/A |
该任务还支持插件模型,使用户能够在任务输入中添加条件图片,基础模型可以扩充这些图片并将其用作生成参考。这些条件图片可以是人脸特征点、边缘轮廓和深度估计,模型会将这些图片用作额外的上下文和信息来生成图片。
向基础模型添加插件模型时,还要配置插件选项。人脸特征点插件使用 faceConditionOptions,Canny 边缘插件使用 edgeConditionOptions,深度插件使用 depthConditionOptions。
Canny 边缘选项
在 edgeConditionOptions 中配置以下选项。
| 选项名称 | 说明 | 值范围 | 默认值 |
|---|---|---|---|
threshold1 |
滞后过程的第一个阈值。 | Float |
100 |
threshold2 |
滞后过程的第二个阈值。 | 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)
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 接受以下输入:
- 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
}
迭代生成
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())
以下图片是仅使用基础模型,通过以下输入生成的。
输入:
- 提示:“一只色彩鲜艳的卡通浣熊,戴着一顶软软的宽边帽 拿着一根棍子在森林中行走,动画,四分之三视角, 绘画”
- 种子:312687592
- 迭代次数:20
生成的图片: