Задача MediaPipe Image Generator позволяет создавать изображения на основе текстового запроса. В этой задаче используется модель преобразования текста в изображение для создания изображений с использованием методов диффузии.
Задача принимает в качестве входных данных текстовую подсказку, а также необязательное изображение условия, которое модель может дополнить и использовать в качестве ссылки для генерации. Генератор изображений также может генерировать изображения на основе конкретных концепций, предоставленных модели во время обучения или переобучения. Дополнительные сведения см. в разделе Настройка с помощью LoRA .
Пример кода, описанный в этой инструкции, доступен на GitHub . Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .
Пример кода
Пример кода задач MediaPipe — это базовая реализация приложения Image Generator для Android. Вы можете использовать это приложение в качестве отправной точки для своего собственного приложения для Android или обращаться к нему при изменении существующего приложения. Пример кода Image Generator размещен на 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 .
Зависимости
 Задача «Генератор изображений» использует библиотеку com.google.mediapipe:tasks-vision-image-generator . Добавьте эту зависимость в файл build.gradle вашего приложения Android:
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 см. в разделе «Модели» обзора задач.
Скачать модель фундамента
 Генератор изображений требует, чтобы базовая модель соответствовала формату модели 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, либо загружены по требованию. Модели плагинов имеют небольшой вес (около 23 МБ) и могут быть включены непосредственно в APK. Однако мы рекомендуем загружать модели плагинов по требованию.
Если вы настроили модель с помощью LoRA , загрузите ее по требованию. Дополнительные сведения см. в разделе Модель плагина весов LoRA.
Создать задачу
 Задача MediaPipe Image Generator использует функцию createFromOptions() для настройки задачи. Функция createFromOptions() принимает значения параметров конфигурации. Дополнительные сведения о параметрах конфигурации см. в разделе Параметры конфигурации .
Варианты конфигурации
Эта задача имеет следующие параметры конфигурации для приложений Android:
| Название опции | Описание | Диапазон значений | 
|---|---|---|
| imageGeneratorModelDirectory | Каталог модели генератора изображений, в котором хранятся веса модели. | PATH | 
| loraWeightsFilePath | Устанавливает путь к файлу весов LoRA. Необязательно и применимо только в том случае, если модель была настроена с помощью LoRA. | PATH | 
| errorListener | Устанавливает дополнительный прослушиватель ошибок. | N/A | 
Задача также поддерживает модели плагинов, которые позволяют пользователям включать изображения условий во входные данные задачи, которые базовая модель может дополнять и использовать в качестве эталона для генерации. Этими изображениями состояния могут быть ориентиры лиц, контуры краев и оценки глубины, которые модель использует в качестве дополнительного контекста и информации для создания изображений.
 При добавлении модели плагина к базовой модели также настройте параметры плагина. Плагин ориентира Face использует faceConditionOptions , плагин Canny Edge использует edgeConditionOptions , а плагин Depth использует depthConditionOptions .
Варианты канни-края
 Настройте следующие параметры в edgeConditionOptions .
| Название опции | Описание | Диапазон значений | Значение по умолчанию | 
|---|---|---|---|
| threshold1 | Первый порог для процедуры гистерезиса. | Float | 100 | 
| threshold2 | Второй порог для процедуры гистерезиса. | Float | 200 | 
| apertureSize | Размер апертуры для оператора Собеля. Типичный диапазон составляет от 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 | 
Дополнительную информацию о том, как работают эти параметры конфигурации, см. в задаче 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)
    Кэнни Эдж
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)
Подготовьте данные
Генератор изображений принимает следующие входные данные:
- подсказка (обязательно): текстовая подсказка, описывающая создаваемое изображение.
- итерации (обязательно): общее количество итераций для создания изображения. Хорошая отправная точка — 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 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
Сгенерированное изображение:
