Генерируем покемонов по описанию из Pokedex с помощью AI
Вы помните свою первую встречу с покемонами? Я помню, как этот мультсериал впервые рекламировали на Cartoon Network ещё в 1998 году. Тогда я был абсолютно загипнотизирован и увлечён этой вселенной. Одной мысли о том, что я отправляюсь в удивительное путешествие, имея этих милых и суперсильных существ, с которыми я мог бы подружиться и тренироваться, чтобы находить врагов разной силы, было достаточно, чтобы я каждый день после школы не мог оторваться от телевизора.
Во вселенной покемонов было много вещей, которые были мне интересны, но, возможно, одна из тех, которую я нашёл наиболее заманчивой – это Pokedex. Возможность иметь этот инструмент, который предоставил бы вам подробную информацию о покемоне, просто отсканировав его, была просто потрясающей! Довольно дико думать, что технологический прогресс с тех пор, по сути, позволил нам разрабатывать подобные вещи (например, очки дополненной реальности). Однажды у меня наконец-то появился доступ к видеоиграм в оригинальном цвете Game boy (Pokemon Blue была моей первой игрой). Я был так взволнован и полон решимости завершить свой Покедекс, потому что мне нравилось собирать информацию и использовать ее, чтобы лучше понять окружающий меня мир (вот почему я связал свою жизнь с этим).
Возможности, предоставляемые нам в области искусственного интеллекта, могут быть ошеломляющими, учитывая головокружительную скорость, с которой становятся доступными новые разработки. Одной из платформ / моделей, которая в последнее время привлекла большое внимание, является искусственный интеллект, который позволяет пользователям преобразовывать текстовые подсказки (в статье я буду называть промпты подсказками)в изображения. Воспользоваться ими может абсолютно любой человек! Я советую вам попробовать поиграться с ними!
В этой статье я покажу, как мы можем взять описания покемонов из записей Pokedex, найденных в разных играх франшизы Pokemon, и использовать их для создания сгенерированных искусственным интеллектом изображений этих покемонов с помощью Python! Я думаю, будет весело и даже интересно посмотреть, как искусственный интеллект интерпретирует покемонов.
https://t.me/vistehno – здесь мы выкладываем крутые новости и технологии из AI мира.
Шаг 1: Получение записей Pokedex
Первое, что мне понадобится для этого проекта – это способ получить описания Pokedex. Описания Pokedex будут служить подсказками, которые мы дадим нашему ИИ для создания рендеринга покемонов. Моей первоначальной мыслью было то, что мне придётся написать webscraper для pokemon.com. Это позволило бы выполнить поисковый запрос на основе National Pokedex Number (NPN). Это было бы не слишком сложно сделать, однако я нашел симпатичную маленькую библиотеку Python под названием PyPokedex, которая уже выполнила большую часть работы за меня. Это действительно хорошая библиотека, и у меня есть планы использовать её для будущих проектов. Я рекомендую вам ознакомиться с ней, если вы увлекаетесь программированием и покемонами!
PyPokedex использует PokeAPI для получения данных о покемонах. Мы можем получить всевозможную информацию о покемоне, используя Py Pokedex, такую как NPN, имя, рост, вес, тип (ы), статистика баз и набор перемещений среди прочего. В дополнение к этому, в PyPokedex также есть небольшой полезный метод под названием “get_descriptions
”, который возвращает описания Pokedex для каждой из различных игр в виде словаря.
Базовый запрос Py Pokedex выглядит следующим образом:
#Specify which Pokemon we want to query using its ID number
pokemon = pypokedex.get(dex=poke_id)
Всё, что делает этот запрос – это создаёт экземпляр объекта с именем pokemon
, который будет содержать всю информацию для данного покемона на основе его значения NPN. На данный момент я буду использовать это, чтобы получить имя покемона, так как я хочу включить его как часть подсказки, которую я дам ИИ позже.
#This is the name of the Pokemon we are querying
poke_name = pokemon.name
Далее я буду использовать метод get_descriptions
для получения описания Pokedex. Я также уточню, что хочу использовать описания, найденные в Pokedex из Pokemon Yellow, потому что это одна из моих любимых игр в серии
#This is the PokeDex desciption for the current Pokemon
yellow_description = pokemon.get_descriptions()[ver]
Затем я могу объединить эти два результата, чтобы создать подсказку, которую мы дадим ИИ следующим образом:
#This is the prompt I’ll feed to the AI
prompt = poke_name + " " + yellow_description
Я решил включить имя покемона как часть подсказки, потому что записи Pokedex для некоторых покемонов иногда довольно расплывчаты и не всегда дают результаты, которые мне нравятся. Включив имя покемона, я смог создать версии, которые больше походили на “истинные варианты” оригинального покемона. Это, скорее, личное предпочтение, но я доволен этими результатами.
Шаг 2: Настройка искусственного интеллекта
Теперь, когда у меня есть способ генерировать описания Pokedex и, таким образом, создавать подсказки, я готов настроить модель стабильной диффузии. Мы начинаем с установки необходимых пакетов со следующей строки:
%pip install — quiet — upgrade diffusers transformers accelerate mediapy scipy ftfy spacy
Далее нам нужно будет включить пакет xformers
, который поможет нам в создании наших изображений. Возможно, вам придется поискать подходящее колесо в зависимости от вашей версии Python и IDE.
# The xformers package is mandatory to be able to create several 768x768 images.
github_url = "https://github.com/brian6091/xformers-wheels"
xformer_id = "0.0.15.dev0+4c06c79"
xformers_wheels = f"xformers-{xformer_id}.d20221205-cp38-cp38-linux_x86_64.whl"
# Install xformers using pre-compiled Python wheels
%pip install -q {github_url}/releases/download/{xformer_id}/{xformers_wheels}
Теперь нам нужно определить, какую модель мы хотим использовать. Для этой работы я решил использовать модель dreamlike-photoreal-2.0.
import mediapy as media
import torch
from diffusers import StableDiffusionPipeline
device = "cuda"
if model_id.startswith("stabilityai/"):
model_revision = "fp16"
else:
model_revision = None
if scheduler is None:
pipe = StableDiffusionPipeline.from_pretrained(
model_id,
torch_dtype=torch.float16,
revision=model_revision,
)
else:
pipe = StableDiffusionPipeline.from_pretrained(
model_id,
scheduler=scheduler,
torch_dtype=torch.float16,
revision=model_revision,
)
pipe = pipe.to(device)
pipe.enable_xformers_memory_efficient_attention()
if model_id.endswith('-base'):
image_length = 512
else:
image_length = 768
И теперь я готов преобразовать подсказки Pokedex в изображения покемонов с помощью следующих нескольких строк кода:
remove_safety = False
num_images = 4
if remove_safety:
negative_prompt = None
else:
negative_prompt = "nude, naked"
images = pipe(
prompt,
height = image_length,
width = image_length,
num_inference_steps = 25,
guidance_scale = 9,
num_images_per_prompt = num_images,
negative_prompt = negative_prompt,
).images
media.show_images(images)
Шаг 3: Функция обёртки для запуска
С помощью того, что я показал, вы можете обработать один вариант на основе одного запроса Pokemon. Тем не менее, я хочу обработать все оригинальные 150 покемонов, и я не собираюсь печатать их всех, так как это было бы утомительно и раздражающе. Итак, я собираюсь написать быструю функцию обёртки, которая будет содержать процедуры, которые я показывал до сих пор.
def makePokemonFromPokedex(ver,nPokemon):
#Loop over nPokemons to get the descritptions and generate images for each
#poke_id = 1
for poke_id in range(1, nPokemon+1, 1):
#print(poke_id)
#Specify which Pokemon we want to query using its ID number
pokemon = pypokedex.get(dex=poke_id)
#print(pokemon)
#This is the name of the Pokemon we are querying
poke_name = pokemon.name
#This is the PokeDex desciption for the current Pokemon
yellow_description = pokemon.get_descriptions()[ver]
#This is the prompt I'll feed to the AI
prompt = poke_name + " " + yellow_description
#print(prompt)
remove_safety = False
num_images = 4
if remove_safety:
negative_prompt = None
else:
negative_prompt = "nude, naked"
images = pipe(
prompt,
height = image_length,
width = image_length,
num_inference_steps = 25,
guidance_scale = 9,
num_images_per_prompt = num_images,
negative_prompt = negative_prompt,
).images
fname = 'poke_' + str(poke_id)
get_concat_h_multi_blank(images).save(fname + '.jpg')
Идеально! Теперь я могу просто запустить эту процедуру и указать ей, для скольких покемонов нужно создать изображение. Эта процедура также может быть легко изменена для запроса определённого диапазона покемонов или для генерации подсказок только для покемонов с определенным ростом, весом и т.д. Может быть, я реализую это в будущем)
Результаты
Я собираюсь показать здесь результаты для нескольких покемонов, которые, на мой взгляд, были крутыми или интересными.
По-моему, это было довольно мило! Какие из изображений понравились вам больше всего? Что вы думаете о рендеринге искусственного интеллекта? Я надеюсь, вам понравился этот маленький проект. Мне было весело его реализовывать!
Как всегда, спасибо за чтение!