Генерируем покемонов по описанию из 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')

Идеально! Теперь я могу просто запустить эту процедуру и указать ей, для скольких покемонов нужно создать изображение. Эта процедура также может быть легко изменена для запроса определённого диапазона покемонов или для генерации подсказок только для покемонов с определенным ростом, весом и т.д. Может быть, я реализую это в будущем)

Результаты

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

Генерируем покемонов по описанию из Pokedex с помощью AI
Metapod — Подсказка была такова: “Он ждёт момента, чтобы эволюционировать. На этой стадии он может только затвердеть, поэтому остается неподвижным, чтобы избежать атаки”.
Генерируем покемонов по описанию из Pokedex с помощью AI
Weedle – Подсказка была такова— “Остерегайтесь острого жала на его голове. Он прячется в траве и кустах, где питается листьями”.
Генерируем покемонов по описанию из Pokedex с помощью AI
Beedrill – Подсказка была такова: “У него три ядовитых жала на передних лапах и хвосте. Они используются для того, чтобы неоднократно наносить удары своему врагу”.
Генерируем покемонов по описанию из Pokedex с помощью AI
Ekans – Подсказка была такова: “Чем старше он становится, тем больше он растет. Ночью он обвивает своим длинным телом ветви деревьев, чтобы отдохнуть”.
Генерируем покемонов по описанию из Pokedex с помощью AI
Sandshrew – Подсказка для этого такова: “Он любит купаться в песке сухих песчаных местностей. Купаясь в песке, покемон очищает себя от грязи и влаги, прилипших к его телу.”
Генерируем покемонов по описанию из Pokedex с помощью AI
Sandslach – Подсказка была такова: “Чем суше местность, в которой живет Сэндслэш, тем твёрже и гладче будут шипы покемона при прикосновении”.
Генерируем покемонов по описанию из Pokedex с помощью AI
Nidorino – Подсказка была такова: “С рогом, который твёрже алмаза, этот покемон ходит вокруг, разбивая валуны в поисках лунного камня”.
Генерируем покемонов по описанию из Pokedex с помощью AI
Ninetales – Подсказка была такова: “Говорят, что он живет 1000 лет, и каждый из его хвостов наделен сверхъестественными способностями”.
Генерируем покемонов по описанию из Pokedex с помощью AI
Oddish – Подсказка была такова: “Если подвергнуть его воздействию лунного света, он начинает двигаться. Ночью он бродит повсюду, чтобы разбросать свои семена”.
Генерируем покемонов по описанию из Pokedex с помощью AI
Diglett – Подсказка была такова: “Если Диглет перекапывает поле, он оставляет почву идеально обработанной и идеальной для посадки сельскохозяйственных культур”.
Генерируем покемонов по описанию из Pokedex с помощью AI
Poliwag – Подсказка была такова: “Для Поливага плавать легче, чем ходить. Вихревой узор на его брюхе на самом деле является частью внутренностей покемона, просвечивающих сквозь кожу ”.
Генерируем покемонов по описанию из Pokedex с помощью AI
Tenacruel – Подсказка была такова: “Когда шары на голове Тентакруэля ярко засветятся, будьте осторожны. Покемон вот-вот выпустит серию ультразвуковых волн”.

По-моему, это было довольно мило! Какие из изображений понравились вам больше всего? Что вы думаете о рендеринге искусственного интеллекта? Я надеюсь, вам понравился этот маленький проект. Мне было весело его реализовывать!

Как всегда, спасибо за чтение!

+1
2
+1
1
+1
0
+1
1
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *