Blog

Делаем зеркало-ужастик на базе Stable Diffusion / Хабр

На управляющим экраном компьютере запущен python-скрипт, который контролирует кадры с веб-камеры и ищет лица. Когда лицо обнаружено (это значит, что кто‑то посмотрел в зеркало), кадр передаётся Stable Diffusion с использованием режима 'img2img' и соответствующим промптом (текстовой подсказкой, задающей тон позы, костюма и общего фона). После генерации реальное отражение зрителя заменяется его «монстр‑версией».

Сборка создана под AUTOMATIC1111 Stable Diffusion, которую нужно загрузить отдельно. Дальше по тексту я для простоты буду называть её SD. Пожалуй, это самая ценная часть сборки, требующая несколько гигабайт дискового пространства и умеренно мощной видеокарты, способной работать с ним (NVidia, AMD, Intel; ~4 ГБ+ VRAM) и на разумной скорости. Озадачьтесь этим вопросом заранее. Процесс Производства Автомобильной Краски

Если вы хотя бы немного знакомы с Python, возьмите код по ссылкам на GitHub (если вы новичок, попробуйте воспользоваться опцией Code → Download ZIP), а инструкции по настройке (зависимости и т. д.) смотрите в README для каждого из них. Опять же, я настоятельно рекомендую сначала заставить работать Stable Diffusion Web UI и сгенерировать несколько тестовых изображений. Убедитесь, что у вас установлен последний Python 3. Хотя обычно с этим интерфейсом работают через браузер, мы будем использовать встроенный API для управления им из другого скрипта. Обязательно добавьте параметры ‑api и ‑listen в конфигурацию командной строки (см. README).

Скрипт hauntedmirror.py занимается отображением картинки и может (это не обязательно) работать на том же компьютере, что и SD. В отличие от Stable Diffusion, эта часть программы легковесна и может быть запущена на любом оборудовании, которое у вас есть, а взаимодействовать с бэкендом SD по Wi‑Fi. По умолчанию вся обработка изображений происходит локально, никакие фотографии чужих детей не отправляются на случайные сторонние серверы. Для распознавания лиц и отображения изображений используется OpenCV, а собственно для распознавания — каскадный классификатор Хаара. Это не совсем современное решение, но лёгкое и позволяющее справиться с поставленной задачей. Не обязательно, чтобы все было идеально: распознавание лиц нужно только для запуска захвата кадра и не используется при генерации замещающего изображения.

Перед запуском скрипта hauntedmirror.py в самом начале необходимо настроить несколько параметров (см. README), включая IP‑адрес и порт экземпляра Stable Diffusion (если они отличаются), COM‑порт для связи с дополнительным эффектом освещения, некоторые параметры размера изображения и, конечно, сами параметры SD.

Параметры по умолчанию являются хорошей отправной точкой, но там есть одна вещь, которую вы определённо захотите подправить: параметр 'steps', который, по сути, является компромиссом между качеством изображения и временем обработки и зависит от вашего GPU. Чем видеокарта мощнее, тем быстрее выдаются результаты. В моих тестах значение 8 — это нижний предел для получения хороших результатов, а время генерации изображения сократилось до ~3-5 секунд на видеокарте NVIDIA GeForce GTX 1080. Такие приёмы, как эффект загадочного освещения или приклеенная к зеркалу бумажка с текстом, могут помочь компенсировать задержку, но вы же понимаете, что люди не будут долго ждать, пока что-то произойдёт.

Итак, давайте перейдём к настройкам Diffusion. Для получения достойных результатов полезно знать, как работает SD, но не обязательно. Этот эффект использует режим 'img2img', в котором к выбранному исходному изображению добавляется контролируемое количество шума. Количество исходного шума может быть настроено с помощью параметра denoising_strength в диапазоне от 0.0 (немодифицированное исходное изображение) до 1.0 (чистый случайный шум). В моих экспериментах значение около 0,45 оказалось оптимальным, при котором хорошо добавлялись жуткие элементы, но сохранялось общее исходное изображение. По крайней мере, для меня большая часть привлекательности заключалась в том, что жертвы видели в зеркале именно себя, а не случайное пугающее изображение.

Для своей системы я пробовал модели dreamlikeDiffusion и Dreamshaper, и обе дали довольно хорошие результаты. Последняя больше изменяет фон при одинаковом значении denoising_strength. Как ни странно, обе эти модели оказались лучше, чем специально разработанная для данной темы модель creepy‑diffusion, которая давала небольшой набор однотипных монстро‑лиц.

Процесс Производства Автомобильной Краски Скрипт Arduino очень прост, он принимает по последовательному порту один из трёх ASCII-символов для установки режима освещения (Lit, Flicker или Dark) и модулирует яркость светодиодов с помощью ШИМ‑вывода. В режиме Flicker яркость линейно затухает между произвольно выбранными уровнями. Это создаёт ощущение плавного «мерцания лампочек» из старых фильмов ужасов, когда кто‑то за кадром буквально щелкал выключателями, а мощным лампам накаливания той эпохи требовалось некоторое время, чтобы отреагировать.