Найти в Дзене
КиберMamedov 💻🔥

Свой собственный генератор изображений на базе API нейросети Кандински

Оглавление

Какое же счастье, что теперь можно не просить вечно отказывающего знакомого дизайнера нарисовать какую-то нужную картинку, а воспользоваться нейросетями.

Но заходить на сайт и подготавливать изображения, которые будут использоваться в каких либо материалах - это одно, а вот интегрировать генерацию изображений в какие-то свои сервисы путем одного скрипта - это совсем другой подход.

Представляем вашему вниманию API от нейросети Кандински (Kandinsky).

Собственно её документация достаточно подробно описана и предоставляет готовый код.

Но в этом коде есть несколько незавершенных моментов, которые в данной статье я решу и отдам вам в пользование.

Регистрация и получение ключа

Давайте начнем с того, что в первую очередь вам необходимо зарегистрироваться на платформе Fusion Brain.

Нажмите на эту кнопку и все будет хорошо
Нажмите на эту кнопку и все будет хорошо

Регистрация достаточно простая, её описывать нет смысла.

После того как зарегистрируйтесь и войдете в учетную запись перед вами откроется редактор.

Редактор
Редактор

Здесь можно сгенерировать много разных картинок, но мы сюда зашли не для этого.

Нам необходимо сделать так, чтобы наш код мог генерировать картинки. Для этого нам необходимо получить ключ.

Нажми на эту кнопку
Нажми на эту кнопку

Нажав на соответствующую кнопку, ты попадешь в раздел по созданию секретных ключей.

Нажми на кнопку добавить ключ.
Нажми на кнопку добавить ключ.

Нажав на кнопку “Добавить ключ” ты получишь следующее окно:

Кликни по кнопкам по очереди.
Кликни по кнопкам по очереди.

Скопировав секретный ключ сразу вставь его в тот файл, где далее будешь писать код, т.к. больше его будет получить нельзя, придется генерировать новый.

В данной статье реализация будет на языке Python. Если хотите узнать, как реализовать на JavaScript, то читайте статью до конца.

А API ключ можно получить в любой момент.

Программный код

Теперь переходите на страницу документации и пролистайте до конца страницы, где представлен полный код.

Документация

Копируйте его и вставьте в свой файл.

import json
import time
import requests
class Text2ImageAPI:
def __init__(self, url, api_key, secret_key):
self.URL = url
self.AUTH_HEADERS = {
'X-Key': f'Key {api_key}',
'X-Secret': f'Secret {secret_key}',
}
def get_model(self):
response = requests.get(self.URL + 'key/api/v1/models',
headers=self.AUTH_HEADERS)
data = response.json()
return data[0]['id']
def generate(self, prompt, model, images=1, width=1024, height=1024):
params = {
"type": "GENERATE",
"numImages": images,
"width": width,
"height": height,
"generateParams": {
"query": f"{prompt}"
}
}
data = {
'model_id': (None, model),
'params': (None, json.dumps(params), 'application/json')
}
response = requests.post(self.URL + 'key/api/v1/text2image/run',
headers=self.AUTH_HEADERS, files=data)
data = response.json()
return data['uuid']
def check_generation(self, request_id, attempts=10, delay=10):
while attempts > 0:
response = requests.get(self.URL + 'key/api/v1/text2image/status/' +
request_id, headers=self.AUTH_HEADERS)
data = response.json()
if data['status'] == 'DONE':
return data['images']
attempts -= 1
time.sleep(delay)
if __name__ == '__main__':
api = Text2ImageAPI('https://api-key.fusionbrain.ai/', 'YOUR_API_KEY', 'YOUR_SECRET_KEY')
model_id = api.get_model()
uuid = api.generate("Sun in sky", model_id)
images = api.check_generation(uuid)
print(images)

Теперь переходи в эту строчку кода Text2ImageAPI('https://api-key.fusionbrain.ai/', 'YOUR_API_KEY', 'YOUR_SECRET_KEY') и вставь свой секретный ключ и API ключ, который ты можешь скопировать с той страницы, где создавал ключ.

Нажми кнопку скопировать
Нажми кнопку скопировать

Можешь запустить и увидеть, что в консоли ты получаешь набор символов, это картинка, но только не так ты её представлял.

Вот так выглядит твоё изображение.
Вот так выглядит твоё изображение.

Это первый нюанс, про который я говорил вначале статьи.

Преобразования из base64

Все дело в том, что сервис возвращает изображение закодированное в base64.

Наша задача его раскодировать, привести в бинарный вид и сохранить в файл.

Благо в Python есть библиотека, которая так и называется base64.

Подключим её вначале файла.

Подключи библиотеку, как на картинке
Подключи библиотеку, как на картинке

Теперь прокручиваемся в ту строчку, где это текст выводится, а за это отвечает команда print в конце кода.

print(images)

Давай вместо этого print напишем код, который будет преобразовывать код и сохранять в файл.

# Здесь image_base64 - это строка с данными изображения в формате base64

image_base64 = images[0] # Вставьте вашу строку base64 сюда

# Декодируем строку base64 в бинарные данные

image_data = base64.b64decode(image_base64)

# Открываем файл для записи бинарных данных изображения

with open("image.jpg", "wb") as file:

file.write(image_data)

Теперь запускай и смотри результат. У тебя рядом с программным файлом появился файл image.jpg.

Скрин из редактора VSCode, вы можете просто открыть папку, где сохранили код
Скрин из редактора VSCode, вы можете просто открыть папку, где сохранили код

Вот и результат.

Кстати, а ты не забудешь в итоге поставить лайк и написать комментарий к этой статье?
Результат.
Результат.

Вот и результат.

Работа с параметрами

А что же он нарисовал?

Нарисовал он солнце в небе.

Это можно понять из запроса, который доступен в этой строке.

Строка, в которой необходимо писать запрос на генерацию изображения
Строка, в которой необходимо писать запрос на генерацию изображения

Именно здесь необходимо писать текст, который будет генерироваться в изображение.

Можешь поэксперементировать разные варианты.

Но теперь мы подходим ко второму нюансу - это стиль изображений, в котором происходит генерация.

Он стоит по умолчанию, а API предоставляет 4 разных стиля.

Синим выделен стиль по умолчанию.
Синим выделен стиль по умолчанию.

Давайте это исправим. Сделаем так, чтобы мы могли указывать порядковый номер стиля, а он в свою очередь передавался в запросе.

В первую очередь определим список с названиями стилей и вставим его в метод generate, который отвечает за формирование запроса.

styles = [“KANDINSKY”, “UHD”, “ANIME”, “DEFAULT”]

Поместим код в метод generate и пропишем в методе дополнительный аргумент style, в который будет передаваться номер при вызове, но установим значение по умолчанию 3, т.е. стиль DEFAULT.

А также добавим этот параметр в запросы.

Переделай также.
Переделай также.

Теперь остается при вызове данного метода указывать номер стиля. Давай попробуем тот же запрос только в стиле аниме - это номер 2 в нашем списке стилей.

Укажи номер стиля при вызове метода generate иначе изображение всегда будет в стиле по умолчанию.
Укажи номер стиля при вызове метода generate иначе изображение всегда будет в стиле по умолчанию.

Запускай и проверяй результат.

Результат в стиле аниме.
Результат в стиле аниме.

Вот и анимешное солнце сгенерировано. Теперь ты можешь экспериментировать со стилями.

Можно еще добавить негативные запросы, которые не должны появляться, но я думаю ты уже понял принцип, здесь все просто.

Присоединяйся к моему каналу в Дзене, чтобы быть в курсе всех интересных нейросетей и работы с ними!

Статья, как сделать это на JavaScript. Там есть свои особенности решения: