Физтех.Статистика
Скачать ipynb
Введение в анализ данных¶
Компьютерное зрение & генеративные модели¶
Ранее мы рассмотрели задачу классификации с помощью сверточных нейронных сетей.
В этом ноутбуке приведены примеры обученных сетей для переноса стиля и генерации изображений по промпту. На лекции были рассказаны основные моменты работы этих методов. Это ознакомительный ноутбук, призванный продемонстрировать некоторые продвижения в компьютерном зрении за последние несколько лет.
Чтобы все корректно отработало, этот ноутбук, как и в прошлый раз, нужно запускать в той среде, где есть графический процессор GPU. Бесплатно воспользоваться GPU можно в Google Colab и Kaggle. Однако учтите, что на данный момент доступ к GPU ограничен работой в несколько часов в сутки. Для того, чтобы подключиться к GPU в Colab, зайдите в меню Среда выполнения
, выберите опцию Сменить среду выполнения
. В списке аппаратных ускорителей выберите GPU.
import os
import seaborn as sns
from pathlib import Path
import matplotlib.pyplot as plt
sns.set(palette="Set2")
2. Нейросетевой перенос стиля¶
Рассмотрим задачу переноса стиля с одной картинки на другую и ее решение, основанное на свойствах сверточных нейронных сетей. Возьмем реализацию метода Neural Style Transfer, описанного в статье, из репозитория. Склонируем репозиторий и заимпортируем необходимые файлы.
!git clone https://github.com/nazianafis/Neural-Style-Transfer
# Перейдем в директорию скачанного репозитория
%cd /content/Neural-Style-Transfer/
# Небольшая обработка скрипта, не менять!
file_path = "NST.py"
with open(file_path, "r") as file:
# Убираем автоматический запуск
lines = file.readlines()[:183]
# Вывод логов только каждые 100 эпох
lines = lines[:175] + [" if cnt % 100 == 0:\n"] + lines[175:]
lines[176] = " " + lines[176]
with open(file_path, "w") as file:
file.writelines(lines)
from NST import *
Cloning into 'Neural-Style-Transfer'... remote: Enumerating objects: 379, done. remote: Counting objects: 100% (154/154), done. remote: Compressing objects: 100% (119/119), done. remote: Total 379 (delta 72), reused 105 (delta 34), pack-reused 225 Receiving objects: 100% (379/379), 92.21 MiB | 14.34 MiB/s, done. Resolving deltas: 100% (143/143), done. /content/Neural-Style-Transfer
Как работает метод мы разбирали на лекции.
Идея. Хотим оптимизировать картинку $\overrightarrow{x}$ так, чтобы:
- Content Features $\overrightarrow{x}$ были близки к Content Features картинки контента;
- Style Features $\overrightarrow{x}$ были близки к Style Features картинки стиля.
В данной реализации:
- Инициализируем $\overrightarrow{x}$ картинкой контента и постепенно добавляем в нее нужный стиль.
- Задаем лосс близости контента и лосс близости стиля. Они используют предобученную сверточную нейросеть VGG19 как экстрактор признаков, ее веса не изменяются.
- Оптимизируем $\overrightarrow{x}$ с помощью L-BFGS — метода оптимизации (ускорение градиентного спуска), подробнее о нем будет на методах оптимизации на 3 курсе.
Выделение признаков:
Сontent features. Выходы глубоких слоев сверточной нейросети хранят высокоуровневую информацию про изображенные объекты.
Style features — матрицы Грама по выходам слоев CNN, где начальные слои представляют мелкие текстуры, а более глубокие — особенности стиля художника.
Q: Зачем матрица Грама, разве выделение локальных зависимостей — не задача свертки?
A: Выход сверточного слоя — признаковое представление картинки, отражающее степень содержания паттернов, описываемых ядрами сверток. Для выделения стиля полезно смотреть на корреляцию (степень зависимости) этих признаков. В некотором смысле стиль — совокупность паттернов и их взаимодействие. А матрица Грама как раз выражает корреляцию каждого признака с каждым, но, как вы правильно заметили, сильно увеличивает масштабы вычислений.
Напишем функцию для запуска метода для заданной картинки контента и стиля, а также функцию визуализации результатов.
def run_neural_style_transfer(content_image="c1.jpg", style_image="s1.jpg"):
"""
Функция для запуска метода Neural Style Transfer.
:param content_image: имя файла картинки контента
:param style_image: имя файла картинки стиля
:return: results_path -- путь к папке, в которую сохранился результат
"""
PATH = ""
default_resource_dir = os.path.join(PATH, "data")
content_images_dir = os.path.join(default_resource_dir, "content-images")
style_images_dir = os.path.join(default_resource_dir, "style-images")
output_img_dir = os.path.join(default_resource_dir, "output-images")
img_format = (4, ".jpg")
# Задаем конфиги, включая вес компонент лосса
optimization_config = {
"content_img_name": content_image,
"style_img_name": style_image,
"height": 400,
"content_weight": 100000.0,
"style_weight": 30000.0,
"tv_weight": 1.0,
}
optimization_config["content_images_dir"] = content_images_dir
optimization_config["style_images_dir"] = style_images_dir
optimization_config["output_img_dir"] = output_img_dir
optimization_config["img_format"] = img_format
results_path = neural_style_transfer(optimization_config)
return results_path
def visualize_style_transfer(content_image, style_image, results_path):
"""
Визуализация результатов.
:param content_image: имя файла картинки контента
:param style_image: имя файла картинки стиля
:param results_path: путь к папке, в которую сохранился результат
"""
if len(os.listdir(results_path)) == 0:
return
plt.figure(figsize=(13, 3))
folders = [
"content-images/",
"output-images/" + Path(results_path).name + "/",
"style-images/",
]
combined_image = (
Path(content_image).stem + "_" + Path(style_image).stem + ".jpg"
)
files = [content_image, combined_image, style_image]
titles = ["Контент", "Результат", "Стиль"]
for i in range(3):
plt.subplot(1, 3, i + 1)
plt.imshow(plt.imread("data/" + folders[i] + files[i]))
plt.title(titles[i])
plt.xticks([])
plt.yticks([])
Запустим Neural Style Transfer на парах контент-стиль, доступных в репозитории. Картинки-примеры лежат в data/content-images
и data/style-images
соответственно. Результаты сохраняются в data/output-images/combined_<content_img>_<style_img>/<content_img>_<style_img>.jpg
.
content_images = sorted(os.listdir("data/content-images"))
style_images = sorted(os.listdir("data/style-images"))
result_paths = []
for content_image, style_image in zip(content_images, style_images):
results_path = run_neural_style_transfer(content_image, style_image)
result_paths.append(results_path)
/usr/local/lib/python3.10/dist-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead. warnings.warn( /usr/local/lib/python3.10/dist-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=VGG19_Weights.IMAGENET1K_V1`. You can also use `weights=VGG19_Weights.DEFAULT` to get the most up-to-date weights. warnings.warn(msg)
Using VGG19 in the optimization procedure. L-BFGS | iteration: 000, total loss=3446674817024.0000, content_loss= 0.0000, style loss=3446667600000.0000, tv loss=7292746.0000 L-BFGS | iteration: 100, total loss=36545269760.0000, content_loss=1636035644.5312, style loss=34891616250.0000, tv loss=17615628.0000 L-BFGS | iteration: 200, total loss=11921997824.0000, content_loss=1652365625.0000, style loss=10250455312.5000, tv loss=19177282.0000 L-BFGS | iteration: 300, total loss=7036205568.0000, content_loss=1648760351.5625, style loss=5368206562.5000, tv loss=19238864.0000 L-BFGS | iteration: 400, total loss=5205744128.0000, content_loss=1640404687.5000, style loss=3546391171.8750, tv loss=18947876.0000 L-BFGS | iteration: 500, total loss=4413362176.0000, content_loss=1627640234.3750, style loss=2767006406.2500, tv loss=18715636.0000 L-BFGS | iteration: 600, total loss=3994198528.0000, content_loss=1615958691.4062, style loss=2359643203.1250, tv loss=18596980.0000 L-BFGS | iteration: 700, total loss=3734805760.0000, content_loss=1603115527.3438, style loss=2113161562.5000, tv loss=18528570.0000 L-BFGS | iteration: 800, total loss=3555087872.0000, content_loss=1591160742.1875, style loss=1945416210.9375, tv loss=18510824.0000 L-BFGS | iteration: 900, total loss=3416918272.0000, content_loss=1581310839.8438, style loss=1817070000.0000, tv loss=18537596.0000 L-BFGS | iteration: 1000, total loss=3312789760.0000, content_loss=1572570996.0938, style loss=1721618437.5000, tv loss=18600136.0000 Using VGG19 in the optimization procedure. L-BFGS | iteration: 000, total loss=11997666082816.0000, content_loss= 0.0000, style loss=11997665280000.0000, tv loss=1385193.0000 L-BFGS | iteration: 100, total loss=13115474944.0000, content_loss=1575101367.1875, style loss=11502725625.0000, tv loss=37647888.0000 L-BFGS | iteration: 200, total loss=4672230400.0000, content_loss=1514814550.7812, style loss=3115721250.0000, tv loss=41694832.0000 L-BFGS | iteration: 300, total loss=3249261056.0000, content_loss=1465064746.0938, style loss=1740253476.5625, tv loss=43943024.0000 L-BFGS | iteration: 400, total loss=2703843328.0000, content_loss=1425714160.1562, style loss=1232585507.8125, tv loss=45543648.0000 L-BFGS | iteration: 500, total loss=2434893568.0000, content_loss=1393794824.2188, style loss=994457226.5625, tv loss=46641420.0000 L-BFGS | iteration: 600, total loss=2279518720.0000, content_loss=1368256933.5938, style loss=863873144.5312, tv loss=47388748.0000 L-BFGS | iteration: 700, total loss=2176390912.0000, content_loss=1346918750.0000, style loss=781506035.1562, tv loss=47966200.0000 L-BFGS | iteration: 800, total loss=2103154048.0000, content_loss=1330168750.0000, style loss=724612910.1562, tv loss=48372392.0000 L-BFGS | iteration: 900, total loss=2051134976.0000, content_loss=1317141308.5938, style loss=685334824.2188, tv loss=48658900.0000 L-BFGS | iteration: 1000, total loss=2009840768.0000, content_loss=1305658886.7188, style loss=655317714.8438, tv loss=48864164.0000 Using VGG19 in the optimization procedure. L-BFGS | iteration: 000, total loss=5273057492992.0000, content_loss= 0.0000, style loss=5273050560000.0000, tv loss=6960354.0000 Using VGG19 in the optimization procedure. L-BFGS | iteration: 000, total loss=444431302656.0000, content_loss= 0.0000, style loss=444426870000.0000, tv loss=4424529.0000 L-BFGS | iteration: 100, total loss=1352650624.0000, content_loss=772381738.2812, style loss=557559960.9375, tv loss=22708902.0000 L-BFGS | iteration: 200, total loss=927935168.0000, content_loss=666212988.2812, style loss=240798750.0000, tv loss=20923466.0000 L-BFGS | iteration: 300, total loss=824836736.0000, content_loss=624409570.3125, style loss=181657368.1641, tv loss=18769770.0000 L-BFGS | iteration: 400, total loss=773977408.0000, content_loss=600071777.3438, style loss=157143090.8203, tv loss=16762471.0000 L-BFGS | iteration: 500, total loss=746054528.0000, content_loss=585927148.4375, style loss=144878466.7969, tv loss=15248924.0000 L-BFGS | iteration: 600, total loss=729051136.0000, content_loss=576800195.3125, style loss=137999311.5234, tv loss=14251665.0000 L-BFGS | iteration: 700, total loss=717764672.0000, content_loss=570511523.4375, style loss=133622402.3438, tv loss=13630727.0000 L-BFGS | iteration: 800, total loss=710304064.0000, content_loss=565828759.7656, style loss=131205629.8828, tv loss=13269675.0000 L-BFGS | iteration: 900, total loss=705184960.0000, content_loss=562691894.5312, style loss=129458715.8203, tv loss=13034339.0000 L-BFGS | iteration: 1000, total loss=701642816.0000, content_loss=560543408.2031, style loss=128230063.4766, tv loss=12869339.0000 Using VGG19 in the optimization procedure. L-BFGS | iteration: 000, total loss=278622928896.0000, content_loss= 0.0000, style loss=278611650000.0000, tv loss=11262601.0000 L-BFGS | iteration: 100, total loss=5382811136.0000, content_loss=576838818.3594, style loss=4792199062.5000, tv loss=13773154.0000 L-BFGS | iteration: 200, total loss=1557859712.0000, content_loss=557504394.5312, style loss=985689375.0000, tv loss=14665967.0000 L-BFGS | iteration: 300, total loss=1022564608.0000, content_loss=521756054.6875, style loss=486433740.2344, tv loss=14374810.0000 L-BFGS | iteration: 400, total loss=816369792.0000, content_loss=498498925.7812, style loss=303496787.1094, tv loss=14374097.0000 L-BFGS | iteration: 500, total loss=736841792.0000, content_loss=484446386.7188, style loss=238206679.6875, tv loss=14188733.0000 L-BFGS | iteration: 600, total loss=698386688.0000, content_loss=474832470.7031, style loss=209693159.1797, tv loss=13861061.0000 L-BFGS | iteration: 700, total loss=675974400.0000, content_loss=468174316.4062, style loss=194242895.5078, tv loss=13557195.0000 L-BFGS | iteration: 800, total loss=660216640.0000, content_loss=463156689.4531, style loss=183744448.2422, tv loss=13315493.0000 L-BFGS | iteration: 900, total loss=649254400.0000, content_loss=459336767.5781, style loss=176767836.9141, tv loss=13149842.0000 L-BFGS | iteration: 1000, total loss=640705152.0000, content_loss=456254248.0469, style loss=171415356.4453, tv loss=13035504.0000 Using VGG19 in the optimization procedure. L-BFGS | iteration: 000, total loss=903369261056.0000, content_loss= 0.0000, style loss=903366240000.0000, tv loss=2991186.0000 L-BFGS | iteration: 100, total loss=29200771072.0000, content_loss=885201464.8438, style loss=28309640625.0000, tv loss=5929405.5000 L-BFGS | iteration: 200, total loss=6572710400.0000, content_loss=998418847.6562, style loss=5566220625.0000, tv loss=8070559.0000 L-BFGS | iteration: 300, total loss=3120206336.0000, content_loss=984832226.5625, style loss=2127471328.1250, tv loss=7902820.5000 L-BFGS | iteration: 400, total loss=2409276928.0000, content_loss=969420019.5312, style loss=1431975234.3750, tv loss=7881726.0000 L-BFGS | iteration: 500, total loss=2078447104.0000, content_loss=955389648.4375, style loss=1115086640.6250, tv loss=7970847.0000 L-BFGS | iteration: 600, total loss=1908204672.0000, content_loss=941749804.6875, style loss=958418730.4688, tv loss=8036112.0000 L-BFGS | iteration: 700, total loss=1813783808.0000, content_loss=931931835.9375, style loss=873780937.5000, tv loss=8071047.0000 L-BFGS | iteration: 800, total loss=1754478208.0000, content_loss=923950000.0000, style loss=822423867.1875, tv loss=8104305.0000 L-BFGS | iteration: 900, total loss=1713480320.0000, content_loss=918448925.7812, style loss=786893085.9375, tv loss=8138319.0000 L-BFGS | iteration: 1000, total loss=1682264448.0000, content_loss=913685058.5938, style loss=760401738.2812, tv loss=8177604.0000
Пояснение логов: на каждой 100-ой итерации выводится лосс: total loss; его составляющие content loss, style loss; и tv loss (total variation) – некоторая регуляризация для улучшения структуры картинки.
Выведем полученные картинки:
for content_image, style_image, results_path in zip(
content_images, style_images, result_paths
):
visualize_style_transfer(content_image, style_image, results_path)
Мы успешно перенесли стиль с правой картинки на контент левой и получили необычные результаты.
Попробуем применить перенос стиля на своих картинках. Для этого можно подключить Google Диск к файлам среды Google Colab. Загрузите файлы на диск, обновите меню файлов слева, и увидите их в content/drive
.
# подключим Google Drive
from google.colab import drive
drive.mount("/content/drive")
# пути к нужным папкам в Drive
content_path = "/content/drive/MyDrive/DS/style_transfer_images/content"
style_path = "/content/drive/MyDrive/DS/style_transfer_images/style"
# очистим предыдущие картинки, скопируем новые
!rm -r data/content-images
!mkdir data/content-images
!cp -a /$content_path/. data/content-images/
!rm -r data/style-images
!mkdir data/style-images
!cp -a /$style_path/. data/style-images/
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
Запустим и посмотрим, что получится:
content_images = sorted(os.listdir("data/content-images"))
style_images = sorted(os.listdir("data/style-images"))
result_paths = []
for content_image, style_image in zip(content_images, style_images):
results_path = run_neural_style_transfer(content_image, style_image)
result_paths.append(results_path)
Using VGG19 in the optimization procedure. L-BFGS | iteration: 000, total loss=951764320256.0000, content_loss= 0.0000, style loss=951746580000.0000, tv loss=17784880.0000 L-BFGS | iteration: 100, total loss=3000761088.0000, content_loss=1021630273.4375, style loss=1939623750.0000, tv loss=39506920.0000 L-BFGS | iteration: 200, total loss=1648944896.0000, content_loss=925682128.9062, style loss=682582675.7812, tv loss=40680200.0000 L-BFGS | iteration: 300, total loss=1358226688.0000, content_loss=863602539.0625, style loss=453543896.4844, tv loss=41080144.0000 L-BFGS | iteration: 400, total loss=1244255872.0000, content_loss=828277636.7188, style loss=374861865.2344, tv loss=41116412.0000 L-BFGS | iteration: 500, total loss=1182209920.0000, content_loss=804843310.5469, style loss=336351298.8281, tv loss=41015240.0000 L-BFGS | iteration: 600, total loss=1143759104.0000, content_loss=788581005.8594, style loss=314325322.2656, tv loss=40852712.0000 L-BFGS | iteration: 700, total loss=1116899712.0000, content_loss=776487841.7969, style loss=299742978.5156, tv loss=40668804.0000 L-BFGS | iteration: 800, total loss=1097843840.0000, content_loss=768284619.1406, style loss=289046689.4531, tv loss=40512528.0000 L-BFGS | iteration: 900, total loss=1083036928.0000, content_loss=761707763.6719, style loss=280974755.8594, tv loss=40354380.0000 L-BFGS | iteration: 1000, total loss=1071727040.0000, content_loss=756704345.7031, style loss=274824814.4531, tv loss=40197940.0000 Using VGG19 in the optimization procedure. L-BFGS | iteration: 000, total loss=2997639446528.0000, content_loss= 0.0000, style loss=2997616080000.0000, tv loss=23310342.0000 L-BFGS | iteration: 100, total loss=7115043840.0000, content_loss=2474382031.2500, style loss=4605689062.5000, tv loss=34972816.0000 L-BFGS | iteration: 200, total loss=4868994048.0000, content_loss=2367574804.6875, style loss=2465299453.1250, tv loss=36119584.0000 L-BFGS | iteration: 300, total loss=4269140992.0000, content_loss=2298016796.8750, style loss=1934330976.5625, tv loss=36793292.0000 L-BFGS | iteration: 400, total loss=3988312576.0000, content_loss=2251633007.8125, style loss=1699445507.8125, tv loss=37234076.0000 L-BFGS | iteration: 500, total loss=3824046336.0000, content_loss=2219921484.3750, style loss=1566597421.8750, tv loss=37527608.0000 L-BFGS | iteration: 600, total loss=3718422016.0000, content_loss=2196760742.1875, style loss=1483916484.3750, tv loss=37744720.0000 L-BFGS | iteration: 700, total loss=3643614720.0000, content_loss=2178483398.4375, style loss=1427200546.8750, tv loss=37930768.0000 L-BFGS | iteration: 800, total loss=3588964608.0000, content_loss=2164393359.3750, style loss=1386471796.8750, tv loss=38099224.0000 L-BFGS | iteration: 900, total loss=3545565440.0000, content_loss=2153188281.2500, style loss=1354139648.4375, tv loss=38237388.0000 L-BFGS | iteration: 1000, total loss=3511093504.0000, content_loss=2144098828.1250, style loss=1328638359.3750, tv loss=38356236.0000 Using VGG19 in the optimization procedure. L-BFGS | iteration: 000, total loss=4883807731712.0000, content_loss= 0.0000, style loss=4883785920000.0000, tv loss=22038304.0000 L-BFGS | iteration: 100, total loss=12774153216.0000, content_loss=2611515820.3125, style loss=10122080625.0000, tv loss=40557988.0000 L-BFGS | iteration: 200, total loss=6340702720.0000, content_loss=2525504882.8125, style loss=3772573125.0000, tv loss=42624376.0000 L-BFGS | iteration: 300, total loss=4932108288.0000, content_loss=2441932812.5000, style loss=2446583437.5000, tv loss=43591816.0000 L-BFGS | iteration: 400, total loss=4326545920.0000, content_loss=2380906640.6250, style loss=1901389921.8750, tv loss=44249336.0000 L-BFGS | iteration: 500, total loss=3979491328.0000, content_loss=2335890039.0625, style loss=1598844023.4375, tv loss=44757376.0000 L-BFGS | iteration: 600, total loss=3764689920.0000, content_loss=2300800000.0000, style loss=1418788359.3750, tv loss=45101616.0000 L-BFGS | iteration: 700, total loss=3615907584.0000, content_loss=2273895507.8125, style loss=1296713085.9375, tv loss=45299000.0000 L-BFGS | iteration: 800, total loss=3508451584.0000, content_loss=2250956445.3125, style loss=1212083320.3125, tv loss=45411536.0000 L-BFGS | iteration: 900, total loss=3428905984.0000, content_loss=2232491210.9375, style loss=1150955039.0625, tv loss=45459740.0000 L-BFGS | iteration: 1000, total loss=3366068224.0000, content_loss=2217284570.3125, style loss=1103314687.5000, tv loss=45468892.0000 Using VGG19 in the optimization procedure. L-BFGS | iteration: 000, total loss=5146914848768.0000, content_loss= 0.0000, style loss=5146897440000.0000, tv loss=17441590.0000 L-BFGS | iteration: 100, total loss=97621319680.0000, content_loss=3216366796.8750, style loss=94376392500.0000, tv loss=28560512.0000 L-BFGS | iteration: 200, total loss=31281483776.0000, content_loss=3256056835.9375, style loss=27996470625.0000, tv loss=28953982.0000 L-BFGS | iteration: 300, total loss=14656659456.0000, content_loss=3268785546.8750, style loss=11359070625.0000, tv loss=28802968.0000 L-BFGS | iteration: 400, total loss=9275234304.0000, content_loss=3267282226.5625, style loss=5979250312.5000, tv loss=28701944.0000 L-BFGS | iteration: 500, total loss=7155175424.0000, content_loss=3250802929.6875, style loss=3875898750.0000, tv loss=28473836.0000 L-BFGS | iteration: 600, total loss=6092583424.0000, content_loss=3238119726.5625, style loss=2826218671.8750, tv loss=28244948.0000 L-BFGS | iteration: 700, total loss=5451201024.0000, content_loss=3222942773.4375, style loss=2200143515.6250, tv loss=28114406.0000 L-BFGS | iteration: 800, total loss=5025047040.0000, content_loss=3207201757.8125, style loss=1789825312.5000, tv loss=28020074.0000 L-BFGS | iteration: 900, total loss=4729344000.0000, content_loss=3193596679.6875, style loss=1507825781.2500, tv loss=27921448.0000 L-BFGS | iteration: 1000, total loss=4517608960.0000, content_loss=3180410546.8750, style loss=1309397460.9375, tv loss=27801096.0000
# Сохраним результаты
!cp -r data/output-images /content/drive/MyDrive/DS
# Визуализируем
for content_image, style_image, results_path in zip(
content_images, style_images, result_paths
):
visualize_style_transfer(content_image, style_image, results_path)
3. Диффузионные модели¶
За последние несколько лет выложено множество разных диффузионных моделей, обладающих State-of-the-Art способностями генерации изображений: Stable Diffusion, SDXL, Kandisnky, YandexART, Fooocus, ControlNet. В этом ноутбуке мы опробуем SDXL Turbo: A Real-Time Text-to-Image Generation Model, вышедшую в 2023 году. SDXL Turbo основан на новой технологии дистилляции, которая позволяет модели синтезировать выходные данные изображения за один шаг и генерировать выходные данные преобразования текста в изображение в реальном времени, сохраняя при этом высокую точность выборки.
Сначала установим библиотеку diffusers
, в которой реализовано большинство из этих моделей.
!pip install -q diffusers
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.9/1.9 MB 14.1 MB/s eta 0:00:00
Создадим pipeline с нужной моделью и перенесем на CUDA.
from diffusers import AutoPipelineForText2Image
import torch
pipe = AutoPipelineForText2Image.from_pretrained(
"stabilityai/sdxl-turbo", torch_dtype=torch.float16, variant="fp16"
).to("cuda")
The cache for model files in Transformers v4.22.0 has been updated. Migrating your old cache. This is a one-time only operation. You can interrupt this and resume the migration later on by calling `transformers.utils.move_cache()`.
0it [00:00, ?it/s]
/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_token.py:88: UserWarning: The secret `HF_TOKEN` does not exist in your Colab secrets. To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session. You will be able to reuse this secret in all of your notebooks. Please note that authentication is recommended but still optional to access public models or datasets. warnings.warn(
model_index.json: 0%| | 0.00/685 [00:00<?, ?B/s]
Fetching 18 files: 0%| | 0/18 [00:00<?, ?it/s]
scheduler/scheduler_config.json: 0%| | 0.00/459 [00:00<?, ?B/s]
text_encoder_2/config.json: 0%| | 0.00/575 [00:00<?, ?B/s]
text_encoder/config.json: 0%| | 0.00/565 [00:00<?, ?B/s]
tokenizer/tokenizer_config.json: 0%| | 0.00/704 [00:00<?, ?B/s]
tokenizer/special_tokens_map.json: 0%| | 0.00/586 [00:00<?, ?B/s]
tokenizer/merges.txt: 0%| | 0.00/525k [00:00<?, ?B/s]
tokenizer_2/special_tokens_map.json: 0%| | 0.00/460 [00:00<?, ?B/s]
tokenizer/vocab.json: 0%| | 0.00/1.06M [00:00<?, ?B/s]
tokenizer_2/tokenizer_config.json: 0%| | 0.00/855 [00:00<?, ?B/s]
tokenizer_2/merges.txt: 0%| | 0.00/525k [00:00<?, ?B/s]
unet/config.json: 0%| | 0.00/1.78k [00:00<?, ?B/s]
tokenizer_2/vocab.json: 0%| | 0.00/1.06M [00:00<?, ?B/s]
vae/config.json: 0%| | 0.00/607 [00:00<?, ?B/s]
model.fp16.safetensors: 0%| | 0.00/246M [00:00<?, ?B/s]
model.fp16.safetensors: 0%| | 0.00/1.39G [00:00<?, ?B/s]
diffusion_pytorch_model.fp16.safetensors: 0%| | 0.00/167M [00:00<?, ?B/s]
diffusion_pytorch_model.fp16.safetensors: 0%| | 0.00/5.14G [00:00<?, ?B/s]
Cannot initialize model with low cpu memory usage because `accelerate` was not found in the environment. Defaulting to `low_cpu_mem_usage=False`. It is strongly recommended to install `accelerate` for faster and less memory-intense model loading. You can do so with: ``` pip install accelerate ``` .
Loading pipeline components...: 0%| | 0/7 [00:00<?, ?it/s]
Теперь этот pipe
можно переиспользовать для генерации нескольких изображений. Большую роль в качестве сгенерированных картинок играет промпт (текстовый запрос). Часто указывают "artstation" и высокую детализированность в дополнение к основному запросу. Также можно поэкспериментировать с разными стилями.
prompt = "a photo of a parrot riding a scooter in Moscow, artstation, highly detailed"
# Передаем prompt в pipe, указываем параметры
# Модель проводит генерацию картинки, соответствующей запросу
image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]
image
0%| | 0/1 [00:00<?, ?it/s]
prompt = "computer science student pulling an all-nighter, artstation, extremely detailed"
image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]
image
0%| | 0/1 [00:00<?, ?it/s]
Можно генерировать картинки в стиле рисунков:
prompt = "Valparaiso city view on a sunny day with a rainbow, painting, artstation, extremely detailed"
image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]
image
0%| | 0/1 [00:00<?, ?it/s]
prompt = "cat as the ultimate autonomous entity with sacred geometry, artstation, highly detailed"
image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]
image
0%| | 0/1 [00:00<?, ?it/s]
Выводы: мы применили Neural Style Transfer на собственных и данных картинках, перенося стиль с картинки стиля на картинку контента. Также научились запускать одну из диффузионных моделей на произвольных промптах.