ITСooky

IT-рецепты съедобные и не очень!

Меняем лицо на видео или фото с помощью DeepFaceLab!

дата 13.09.2021

DeepFake как много в этом звуке для сердца русского слилось! У DeepFaceLab русские корни и стремное настоящее, достаточно сказать что единственная полная инструкция и форум поддержки находятся на п◯|°I┥() сайте — кстати как раз именно в этой связи звезды уже обеспокоены существованием технологии DeepFake. Однако сразу хочу успокоить остальную общественность — вам это не грозит — главная причина в том что 2 фоток из инстаграма для DeepFake недостаточно, да даже 1000 недостаточно тем более если вы все время в одной позе лица фоткаетесь. Для действительно убедительного DeepFake нужны тысячи изображений головы в разных положениях — такие можно собрать только для селебретей у которых куча ролей — интервью и еще огромные вычислительные мощности, на видеокартах последнего поколения, а значит очень дорогих.

Меня лично DeepFake очаровывает, это технология которой по силе надругаться над всеми самими мощными домашними компами, которые будут трудится над поставленной задачей часами — кто-то вспомнить что и первые mp3 файлы делались со скоростью одна песня ночь и дело всего лишь в развитии технологий — но это другое.

Как работает DeepFake
Лучше всего объяснить на фруктах. Мы хотим из яблочного сока сделать апельсиновый. Берем в руку апельсин выжимаем его и получаем апельсиновый сок. Берм в туже руку яблоко выжимаем его и получаем апельсиновый сок — в реальной жизни этого не происходить, а в случае с DeepFake да. Главное тут рука, её надо натренировать — на это и уходить масса вычислительной мощности и яблок, апельсины не так важны как сильно натренированная рука на яблоках, она сможет делать из них и виноградный сок — надо будет только чуток винограда повыжимать перед этим.

Видeо или Фото
А без разницы. Видео, на которое хотим наложить, разбивается на кадры и кладется в папку workspace/data_dst, сюда же вместо кадров можно просто положить фото. Если лиц на фото много можно запустить ручное распознование и выбрать нужное лицо.

Устанавливаем DeepFaceLab
DeepFaceLab есть официальное место сайт github.com/iperov/DeepFaceLab но ссылки на сборки для Windows там уже на ушлые файлхостинги или даже на тренты
Качаю для Windows: DeepFaceLab_NVIDIA_up_to_RTX2080Ti_build_09_06_2021.exe

Это вторая версия DeepFaceLab. Пользователи отмечают что 1 версия отлично справлялась с тенями и цветом лица по умолчанию, а 2-ая никак не справляется по умолчанию, а подбор правильных настроек крайне затруднен на слабых системах(вот на моей) и я так и не подобрал если честно.

Linux: Я хотел ставить на Ubuntu но способ установки на него какой-то стремный, через непонтяную полуплатную фигню… и чувствуются что создатель DeepFaceLab предпочитает Windows, так что все делаю на нем, простите!

Так как у меня NVIDIA GeForce RTX 2070: количество ядер CUDA® 2304, объём ОЗУ в комплекте 8 Гбайт. Как раз ядра CUDA и понадобятся, тут их не много — если сравнивать с NVIDIA GeForce RTX 3070 то там их уже 5888. Важно отметить что видео карта у меня для DeepFake слабая и любая слабая если вы хотите получить шикарный результат за ночь за 12 часов — тут нужно может быть 3-4 топовых NVIDIA видео карты…

Вся конфигурация ПК:
OS: Windows 10 Pro 21H1 19043.1165
CPU: AMD® Ryzen 7 3700x 8-core processor × 16
MB: Gigabyte X570 I AORUS PRO WIFI
Mem: 64 GB DDR4 1330 Mhz
GPU: Nvidia GeForce RTX 2070 8Gb
Disk: Samsung SSD 970 EVO Plus 1TB

Разархивирую и получаю

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

В Windows надо включить вот эту галочку в Дисплей > Настройки графики для большей производительности видео карты

Материал для распознования
В качестве лица для пересадки будут использовать испанского актера Альваро Морте. Беру вот это видео Entrevista y sesión de doblaje con Álvaro Morte ‘Smalfoot’ тут всего 402 но они все в нужно ракурсе. Кстати это не первое лицо, до этого брал уже нескольких — лучше брат лицо где больше лица лоб свободный и пр.

Если у вас есть живое лицо: Предположим что ваше. Это упрощает сбор данных лица для пересадки. Снимите себя в максимальном разрешение. Чтобы была как можно больше положения лица придется: повернут голову на лево, на право, вверх, в низ, открыть рот, улыбнуться, улыбнуться и повернуть голову на лево, потом на… и так далее. Крутить головой при этом разговаривать и улыбаться. Следите за светом когда будете крутиться возможно где то появится тень на лице — это ухудшит качество — возможно лучше сниматься на фоне монотонной стены в солнечный день, но не под прямыми лучами солнца.

В качестве лицеприемника сначала взял две секунды 720p из трейлера новой Матрицы, но после ночи обработки результат получался такой ужасный что… решил сразу взять ужасное видео для переноса это будет старый мексиканский юмористический сериал, вы все равно его не знаете! Персонаж Професор Хирафалес

Делаем DeepFake
Идем в папку куда разархивировался DeepFacelab. В папке workspace уже лежат примеры, так что очистим все, запускаем:
1) clear workspace.bat

Теперь в workspace копируем видео с Альваро и переименовываем его в data_scr.mp4

Вытаскиваем из него кадры, для этого запускаем:
2) extract images from video data_src.bat
отвечаю
[0] Enter FPS ( ?:help ) : 3
[png] Output image format ( png/jpg ?:help ) : jpg
Кадры кладутся в папку workspace/data_src

Теперь в этих кадрах находим лица, запускаем:
4) data_src faceset extract.bat
Это можно сделать вручную, если например на кадре больше одного лица, а лицо нужно одно

Здесь меняю параметры, остальные по умолчанию.
[f] Face type ( f/wf/head ?:help ) : f
[0] Max number of faces from image ( ?:help ) : 1

Extracting faces...
Running on GeForce RTX 2070
100%|##############################################################################| 402/402 [07:22<00:00,  3.10it/s]
-------------------------
Images found:        402
Faces detected:      399

Лица можно подчистить, запустив:
4.2) data_src sort.bat

удалить размытые и тд
Choose sorting method:
[0] blur
[1] motion_blur
[2] face yaw direction
[3] face pitch direction
[4] face rect size in source image
[5] histogram similarity
[6] histogram dissimilarity
[7] brightness
[8] hue
[9] amount of black pixels
[10] original filename
[11] one face in image
[12] absolute pixel difference
[13] best faces
[14] best faces faster

Теперь в workspace копируем кусок видео с Хирафалес и переименовываем его в data_dst.mp4

Из него тоже надо вытащить скриншоты, запускаем:
3) extract images from video data_dst FULL FPS.bat
тут только дают выбрать тип фото
[png] Output image format ( png/jpg ?:help ) : jpg

Вытаскиваем лица, запускаем:
5) data_dst faceset extract.bat
здесь тоже выбираю лицо
[f] Face type ( f/wf/head ?:help ) : f

Их тоже можно подчистить, но я не делал этого

Теперь надо наложить маску на лицо

Делаю:
5.XSeg Generic) data_dst whole_face mask - apply.bat
5.XSeg Generic) data_src whole_face mask - apply.bat

И важнейший этап… тут надо прикинуть и подумать. По моими исходным лицам лучше вставлять от бровей до подбородка! Для этого надо пару кадров обвести ручную, лучше выбирать с разными лицами — от этого потом будет отталкиваться обучение — как я заметил!

Хирафалес не трогаю его и так автоматом хорошо распозналось, это можно увидеть:
5.XSeg) data_dst mask - edit.bat

У Альваро отрезаю лоб вручную на нескольких кадрах — на них будет опираться обучение маски
5.XSeg) data_src mask - edit.bat

Запускаю обучение масок:
5.XSeg) train.bat
тут тоже выбираю лицо
[wf] Face type ( f/wf/head ?:help ) : f

И пошло обучаться, тут советуют уже готовую брать модель XSeg и доучивать — лица то у всех примерно одинаковые а в плане количества носов и глаз почти у всех одинаковые! Но я не брал, это огромный файл и для скачивания его надо регистрироваться на том форуме!

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

Сколько обучать? Говорят всегда чем больше тем лучше! Я смотрю если по картинкам норм то останавливаю.

Запускаю, применение этих масок:
5.XSeg) data_src trained mask - apply.bat

И запускаю главное обучение.
train SAEHD.bat
Здесь отмечаю вот что, в остальных настройках не разобрался
[0] Autobackup every N hour ( 0..24 ?:help ) : 1

[f] Face type ( h/mf/f/wf/head ?:help ) : f

[n] Eyes and mouth priority ( y/n ?:help ) : y

[0.0] Face style power ( 0.0..100.0 ?:help ) : 0.0
[0.0] Background style power ( 0.0..100.0 ?:help ) : 0.0

Настройка Face style power должна отвечать за цвет лица и тени и очень сложно подобрать её правильно и она сильно влияет на время обработки у меня реально получалась только черная дыра на носу Альваро вместо тени от носа Нео. Просто так обнулить её когда вы замете что дела плохи не получится, надо после обнуления погонять обучение

Начало обучения, в превью результата пятно, но в котором уже можно узнать усы!

Тут у меня видно что сделан уже 68000 итираций, это модель ночь училась уже пытаясь натянуть лицо Альваро на Нео — учеба это хорошо!

Тренеровку можно в любой момент остановить нажав [Enter], посмотреть следующей командой как получается — по позиции и пр, потому что картинка в начале будет размытым. И опять запустить тренероваться.

Через 3000 итираций останавливаю чтобы посмотреть как ложиться. Запускаю:
7) merge SAEHD.bat

Тут выбираю все по умолчанию, первым делом нам показывают инструкцию между кадрами и её можно будет прыгать нажав [Tab]

Первый кадр

На самом деле результат отличный. Края потом можно будет подправить, размытость соответствует качеству видео, цвет такой же синюшный, все хорошо в рамках низкого качества респиента. Лицо Альваро даже выдаётся своей четкостью!

Еще чуть чуть дообрабатываю и опять останвлиаю и запуска.
7) merge SAEHD.bat

Добавляю
Blue mask до 78 кнопка [E] — чтобы края размылись, но уходит и цвет жалко
Erode mask до 20 кнопка [W] — это дает больше похожести на ресепиента
Blur/Sharpen до -4 кнопка [H] — чуть размываю а то слишком четко

Можно еще подрезать маску Альваро со всех сторон (хотелось бы только с одной но нет)
для этого нажимам [W] маска уменьшается. [S] увеличится — не сразу, какое то время тратится на обработку
Можно увеличить масштаб лица кнопка [J] уменьшить [U]

Нормально выглядит, следы наложения сведены до минимума… на Доктора Хауза почему то стал похож!

Это первый кадр жму кнопку [? /] что применить на следующий кадр, держу пока все не применятся. В конце жму [ESC]

Теперь все сохраняю в видео, запускаю:
8) merged to mp4 lossless.bat

В папке workspace появляется файл result.mp4. Замечаю некоторые дефекты наложения, но результат все равно хороший! Обрезаю его и склеиваю с оригналом вот:

Теперь фото
Попробую исправить великую несправедливость, Альваро Морте нет на постере пятого сезона Бумажного Дома(La Casa de Papel). Удаляю вручную все файлы из папки workspace/data_dst и workspace/data_dst/aligned если есть какие папки тоже их удаляю. Кладу в workspace/data_dst картинку постера.

В ручную вытаскиваю лицо:
5) data_dst faceset extract MANUAL.bat
Навожу мышей и жму [ENTER]

Делаю:
5.XSeg Generic) data_dst whole_face mask - apply.bat
Смотрю:
5.XSeg) data_dst mask - edit.bat

Применяю:
5.XSeg) data_src trained mask - apply.bat
Даже не знаю применится ли это без тренировки масок.

Как я понимаю если бы у меня была супер натренированная(где то упоминалось что это 400-500 тысяч итерация) уже модель на все положения лица, то мне не надо было бы каждый раз запускать её тренировку. Но у меня слабая тренировка так что.

Запускаю тренировку:
6) train SAEHD.bat
тут все таки ставлю
[0.0] Face style power ( 0.0..100.0 ?:help ) : 0.001
[0.0] Background style power ( 0.0..100.0 ?:help ) : 0.001
Может даст адекватную тень в адекватные сроки — все таки один кадр всего по сути.

Долго не учил, всего пол часа — особо это ничего не дает в морем случае

Делаю:
7) merge SAEHD.bat

Улучшаю кнопочками по своему вкусу и получаю вот

Четкие текстуры с оригинала не копирует, подозреваю что для этого надо ну очень долго учить на моей конфигурации и задействовать мне неизвестные настройки.
Но из далека уже можно принять фото за оригинал, и в лице тоже узнать Альваро… если напрячься. Если бы я взял изначально не такое четкое фото то было бы лучше, как с видео. Главное что сделал DeepFake натянул лицо(хотя по глазам видно что криво), а четкость и цвета все это уже можно доработать в фоторедакторах это будет быстрее.

Тему с DeepFake не бросаю, буду осваивать дальше, видимо мой потолок это видео низкого качества и фото без пор на лице!

UPD: Советы по DeepFake
Как использовать натренерованную модель?
Выходит что модель к лицу не привязывается. Если есть уже натренерованная модель на одном лице её можно скопировать в новый workspace папку и это ускорит тренеровку наложения нового лица!

Как добавить четкость результату?
Я конечно страдал от того что результат был какой-то размытый и я не понимал почему. Сначала пробовал Face style у меня это вообще не дают результата. А потом зашел на стыдный сайт и почитал инструкцию на английском и есть результат.

Перед использованием надо сделать бекап модели. А то иногда делает слигком четким каике то детали(часто на носу) которые совсем не реалистичные — и для отката нужен бекап

После того как модель уже нормально натренированна (у меня это было 4 лица донора и 300000 итирация) надо менять настройки при запуске
6) train SAEHD.bat
на вот такие
[n] Use learning rate dropout ( n/y/cpu ?:help ) : y
[y] Enable random warp of samples ( y/n ?:help ) : n
[0.0] GAN power ( 0.0 .. 5.0 ?:help ) : 0.1
тренируем сколько не жалко, на моей системе это ночь день часов 6-8 (хотя для маленьких видео 600×480 5 секунд хватило всего 3х часов)
И тогда в результате появляется четкость наложено картинки — да так хорошо что приходит заблюривать под качество видео — но это лучше чем размытость по выходу из модели!
Так же на этапе merge SHAED четкость дает super resolution буква [T] — не супер конечно но лучше.

Что делать если местами маска лица сделалась плохо?
Это становится видно уже после merge SHAED или если посмотреть картинки в папке aligned_debug это можно в любой момент исправить!
Удалем лицо и его маску из папок aligned aligned_debug
Запускам
5) data_dst faceset MANUAL RE-EXTRACT DELETED ALIGNED_DEBUG.bat
И он нам предлагает распознать эти недостающие маски! Соледите чтобы синий квадратик был по лицу.


Добавить комментарий

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