借助 MediaPipe 图片生成器任务,你可以根据文本提示生成图片。这个 使用文本到图像模型使用扩散技术生成图像。
任务接受文本提示和可选的条件图片 模型可以进行扩充并用作生成参考。图片生成器 也可以根据提供给模型的特定概念生成图像, 或再训练。有关详情,请参见使用 LoRA。
您可在 GitHub 如需详细了解功能、模型和配置选项 部分,请参阅概览。
代码示例
MediaPipe Tasks 示例代码是图像生成器的基本实现 Android 版应用。你可以从该应用着手打造自己的 Android 应用 应用,或者在修改现有应用时引用它。图片生成器示例 代码托管在 GitHub
下载代码
以下说明介绍了如何创建示例的本地副本 使用 git 命令行工具运行 git 代码库。
<ph type="x-smartling-placeholder">如需下载示例代码,请执行以下操作:
- 使用以下命令克隆 git 代码库:
git clone https://github.com/google-ai-edge/mediapipe-samples
- (可选)配置您的 git 实例以使用稀疏检出,这样您
只有图片生成器示例应用的文件:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/image_generator/android
创建示例代码的本地版本后,您可以导入项目 进入 Android Studio 并运行应用。有关说明,请参阅适用于 Android 设备。
关键组件
以下文件包含此图片生成示例的关键代码 应用:
- ImageGenerationHelper.kt: 初始化任务并处理图片生成。
- DiffusionActivity.kt: 在未启用插件或 LoRA 权重时生成图片。
- PluginActivity.kt: 实现插件模型,从而让用户能够提供条件 作为输入。
- LoRAWeightActivity.kt: 访问和处理用于自定义基础的 LoRA 权重 并使它们能够生成特定概念的图像。
设置
本部分介绍了设置开发环境和 专门用于图片生成器的编码项目。有关 设置开发环境以使用 MediaPipe 任务,包括 平台版本要求,请参阅适用于 Android 设备。
<ph type="x-smartling-placeholder">依赖项
图片生成器任务使用
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 设备。
如需详细了解适用于图片生成器的经过训练的模型,请参阅 概览模型部分。
下载基础模型
图片生成器要求基础模型与
runwayml/stable-diffusion-v1-5 EMA-only
模型格式,基于以下内容:
模型:
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 中或按需下载。插件模型 是轻量级(约 23MB),可以直接捆绑在 APK 中。不过,我们 建议按需下载插件模型。
如果您已使用 LoRA、 按需下载。有关 相关信息,请参阅 LoRA 权重插件模型。
创建任务
MediaPipe 图片生成器任务使用 createFromOptions()
函数来设置
任务。createFromOptions()
函数接受配置的值
选项。如需详细了解配置选项,请参阅配置选项
选项。
配置选项
此任务具有以下适用于 Android 应用的配置选项:
选项名称 | 说明 | 值范围 |
---|---|---|
imageGeneratorModelDirectory |
存储模型权重的图片生成器模型目录。 | PATH |
loraWeightsFilePath |
设置 LoRA 权重文件的路径。可选,且仅在 模型是使用 LoRA 定制的。 | PATH |
errorListener |
设置一个可选的错误监听器。 | N/A |
此任务还支持插件模型,让用户可以添加条件图片 在任务输入中,基础模型可以对其进行扩充,并将其用作参考 进行训练。这些条件图像可以是人脸特征点、边缘轮廓和 深度估算,模型将其用作额外的上下文和信息, 生成图像。
将插件模型添加到基础模型时,还需要配置插件
选项。人脸特征点插件使用 faceConditionOptions
(Canny 边缘)
插件使用 edgeConditionOptions
,而 Depth 插件使用
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 Edge
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(必需):用于描述要生成的图片的文本提示。
- 迭代次数(必需):生成图片所需的总迭代次数。答 最好从 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())
下面的图片根据以下输入生成,仅使用 基础模型。
输入内容:
- 提示:“一只彩色卡通浣熊戴着松软的宽檐帽 拿着一根棍子走过森林,动画展示了它四分之三的景象, 绘画"
- 种子:312687592
- 迭代:20
生成的图片: