适用于 Android 的图片生成指南

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

借助 MediaPipe 图片生成器任务,你可以根据文本提示生成图片。这个 使用文本到图像模型使用扩散技术生成图像。

任务接受文本提示和可选的条件图片 模型可以进行扩充并用作生成参考。图片生成器 也可以根据提供给模型的特定概念生成图像, 或再训练。有关详情,请参见使用 LoRA

您可在 GitHub 如需详细了解功能、模型和配置选项 部分,请参阅概览

代码示例

MediaPipe Tasks 示例代码是图像生成器的基本实现 Android 版应用。你可以从该应用着手打造自己的 Android 应用 应用,或者在修改现有应用时引用它。图片生成器示例 代码托管在 GitHub

下载代码

以下说明介绍了如何创建示例的本地副本 使用 git 命令行工具运行 git 代码库。

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

如需下载示例代码,请执行以下操作:

  1. 使用以下命令克隆 git 代码库:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. (可选)配置您的 git 实例以使用稀疏检出,这样您 只有图片生成器示例应用的文件:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generator/android
    

创建示例代码的本地版本后,您可以导入项目 进入 Android Studio 并运行应用。有关说明,请参阅适用于 Android 设备

关键组件

以下文件包含此图片生成示例的关键代码 应用:

设置

本部分介绍了设置开发环境和 专门用于图片生成器的编码项目。有关 设置开发环境以使用 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

生成的图片