diff --git a/.gitignore b/.gitignore index 442e0ee..16a6020 100644 --- a/.gitignore +++ b/.gitignore @@ -4,14 +4,5 @@ !*.txt !*.jpg !requirements* -!doc -!facelib -!gpufmkmgr -!localization -!mainscripts -!mathlib -!models -!nnlib -!utils !Dockerfile* !*.sh \ No newline at end of file diff --git a/doc/manual_ru.pdf b/doc/manual_ru.pdf index 881f982..ef8ce31 100644 Binary files a/doc/manual_ru.pdf and b/doc/manual_ru.pdf differ diff --git a/doc/manual_ru_source.xml b/doc/manual_ru_source.xml index 0d346db..5c442ce 100644 --- a/doc/manual_ru_source.xml +++ b/doc/manual_ru_source.xml @@ -1,6 +1,6 @@ -DeepFaceLab это программа для замены лица в видео с помощью нейросети, работающей на графическом ускорителе NVIDIA / AMD / IntelHD Graphics.Разработчик: iperovСайт разработчика: https://github.com/iperov/DeepFaceLabРазрядность: 64bitЯзык интерфейса: АнглийскийМинимальные системные требования: Windows 7 и вышепроцессор с поддержкой SSE инструкций2Gb ОЗУ с подкачкойOpenCL-совместимая видеокарта ( NVIDIA, AMD, Intel HD Graphics ) Рекомендуемые системные требования:Windows 7 и вышепроцессор с поддержкой AVX инструкцийNVIDIA видеокарта с 6GB видео, 8Gb ОЗУДоступные сборки:DeepFaceLabCUDA9.2SSE для NVIDIA видеокарт вплоть до GTX1080 и любых 64-бит процессоров.DeepFaceLabCUDA10.1AVX для NVIDIA видеокарт вплоть до RTX и процессоров с поддержкой AVX инструкций.DeepFaceLabOpenCLSSE для AMD видеокарт и любых 64-бит процессоров.Зеркало со старыми версиями: https://mega.nz/#F!b9MzCK4B!zEAG9txu7uaRUjXz9PtBqgОсобенности DeepFaceLab :отсутствие любых предустановок, кроме драйверов на вашу видеокарту. Проверено на чистых Windows 7 и 10, а также в VMWare.работает на любых OpenCL-совместимых видеокартах с памятью от 256Mb и выше, даже довольно старых.автоматически выбирает «лучшую» видеокарту. Так можно работать с офисными приложениями на видеокарте послабее, а тренировка сети будет автоматически на лучшей.есть возможность тренировки полностью на CPU. 8-е поколение процессоров Intel способен выдать неплохой демонстрационный результат за 2 дня тренировки.все необходимые мета-данные лиц хранятся непосредственно в извлеченных JPG файлахесть режим ручного выделения лицесть сортировка извлеченных лиц для быстрого удаления ненужных лиц.быстрая работа с видео: извлечение, удаление шума, сборка финального видеоПриступая, поймите: эта программа не гарантирует идеальной замены лиц во всех случаях! Всё зависит от качества исходных данных, совместимости лиц, источников света, и т.д. и т.п. Да и сама технология появилась недавно (февраль 2018), она далека от идеала, т.к. заменяется только лицо, причём без лба и волос. Вы можете потратить кучу времени и сил, а в итоге ничего не получить! У вас есть невысокий шанс создания успешного фейка с первой попытки. Только когда вы сделаете много попыток создания фейков с разными лицами, тогда вы поймете все нюансы.DeepFaceLab создана на чистом энтузиазме одним человеком. Поэтому, если вы найдете какие-либо ошибки, то отнеситесь к этому с пониманием.Посмотрите вводную видео инструкцию по работе с программой, чтобы получить общее представление о рабочем процессе: https://www.youtube.com/watch?v=K98nTNjXkq8 Обновите драйвера на вашу видеокарту.Первый запуск программы в чистой папке из торрента будет происходить долго, т.к. компилируются GPU программы.Определим термины dst и src.src - это лицо, которое будет использоваться для замены.dst - это лицо, которое будет заменяться.DeepFaceLab\workspace – наша рабочая папка для хранения модели целиком (видео, фото, файлы самой программы). Вы можете переименовывать её, чтобы сохранять как резервную копию или работать с другой.1) clear workspace.batОчистит или создаст все папки внутри папки workspace. Помещаете в папку workspace ваше видео data_src.xxx формата максимум 1080р - это видео откуда брать лицо. Тестовое видео уже содержится в папке workspace.Помещаете в папку workspace ваше видео data_dst.xxx формата максимум 1080р - это видео где заменить лицо. Тестовое видео уже содержится в папке workspace.где xxx - любое расширение видео, например mkv, mp4, avi2) extract PNG from video data_src.batконвертирует видео откуда брать лицо в набор PNG в workspace\data_srcEnter FPS ( ?:help skip:fullfps ) : сколько кадров из каждой секунды видео извлечь, пропустить = все кадры. Здесь мы собираем кадры из которых будем извлекать src лица. Чем их больше тем лучше.3.1) cut video (drop video on me).batопционально. Обрезает видео где заменить лицо, на время которое вы укажите.Нужно перетянуть видео файл на этот .bat файл, при этом оригинальный файл сохраняется, а появляется новый с суффиксом _cutFrom time (skip: 00:00:00.000) : время начала обрезкиTo time (skip: 00:00:00.000) : время конца обрезкиSpecify audio track id. ( skip:0 ) : можно указать аудио дорожку. Полезно, если например вам нужен другой язык из фильма.Bitrate of output file in MB/s ? (default:25) : битрейт выходного файла, пропустить = 25.Тестовое видео, которое уже лежит в папке, обрезать не нужно.3.2) extract PNG from video data_dst FULL FPS.bat конвертирует видео где заменить лицо в набор PNG в workspace\data_dstЗдесь извлечение только с ПОЛНЫМ FPS, потому что каждый кадр должен быть обработан.3.other) denoise extracted data_dst.batDenoise factor? (1-20 default:5) :степень подавления шумаделается перед извлечением dst лиц! делает проход по извлеченным видео кадрам, убирая шум, сохраняя четкими грани.Позволяет тем самым сделать финальный фейк более правдоподобным, т.к. нейронная сеть не способна сделать детальную текстуру кожи, но грани делает вполне четкими.Поэтому, если весь кадр будет более "смазан", то и фейк будет казаться более правдоподобным. Особенно актуально для фильмовых сцен, которые обычно очень четкие.4) data_src extract faces ... .bat производит выборку конечного набора лиц из PNG в папку workspace\data_src\alignedОпции:DLIB, MT детекторы.Для src оптимально MT детектор.DLIB - медленнее, лица получаются с некоторым дрожанием, но производит меньше ложных лиц.MT - быстрее, меньше дрожания лиц, но производит больше ложных лиц.MANUAL - извлечение вручную, полезно для src только для переизвлечения уже извлеченных лиц, если найдены где-то ошибки с помощью 4.2.other) data_src util add landmarks debug images.bat Для этого нужно вручную сделать резервную копию data_src\aligned\ , переместить из этой папки лица в data_src\ , сделать ручное извлечение, затем объединить data_src\aligned с резервной копией.GPUЗдесь либо ALL (все), либо Best (лучший).Если у вас только один GPU, то нет разницы, что выбирать.Если вы работаете в офисных приложениях на слабом GPU, а имеется мощный, то выбираете Best.Для максимальной скорости на мульти-GPU выбираете ALL, но тогда офисная работа на основном GPU может подтормаживать.DEBUGЗаписывает в workspace\data_src\aligned_debug каждый кадр с выделенными лицами и лицевыми точками, тем самым можно смотреть работу детекторов.4.1) data_src check result.batпросмотр результатов выборки лиц с помощью портативной программы XNViewMP.Здесь ваша цель - убрать ненужные лица.Сначала пролистываете скролом и убираете те ненужные лица, которые идут подряд большими группами. Не нужно удалять мелкие группы. Для этого есть сортировка.Если нужное лицо перемешано с другими, то запускаете сортировки следующих пунктах.Сортировку по резкости в любом случае делаете, потому что мутные лица src нужно удалять.4.2.1) data_src sort by blur.batСортировка по резкости. Запускаете и ждете сортировки. Затем смотрите результаты. Самые мутные лица будут в конце. Для src важно убрать мутные лица.4.2.2) data_src sort by similar histogram.batПосле этой сортировки лица будут сгруппированы по содержанию, так что отсеять ненужные лица теперь намного проще.Пролистываете скроллом и удаляете ненужные лица группами.4.2.4) data_src sort by dissimilar histogram.batЭта сортировка оставляет ближе к концу списка те изображения, у которых больше всего похожих.Обычно это лица в анфас, которых больше всего, потому что актёр чаще смотрит прямо на камеру либо куда-то в одном направлении в интервью.Часть с конца списка можете удалить по усмотрению.4.2.5) data_src sort by face pitch.batОпциональный пункт. Сортирует лица так, чтобы вначале списка лицо смотрело вниз, а к концу списка вверх.4.2.5) data_src sort by face yaw.batОпциональный пункт. Сортирует лица так, чтобы вначале списка лицо смотрело налево, а к концу списка - направо.4.2.6) data_src sort by final.batРекомендованный пункт.Target number of images? (default:2000) : ввести целевое количество изображенийАвтоматически делает лучшую финальную выборку лиц из любого количества в целевое количество.Применяйте только после очистки набора лиц другими пунктами, если у вас осталось более чем 2000 лиц.Отсеянные лица перемещаются в мусор (aligned_trash)4.2.other) data_src sort by black.batСортирует по количеству черных пикселей в конец списка. Позволяет отсеять лица вырезанные экраном.4.2.other) data_src sort by one face in image.batПеремещает в мусор (aligned_trash) все изображения, в которых нашлось более 1 лица4.2.other) data_src sort by original filename.batСортирует по оригинальному имени файла4.2.other) data_src util add landmarks debug images.batОпциональный пункт. добавляет к извлеченным data_src лицам изображения с нанесенными лицевыми точками с суффиксом к файлу _debug.jpgЭто позволяет вручную отсеять совсем плохие извлечения из вашего набора src лиц.Перед этим сделайте сортировку по yaw.Имеет смысл удалять только те лица, в которых нанесенные брови ниже чем реальные, или контур челюсти существенно заходит на лицо.После отсеивания удалите вручную все файлы по маске *_debug.jpg4.2.other) data_src util recover original filename.batВосстанавливает оригинальное имя файла извлеченного лица.Итог по извлечению лиц src.Мутные лица надо удалять.Лица закрывающиеся чем-то (рукой, волосами, и т.д.) - также нужно удалять.После приведения набора лиц в надлежащий вид делаем финальную сортировку sort by final.Опционально можете провести пункт 4.2.other) data_src util add landmarks debug images.batВы можете собрать несколько разных наборов лиц одного актёра и затем использовать их в зависимости от условий лица dst, помещая их в папку data_src\aligned5) data_dst extract faces ... .batТо же, что и п.4, с некоторыми отличиями.Здесь мы извлекаем лицо, которое будет заменяться.Детектор DLIB или MT ?В большинстве случаев - MT.Если лицо не определилось в каком-то кадре, то для этого есть опция +manual fix - позволяет вручную указать лица на кадрах, где вообще не определилось никаких лиц.Подвох с MT+manual fix в том, что на кадре могут определиться ненужные лица кроме главного, поэтому программа не предложит указать лица на этом кадре. В таком случае можете проверить в папке data_dst\aligned_debug какие лица обнаружились вообще.Можете использовать DLIB+исправить, он генерирует меньше ложных лиц.В совсем крайнем случае или для экспериментов есть полностью ручная выборка (manual), т.е. по каждому исходному кадру dst вы вручную проходите и указываете лица.Окно ручного исправления лиц. здесь вам нужно совместить зеленые точки с лицом.Управление:Enter - подтвердить лицо и следующий кадр.Пробел - пропустить кадр., - вернуться на прошлые кадрыКолесо мыши - изменять прямоугольник.5) data_dst extract faces MANUAL FIX DELETED ALIGNED DEBUGОчень важный пункт. Напрямую влияет на качество итогового фейка.позволяет переизвлечь те кадры из dst, чьи results debug из п.5.1 были удалены вами.Для чего это нужно? Чтобы сделать фейк качественнее, нужно проверять dst кадры в папке aligned_debug, просмотреть их можно через п.5.1.Неправильно размеченное dst лицо может приводить к значительному ухудшению качества:Если где-то увидите, что контур лица существенно отличается от реального, например съехало на фон, то удаляете эти кадры из папки aligned_debug (п.5.1), и запускаете этот пункт.Произойдет ручное переизвлечение удалённых кадров. Видео поясняющее этот процесс: https://www.youtube.com/watch?v=7z1ykVVCHhM5.1) data_dst check results debug.batпросмотреть все dst кадры с наложенными поверх них предсказанными контурами лица5.1) data_dst check results.batАналогично смотрим результаты выборки лица dst, и удаляем другие не целевые лица. А целевое лицо, даже мутные - оставляем.5.2) data_dst sort by similar histogram.batЕсли в целевом видео содержатся другие ненужные лица, можете произвести эту сортировку, и затем удалить эти лица будет проще.5.3.other) data_dst sort by original filename.batСортирует по оригинальному имени файла5.3.other) data_dst util recover original filename.batВосстанавливает оригинальное имя файла извлеченного лица.Итог по извлечению лиц dst.Ваша цель извлечь только целевое лицо (даже мутное) из каждого кадра, удалив все другие лица.6) train ... .bat Тренировка.Отключаем любые программы, которые могут использовать видео память.Если в процессе запуска тренировки появилось много текста, содержащее одно из этих слов: Memory ErrorAllocationOOMзначит на вашем GPU модель не запустилась, и вам нужно урезать модель, для этого смотрите описание опций моделей.При первом запуске модели, программа спросит о различных опциях, которые сохранятся и будут использоваться при последующих запусках.Просто нажимая Enter - будут использоваться значения по-умолчанию.Which GPU idx to choose? ( skip: system choice ) : Имея мульти-GPU можно тренировать одну сцену на разных моделях или опциях одной модели без клонирования папок. Просто выбираете индекс GPU на старте тренировки/конвертации и тогда файлы модели в папке workspace\model будут содержать префикс этой GPU в имени.Если оставить выбор GPU по-умолчанию, то выберется лучшая GPU и файлы модели не будут содержать префикс.Write preview history? (y/n skip:n) : писать ли историю превью на дискTarget epoch (skip:unlimited) : целевая эпоха, по достижению которой тренировка остановится.Batch_size (skip:model choice) : выбор размера батча - это то сколько картинок за раз кормится нейронной сети для обучения. По-умолчанию выбирается низкое значение, но вы можете подобрать это значение самому под свою видеокарту. Чем больше - тем лучше.Feed faces to network sorted by yaw? (y/n skip:n) : кормит модели src лица отсортированные по такому же направлению как и dst. Смысл в том, чтобы кормить только нужные лица. Однако пока до конца не протестировано хорошо это или плохо.Flip faces randomly? (y/n ?:help skip:y) : кормит модели все лица случайно перевернутые по горизонтали. При выключенной опции финальное лицо будет более естественным, но тогда src сборка лиц должна покрывать все углы поворота.Src face scale modifier % ( -30...30, ?:help skip:0) : модификатор масштабирования для src лиц. Если src лицо более широкое чем dst и фейк получился плохим, то имеет смысл немного уменьшить это значение.Если модель запускается уже второй раз:Press enter in 2 seconds to override some model settings.если вы нажмете Enter в течение 2х секунд, то появится возможность заменить некоторые опции модели.Список моделей для тренировки. Также указано минимальные требования к памяти GPU.H64 (2GB+)половина лица с разрешением 64 - это как оригинальная FakeApp или FaceSwap, только лучше за счёт тренировки маски нейросетью + исключающей фон вокруг лица + исправленного конвертора. Для видеокарт с видеопамятью 2 и 3Гб данная модель работает в сокращенном режиме, т.е. качество будет хуже чем с 4GB.H128 (3GB+)как H64 только с разрешением 128. Однако половина лица может плохо обучится на некоторых условиях света и поворота головы и т.д. Для видеокарт с видеопамятью 3 и 4Gb данная модель работает в сокращенном режиме, т.е. качество будет хуже чем с 5Gb.Опции для H64 и H128:Use lightweight autoencoder? (y/n, ?:help skip:n) :выбрать урезанную модель. Необходимо для видеокарт с <= 4Gb видео памяти.DF (5GB+)модель от dfaker. Полнолицевая модель с разрешением 128, умная функция тренировки лиц, исключающая фон вокруг лица.LIAEF128 (5GB+) как DF, только пытается морфировать исходное лицо в целевое лицо, сохраняя черты исходного лица. Морфирование не всегда хорошо, и может сделать вообще не узнаваемое лицо, в таком случае выбирайте DF.Опции H64, H128, DF, LIAEF128 моделей:Use pixel loss? (y/n, ?:help skip: n/default ) :позволяет быстрее улучшать мелкие детали и убрать дрожание. Включать только после 20к эпох.SAE (512MB+) Самая последняя лучшая и гибкая модель. Содержит все другие модели. Есть возможность переносить стиль лица и освещение, которое будет изучаться непосредственно нейронной сетью. При первом запуске можно настроить различные параметры. Эти параметры влияют на то, какого размера будет сеть и запустится ли на вашей видеокарте, так что можно подстроить модель на тренировку как на 512MB так и на 24GB. Конечно же, чем больше памяти, тем лучше качество получится в итоге.Пример фейка Cage-Trump: https://www.youtube.com/watch?v=2R_aqHBClUQПример фейка Elon Musk - Robert Downey jr: https://www.youtube.com/watch?v=OLWFnPwzgEYОпции только для SAE модели:Resolution ( 64-256 ?:help skip:128) : разрешение лица. Больше разрешение - больше требуется памяти, дольше тренируется модель. Вы можете выбрать любое значение от 64 до 256 кратное 16.Half or Full face? (h/f, ?:help skip:f) : половинный или полный размер лицаLearn mask? (y/n, ?:help skip:y) : учить ли маску. С изучением, маска будет более сглаженной и менее дрожащей, иначе будет использоваться грубая. Однако при стилизованной тренировки можно обойтись без изучения маски.AE architecture (df, liae, vg ?:help skip:df) : тип архитектуры нейронной сети. AutoEncoder dims (128-1024 ?:help skip:%d) : количество размерностей сети, больше - лучше, но может не запуститься из-за нехватки памяти. Можно уменьшать для достижения работоспособности на вашей видеокарте.Encoder/Decoder dims per channel (21-85 ?:help skip:%d) количество размерностей енкодера/декодера сети, больше - лучше, но может не запуститься из-за нехватки памяти. Можно уменьшать для достижения работоспособности на вашей видеокарте.Use lightweight encoder? (y/n, ?:help skip:n) : использовать ли облегченный энкодер, он быстрее на 35%, только не тестирован на различных сценах.Use multiscale decoder? (y/n, ?:help skip:n) : использовать ли многомасштабный декодер, позволяет добиться более высокой четкости. Use pixel loss? (y/n, ?:help skip: n/default ) позволяет быстрее улучшать мелкие детали и убрать дрожание. Включать только после 20к эпох.Face style power ( 0.0 .. 100.0 ?:help skip:%.1f) : скорость изучения переноса стиля лица, таких как освещение и цвет. Может вызывать артефакты при больших значениях. Число с плавающей точкой. 0 - не учитьBackground style power ( 0.0 .. 100.0 ?:help skip:%.1f) : скорость изучения фона вокруг лица. В большинстве случаев морфирует лицо в dst. Число с плавающей точкой. 0 - не учитьВ процессе тренировки можно выходить через Enter, нажав его в окне Training preview, и запускать в любое время, модель будет продолжать обсчитываться с той же точки.Тренируем от 24 часов и больше. Когда результат удовлетворяет - выходим также через Enter, нажав его в окне Training preview.Кнопка 'p'(на англ раскладке) в окне Training preview обновляет предпросмотр.В окне Training preview также мы видим кривую ошибки. Понижаясь, она показывает прогресс тренировки с течением времени.Итог по тренировке.Выбираете модель в зависимости от сцены и вашего личного опыта.7) convert ... .bat Наложение лиц.Выбираете ту модель и тот номер GPU (если у вас их несколько), с которым тренировали.Опция debug позволяет посмотреть процесс наложения лиц и некоторую техническую информацию по каждому кадру в консоли, нажимаете пробел в окне просмотра.Основная концепция наложения лиц.Далее при запуске программа спросит об опциях:Choose mode: (1) overlay, (2) hist match, (3) hist match bw, (4) seamless (default), (5) raw :Выбор режима наложения лиц.РежимыOverlayпрямое наложение предсказанного лица из нейросети без предварительной обработкиHist-matchналожение с уравниванием гистограммы.Histh-match-bwналожение с уравниванием гистограммы из чернобелого канала.Seamlessналожение методом Пуассо"Poisson image editing." ACM Transactions on Graphics (TOG). Vol. 22. No. 3. ACM, 2003.Rawполучить сырые слои для собственной обработки в видео редакторе, например After Effects.По-умолчанию, если нажать Enter - выберет seamless.Какую выбрать? Зависит от случая. Пробуете все и смотрите результат.ОпцииSuppress seamless jitter? [ y/n ] (?:help skip:n ) :Для режима seamless. Подавляет дрожание лица, возникающее только в seamless режиме. Включение этой опции сделает процесс конвертации в несколько раз дольше.Seamless hist match? (y/n skip:n) :Для режима seamless. Включить ли уравнивание гистограммы.Masked hist match? (y/n skip:y) :Для режимов hist match, hist match bw, seamless, указывает, уравнивать ли гистограмму по маске лица.Use predicted mask? (y/n skip:y) : Использовать ли маску, которая предсказана моделью (только если маска изучалась, например в SAE модели можно выключить изучение маски) - по умолчанию да. Либо использовать маску из dst лица.NoYesChoose erode mask modifier [-200..200] (default 0) :Указываете насколько уменьшить в размерах dst маску. Значение < 0 - расширить маску. Это адаптивное значение, а не абсолютное.-100+100Choose seamless erode mask modifier [-100..100] (default 0) : только для режима seamless - модификация размеров маски, использующейся для самой seamless функции. Значение < 0 - расширить маску. Эта маска задаёт непосредственно шов, по которому будет проходить адаптация цвета.0+40 Choose blur mask modifier [-200..200] (default 0) : Указываете насколько сгладить dst маску. Значение < 0 - уменьшает сглаживание по-умолчанию моделями H64 и H128. Это адаптивное значение, а не абсолютное.-200+200Hist match threshold. [0..255] (default - 255) :Уменьшение значения подавляет артефакты для режимов с уравниванием гистограммы.(по-умолчанию) 255231Choose output face scale modifier [-50..50] (default 0) : изменить масштаб выходного лица в пределах -50+50%. Полезно, когда предсказанное лицо несколько больше оригинала.-50+50Apply color transfer to predicted face? Choose mode ( rct/lct skip:None ) : дополнительно адаптировать цвет лица, используя rct или lct алгоритмDst лицоПредсказанное лицоrctlctDegrade color power of final image [0..100] (default 0) : Степень деградации цветности конечной картинки от 0 до 100. Уменьшая общее качество картинки, можно скрыть недостатки наложения лица.0100Export png with alpha channel? [0..1] (default 0) : экспортирует только лицо с альфа каналом для последующей работы в видео редакторе.Итог по наложению лиц.В начале запускаете с отладкой, пробуя различные параметры и смотрите результат.Запомнив подходящие значения, запускаете наложение без отладки.Результат картинок в workspace\data_dst\merged - можно использовать самому в видеоредакторе, либо склеить в видео в п.88)convertedbat Склейка в видео.Следующие .bat файлы склеивают картинки в видео с тем же FPS и звуком, что и data_dst.mp4 - поэтому не удаляйте data_dst.mp4 из workspace папки.to avi.batв формат avito mp4.batв формат mp4to mp4(lossless+alpha).batmp4 без потерь с использованием alpha канала.to mov(lossless+alpha).batmov без потерь с использованием alpha канала. Sony Vegas с использованием QuickTime сможет использовать alpha канал из mov файла.Всё. Результат в workspace\result.mp4Если результат не удовлетворил, можно пробовать разные опции наложения, либо продолжать тренировать для повышения четкости, либо пробовать другую модель, либо пробовать другое исходное лицо.Дополнительная информация:9) util convert aligned PNG to JPG (drop folder on me).batпозволяет конвертировать папку с извлеченными PNG лицами из старых версий DeepFaceLab в JPG. Для этого перетяните папку с набором лиц прямо на этот .bat файл. Известны случаи, когда Windows 10 резервирует % видеопамяти, даже если видеокарта не используется для вывода картинки. В таком случае придётся чем-то жертвовать, чтобы тренировка запустилась (batch size, размерности в SAE, итд).Советы и хитрости.Узкие лица лучше тренируются на широкие лица. Вот почему фейки с Кейджем так популярны.Иногда, если нейронная сеть будет получать dst лица только одного освещения, например, с затенённым носом, при этом src лица не содержат аналогичного лица с таким же освещением, то нейронная сеть может не понять, куда вообще смотрит лицо на некоторых ракурсах, в результате предсказанное лицо будет содержать неправильный поворот головы.В этом случае полезно добавить в тренировочный набор data_dst\aligned лица того же персонажа, но извлеченные из других сцен с другим освещением.Тем самым можно несколько улучшить результат. Но лучше всего, конечно, найти src лица с тем же освещением носа.Продвинутые советы от @GAN-er ( только на английском языке ):Tip 1:You may benefit by starting with a small batch size (within reason) and increasing it later. The reason is that a **large batch size will give you a more accurate descent direction but it will also be costlier to calculate**, and when you just start, you care mostly about the general direction; no need to sacrifice speed for precision at that point. There are plenty of sources discussing the batch size, as an example you can check this one:https://stats.stackexchange.com/questions/164876/tradeoff-batch-size-vs-number-of-iterations-to-train-a-neural-networkTip 2:Unlike the batch size that the only thing that does is affecting how accurate each step will be as far a the true gradient goes, the dimensions, actually, increase the complexity of your NN. As a rule, **the more complex a network the better the resulting model**, but since nothing comes for free, **the more complex the network the more time it will take to converge**.What you generally want is to **_figure out the max dimensions that you can use_** given your GPU's memory, and your desired max batch size.You can set the max batch size to something, say K, and then increase the dimensions until you get OOM errors. In the end, you will end up with a triplet, {batch size, ae_dims, ed_dims}Ideally, you would use 1024 and 85 for your autoencoder and encoder/decoder dimensions, but no card has enough memory for such a configuration even with batch size 1.Remember that unlike batch size that you can change at will, once you set up the dimensions you can not change them.Note that **if you use a complex - high number of dimensions NN, in combination with a small batch size, it will take _considerably_ longer for your model to converge**. So keep that in mind! You will simply have to wait longer, but also you will get a much much better result.For cards with 11Gb of memory, and for SAE you can try the following settings:For DF architecture: 12 698 51 For LIAEF architecture: 8 402 47Tip 3:If you end up being stuck, i.e. the loss does not go down but for no obvious reason or if you get weird artifacts in some previews before you discard and start from scratch, you may want to flip your DST and SRC for a while. This often is all you need to keep things going again.Tip 4:99.995% of your success or failure rate is due to bad SRC or DST sets. This means that 99.995% of your time should be spent in actually ensuring that your sets are well curated. Throwing together a hot podge of material and expecting a decent outcome is guaranteed to result in disappointment. Garbage in, garbage out.Дополнительное описание SAE.Эта модель по сути содержит все другие модели, если отключить тренировку стиля и multiscale decoder.SAE очень гибкая, можно подстроить либо под лучшее обобщение лиц сетью, либо под лучшую четкость изображения, либо просто чтобы заработало на вашей GPU.Если src сборка лиц содержит количество лиц больше чем dst, модель может не сойтись. В этом случае используйте опцию Feed faces to network sorted by yaw.Если src лицо шире чем dst, модель может не сойтись. В этом случае можете попробовать опцию Src face scale modifier в -5.Архитектура df делает лицо более похожее на src, но если модель не сходится, используйте liae.VG архитектура SAE пока что не показала каких-либо улучшений, нужно больше тестов.Если на вашей видеокарте много видеопамяти, вы можете выбрать между большим batch size, которое улучшает обобщение лиц, и Encoder/Decoder dims размерностями, которые улучшают качество картинки.Face стиль тренируется, чтобы перенести цвет лица, освещение, макияж. Если он уже хорошо перенесен, то продолжение тренировки с высоким значением может сделать артефакты.Background стиль тренируется, чтобы перенести контур лица и окружение. Благодаря контуру лица, подгоняется src лицо под контур dst.Как лучше всего тренировать SAE со стилем? Не существует лучшего решения, всё зависит от сцены. Экспериментируйте со style значениями по своему усмотрению. Включите write preview history и отслеживайте изменения. Делайте резервную копию файлов модели каждые 10к эпох. Вы можете откатывать файлы модели и менять значения, если что-то пошло не так в превью-истории.Работа на AMD/Старых NVIDIA/IntelHD видеокартах.DeepFaceLab поддерживает старые процессоры без AVX инструкций. Для этого используйте DeepFaceLabCUDA9.2SSE сборку.DeepFaceLab поддерживает AMD, IntelHD Graphics и любые старые GeForce видеокарты через использование OpenCL 1.2 движка.Для этого используйте DeepFaceLabOpenCLSSE сборку.Работа на OpenCL в сравнении с CUDA имеет некоторые недостатки:- извлечение лиц можно запускать только MT, при этом первый проход (1st pass) всё равно будет работать на CPU, но достаточно быстро! Второй проход работает на OpenCL без проблем.- чтобы запустилась SAE, её нужно урезать существенно как в ae_dims , ed_ch_dims так и в batch size по-сравнению с тем же количеством видеопамяти на CUDA версии. Можете поставить вообще самые минимальные значения, а также разрешение 64 и half face - в качестве демонстрации натренируете фейк без проблем даже на IntelHD Graphics с 256МБ памяти !- каждый запуск тренировки и после сохранения в процессе тренировки, OpenCL будет перезагружать свои подпрограммы, что будет занимать некоторое время.Пожертвование разработке.Если вам нравится данная программа, вы можете пожертвовать денег для дальнейшего развития.Yandex.moneyhttps://money.yandex.ru/to/41001142318065Paypalhttps://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KK5ZCH4JXWMQS&source=urlbitcoin:31mPd6DxPCzbpCMZk4k1koWAbErSyqkAXrПолезные ссылкиСтраница разработкиhttps://github.com/iperov/DeepFaceLabВводная видео инструкция по работе с программойhttps://www.youtube.com/watch?v=K98nTNjXkq8 Мой канал фейковhttps://www.youtube.com/channel/UCEtoVzBLuE-ni-54h7kYvsgПопулярный канал фейков https://www.youtube.com/channel/UCUix6Sk2MZkVOr5PWQrtH1g/videos Фейки на реддитеhttps://www.reddit.com/r/GifFakes Готовые src наборы лиц для DeepFaceLabhttps://mega.nz/#F!y1ERHDaL!PPwg01PQZk0FhWLVo5_MaQ поиск подходящей знаменитости по загруженному лицуhttp://www.pictriev.com поиск подходящей порнозвезды по загруженному лицуhttps://findface.sex/ruhttps://findpornface.comhttps://pornstarbyface.comhttp://www.didshedoporn.com/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG +DeepFaceLab – это программа для замены лица в видео с помощью нейросети, работающей на графическом ускорителе NVIDIA / AMD / IntelHD Graphics.Разработчик: iperovСайт разработчика: https://github.com/iperov/DeepFaceLabРазрядность: 64bitЯзык интерфейса: АнглийскийМинимальные системные требования: Windows 7 и вышепроцессор с поддержкой SSE инструкций2Gb ОЗУ с подкачкойOpenCL-совместимая видеокарта ( NVIDIA, AMD, Intel HD Graphics ) Рекомендуемые системные требования:Windows 7 и вышепроцессор с поддержкой AVX инструкцийNVIDIA видеокарта с 6GB видео, 8Gb ОЗУДоступные сборки:DeepFaceLabCUDA9.2SSE для NVIDIA видеокарт вплоть до GTX1080 и любых 64-бит процессоров.DeepFaceLabCUDA10.1AVX для NVIDIA видеокарт вплоть до RTX и процессоров с поддержкой AVX инструкций.DeepFaceLabOpenCLSSE для AMD видеокарт и любых 64-бит процессоров.Зеркало со старыми версиями: https://mega.nz/#F!b9MzCK4B!zEAG9txu7uaRUjXz9PtBqgОсобенности DeepFaceLab :отсутствие любых предустановок, кроме драйверов на вашу видеокарту. Проверено на чистых Windows 7 и 10, а также в VMWare.работает на любых OpenCL-совместимых видеокартах с памятью от 256Mb и выше, даже довольно старых.автоматически выбирает «лучшую» видеокарту. Так можно работать с офисными приложениями на видеокарте послабее, а тренировка сети будет автоматически на лучшей.есть возможность тренировки полностью на CPU. 8-е поколение процессоров Intel способен выдать неплохой демонстрационный результат за 2 дня тренировки.все необходимые мета-данные лиц хранятся непосредственно в извлеченных JPG файлахесть режим ручного выделения лицесть сортировка извлеченных лиц для быстрого удаления ненужных лиц.быстрая работа с видео: извлечение, удаление шума, сборка финального видеоПриступая, поймите: эта программа не гарантирует идеальной замены лиц во всех случаях! Всё зависит от качества исходных данных, совместимости лиц, источников света, и т.д. и т.п. Да и сама технология появилась недавно (февраль 2018), она далека от идеала, т.к. заменяется только лицо, причём без лба и волос. Вы можете потратить кучу времени и сил, а в итоге ничего не получить! У вас есть невысокий шанс создания успешного фейка с первой попытки. Только когда вы сделаете много попыток создания фейков с разными лицами, тогда вы поймете все нюансы.DeepFaceLab создана на чистом энтузиазме одним человеком. Поэтому, если вы найдете какие-либо ошибки, то отнеситесь к этому с пониманием.Посмотрите вводную видео инструкцию по работе с программой, чтобы получить общее представление о рабочем процессе: https://www.youtube.com/watch?v=K98nTNjXkq8 Обновите драйвера на вашу видеокарту.Первый запуск программы в чистой папке из торрента будет происходить долго, т.к. компилируются GPU программы.Определим термины dst и src.src - это лицо, которое будет использоваться для замены.dst - это лицо, которое будет заменяться.DeepFaceLab\workspace – наша рабочая папка для хранения модели целиком (видео, фото, файлы самой программы). Вы можете переименовывать её, чтобы сохранять как резервную копию или работать с другой.1) clear workspace.batОчистит или создаст все папки внутри папки workspace. Помещаете в папку workspace ваше видео data_src.xxx формата максимум 1080р - это видео откуда брать лицо. Тестовое видео уже содержится в папке workspace.Помещаете в папку workspace ваше видео data_dst.xxx формата максимум 1080р - это видео где заменить лицо. Тестовое видео уже содержится в папке workspace.где xxx - любое расширение видео, например mkv, mp4, avi2) extract PNG from video data_src.batконвертирует видео откуда брать лицо в набор PNG в workspace\data_srcEnter FPS ( ?:help skip:fullfps ) : сколько кадров из каждой секунды видео извлечь, пропустить = все кадры. Здесь мы собираем кадры из которых будем извлекать src лица. Чем их больше тем лучше.3.1) cut video (drop video on me).batопционально. Обрезает видео где заменить лицо, на время которое вы укажите.Нужно перетянуть видео файл на этот .bat файл, при этом оригинальный файл сохраняется, а появляется новый с суффиксом _cutFrom time (skip: 00:00:00.000) : время начала обрезкиTo time (skip: 00:00:00.000) : время конца обрезкиSpecify audio track id. ( skip:0 ) : можно указать аудио дорожку. Полезно, если например вам нужен другой язык из фильма.Bitrate of output file in MB/s ? (default:25) : битрейт выходного файла, пропустить = 25.Тестовое видео, которое уже лежит в папке, обрезать не нужно.3.2) extract PNG from video data_dst FULL FPS.bat конвертирует видео где заменить лицо в набор PNG в workspace\data_dstЗдесь извлечение только с ПОЛНЫМ FPS, потому что каждый кадр должен быть обработан.3.other) denoise extracted data_dst.batDenoise factor? (1-20 default:5) :степень подавления шумаделается перед извлечением dst лиц! делает проход по извлеченным видео кадрам, убирая шум, сохраняя четкими грани.Позволяет тем самым сделать финальный фейк более правдоподобным, т.к. нейронная сеть не способна сделать детальную текстуру кожи, но грани делает вполне четкими.Поэтому, если весь кадр будет более "смазан", то и фейк будет казаться более правдоподобным. Особенно актуально для фильмовых сцен, которые обычно очень четкие.4) data_src extract faces ... .bat производит выборку конечного набора лиц из PNG в папку workspace\data_src\alignedОпции:DLIB, MT, S3FD детекторы.Для src оптимально MT детектор.DLIB – наименее точный, лица получаются с некоторым дрожанием, работает только на NVIDIAMT - меньше дрожания лиц, но производит больше ложных лиц.S3FD медленнее других, требователен к ресурсам, но более точный, меньше ложных лиц.MANUAL - извлечение вручную, полезно для src только для переизвлечения уже извлеченных лиц, если найдены где-то ошибки с помощью 4.2.other) data_src util add landmarks debug images.bat Для этого нужно вручную сделать резервную копию data_src\aligned\ , переместить из этой папки лица в data_src\ , сделать ручное извлечение, затем объединить data_src\aligned с резервной копией.GPUЗдесь либо ALL (все), либо Best (лучший).Если у вас только один GPU, то нет разницы, что выбирать.Если вы работаете в офисных приложениях на слабом GPU, а имеется мощный, то выбираете Best.Для максимальной скорости на мульти-GPU выбираете ALL, но тогда офисная работа на основном GPU может подтормаживать.DEBUGЗаписывает в workspace\data_src\aligned_debug каждый кадр с выделенными лицами и лицевыми точками, тем самым можно смотреть работу детекторов.4.1) data_src check result.batпросмотр результатов выборки лиц с помощью портативной программы XNViewMP.Здесь ваша цель - убрать ненужные лица.Сначала пролистываете скролом и убираете те ненужные лица, которые идут подряд большими группами. Не нужно удалять мелкие группы. Для этого есть сортировка.Если нужное лицо перемешано с другими, то запускаете сортировки следующих пунктах.Сортировку по резкости в любом случае делаете, потому что мутные лица src нужно удалять.4.2.1) data_src sort by blur.batСортировка по резкости. Запускаете и ждете сортировки. Затем смотрите результаты. Самые мутные лица будут в конце. Для src важно убрать мутные лица.4.2.2) data_src sort by similar histogram.batПосле этой сортировки лица будут сгруппированы по содержанию, так что отсеять ненужные лица теперь намного проще.Пролистываете скроллом и удаляете ненужные лица группами.4.2.4) data_src sort by dissimilar histogram.batЭта сортировка оставляет ближе к концу списка те изображения, у которых больше всего похожих.Обычно это лица в анфас, которых больше всего, потому что актёр чаще смотрит прямо на камеру либо куда-то в одном направлении в интервью.Часть с конца списка можете удалить по усмотрению.4.2.5) data_src sort by face pitch.batОпциональный пункт. Сортирует лица так, чтобы вначале списка лицо смотрело вниз, а к концу списка вверх.4.2.5) data_src sort by face yaw.batОпциональный пункт. Сортирует лица так, чтобы вначале списка лицо смотрело налево, а к концу списка - направо.4.2.6) data_src sort by final.batРекомендованный пункт.Target number of images? (default:2000) : ввести целевое количество изображенийАвтоматически делает лучшую финальную выборку лиц из любого количества в целевое количество.Применяйте только после очистки набора лиц другими пунктами, если у вас осталось более чем 2000 лиц.Отсеянные лица перемещаются в мусор (aligned_trash)4.2.other) data_src sort by black.batСортирует по количеству черных пикселей в конец списка. Позволяет отсеять лица вырезанные экраном.4.2.other) data_src sort by one face in image.batПеремещает в мусор (aligned_trash) все изображения, в которых нашлось более 1 лица4.2.other) data_src sort by original filename.batСортирует по оригинальному имени файла4.2.other) data_src util add landmarks debug images.batОпциональный пункт. добавляет к извлеченным data_src лицам изображения с нанесенными лицевыми точками с суффиксом к файлу _debug.jpgЭто позволяет вручную отсеять совсем плохие извлечения из вашего набора src лиц.Перед этим сделайте сортировку по yaw.Имеет смысл удалять только те лица, в которых нанесенные брови ниже чем реальные, или контур челюсти существенно заходит на лицо.После отсеивания удалите вручную все файлы по маске *_debug.jpg4.2.other) data_src util recover original filename.batВосстанавливает оригинальное имя файла извлеченного лица.Итог по извлечению лиц src.Мутные лица надо удалять.Лица закрывающиеся чем-то (рукой, волосами, и т.д.) - также нужно удалять.После приведения набора лиц в надлежащий вид делаем финальную сортировку sort by final.Опционально можете провести пункт 4.2.other) data_src util add landmarks debug images.batВы можете собрать несколько разных наборов лиц одного актёра и затем использовать их в зависимости от условий лица dst, помещая их в папку data_src\aligned5) data_dst extract faces ... .batТо же, что и п.4, с некоторыми отличиями.Здесь мы извлекаем лицо, которое будет заменяться.Детектор DLIB , MT, S3FD ?В большинстве случаев - S3FD.Если лицо не определилось в каком-то кадре, то для этого есть опция +manual fix - позволяет вручную указать лица на кадрах, где вообще не определилось никаких лиц.Подвох с MT+manual fix в том, что на кадре могут определиться ненужные лица кроме главного, поэтому программа не предложит указать лица на этом кадре. В таком случае можете проверить в папке data_dst\aligned_debug какие лица обнаружились вообще.Можете использовать DLIB+исправить, он генерирует меньше ложных лиц.В совсем крайнем случае или для экспериментов есть полностью ручная выборка (manual), т.е. по каждому исходному кадру dst вы вручную проходите и указываете лица.Окно ручного исправления лиц. здесь вам нужно совместить зеленые точки с лицом.Управление:Enter - подтвердить лицо и следующий кадр.Пробел - пропустить кадр., - вернуться на прошлые кадрыКолесо мыши - изменять прямоугольник.5) data_dst extract faces MANUAL FIX DELETED ALIGNED DEBUGОчень важный пункт. Напрямую влияет на качество итогового фейка.позволяет переизвлечь те кадры из dst, чьи results debug из п.5.1 были удалены вами.Для чего это нужно? Чтобы сделать фейк качественнее, нужно проверять dst кадры в папке aligned_debug, просмотреть их можно через п.5.1.Неправильно размеченное dst лицо может приводить к значительному ухудшению качества:Если где-то увидите, что контур лица существенно отличается от реального, например съехало на фон, то удаляете эти кадры из папки aligned_debug (п.5.1), и запускаете этот пункт.Произойдет ручное переизвлечение удалённых кадров. Видео поясняющее этот процесс: https://www.youtube.com/watch?v=7z1ykVVCHhM5.1) data_dst check results debug.batпросмотреть все dst кадры с наложенными поверх них предсказанными контурами лица5.1) data_dst check results.batАналогично смотрим результаты выборки лица dst, и удаляем другие не целевые лица. А целевое лицо, даже мутные - оставляем.5.2) data_dst sort by similar histogram.batЕсли в целевом видео содержатся другие ненужные лица, можете произвести эту сортировку, и затем удалить эти лица будет проще.5.3.other) data_dst sort by original filename.batСортирует по оригинальному имени файла5.3.other) data_dst util recover original filename.batВосстанавливает оригинальное имя файла извлеченного лица.Итог по извлечению лиц dst.Ваша цель извлечь только целевое лицо (даже мутное) из каждого кадра, удалив все другие лица.6) train ... .bat Тренировка.Отключаем любые программы, которые могут использовать видео память.Если в процессе запуска тренировки появилось много текста, содержащее одно из этих слов: Memory ErrorAllocationOOMзначит на вашем GPU модель не запустилась, и вам нужно урезать модель, для этого смотрите описание опций моделей.При первом запуске модели, программа спросит о различных опциях, которые сохранятся и будут использоваться при последующих запусках.Просто нажимая Enter - будут использоваться значения по-умолчанию.Which GPU idx to choose? ( skip: system choice ) : Имея мульти-GPU можно тренировать одну сцену на разных моделях или опциях одной модели без клонирования папок. Просто выбираете индекс GPU на старте тренировки/конвертации и тогда файлы модели в папке workspace\model будут содержать префикс этой GPU в имени.Если оставить выбор GPU по-умолчанию, то выберется лучшая GPU и файлы модели не будут содержать префикс.Write preview history? (y/n skip:n) : писать ли историю превью на дискTarget epoch (skip:unlimited) : целевая эпоха, по достижению которой тренировка остановится.Batch_size (skip:model choice) : выбор размера батча - это то сколько картинок за раз кормится нейронной сети для обучения. По-умолчанию выбирается низкое значение, но вы можете подобрать это значение самому под свою видеокарту. Чем больше - тем лучше.Feed faces to network sorted by yaw? (y/n skip:n) : кормит модели src лица отсортированные по такому же направлению как и dst. Смысл в том, чтобы кормить только нужные лица. Однако пока до конца не протестировано хорошо это или плохо.Flip faces randomly? (y/n ?:help skip:y) : кормит модели все лица случайно перевернутые по горизонтали. При выключенной опции финальное лицо будет более естественным, но тогда src сборка лиц должна покрывать все углы поворота.Src face scale modifier % ( -30...30, ?:help skip:0) : модификатор масштабирования для src лиц. Если src лицо более широкое чем dst и фейк получился плохим, то имеет смысл немного уменьшить это значение.Если модель запускается уже второй раз:Press enter in 2 seconds to override some model settings.если вы нажмете Enter в течение 2х секунд, то появится возможность заменить некоторые опции модели.Список моделей для тренировки. Также указано минимальные требования к памяти GPU.H64 (2GB+)половина лица с разрешением 64 - это как оригинальная FakeApp или FaceSwap, только лучше за счёт тренировки маски нейросетью + исключающей фон вокруг лица + исправленного конвертора. Для видеокарт с видеопамятью 2 и 3Гб данная модель работает в сокращенном режиме, т.е. качество будет хуже чем с 4GB.H128 (3GB+)как H64 только с разрешением 128. Однако половина лица может плохо обучится на некоторых условиях света и поворота головы и т.д. Для видеокарт с видеопамятью 3 и 4Gb данная модель работает в сокращенном режиме, т.е. качество будет хуже чем с 5Gb.Опции для H64 и H128:Use lightweight autoencoder? (y/n, ?:help skip:n) :выбрать урезанную модель. Необходимо для видеокарт с <= 4Gb видео памяти.DF (5GB+)модель от dfaker. Полнолицевая модель с разрешением 128, умная функция тренировки лиц, исключающая фон вокруг лица.LIAEF128 (5GB+) как DF, только пытается морфировать исходное лицо в целевое лицо, сохраняя черты исходного лица. Морфирование не всегда хорошо, и может сделать вообще не узнаваемое лицо, в таком случае выбирайте DF.Опции H64, H128, DF, LIAEF128 моделей:Use pixel loss? (y/n, ?:help skip: n/default ) :позволяет быстрее улучшать мелкие детали и убрать дрожание. Включать только после 20к эпох.SAE (512MB+) Самая последняя лучшая и гибкая модель. Содержит все другие модели. Есть возможность переносить стиль лица и освещение, которое будет изучаться непосредственно нейронной сетью. При первом запуске можно настроить различные параметры. Эти параметры влияют на то, какого размера будет сеть и запустится ли на вашей видеокарте, так что можно подстроить модель на тренировку как на 512MB так и на 24GB. Конечно же, чем больше памяти, тем лучше качество получится в итоге.Пример фейка Cage-Trump: https://www.youtube.com/watch?v=2R_aqHBClUQПример фейка Elon Musk - Robert Downey jr: https://www.youtube.com/watch?v=OLWFnPwzgEYОпции только для SAE модели:Resolution ( 64-256 ?:help skip:128) : разрешение лица. Больше разрешение - больше требуется памяти, дольше тренируется модель. Вы можете выбрать любое значение от 64 до 256 кратное 16.Half or Full face? (h/f, ?:help skip:f) : половинный или полный размер лицаLearn mask? (y/n, ?:help skip:y) : учить ли маску. С изучением, маска будет более сглаженной и менее дрожащей, иначе будет использоваться грубая. Однако при стилизованной тренировки можно обойтись без изучения маски.AE architecture (df, liae, vg ?:help skip:df) : тип архитектуры нейронной сети. AutoEncoder dims (128-1024 ?:help skip:%d) : количество размерностей сети, больше - лучше, но может не запуститься из-за нехватки памяти. Можно уменьшать для достижения работоспособности на вашей видеокарте.Encoder/Decoder dims per channel (21-85 ?:help skip:%d) количество размерностей енкодера/декодера сети, больше - лучше, но может не запуститься из-за нехватки памяти. Можно уменьшать для достижения работоспособности на вашей видеокарте.Use lightweight encoder? (y/n, ?:help skip:n) : использовать ли облегченный энкодер, он быстрее на 35%, только не тестирован на различных сценах.Use multiscale decoder? (y/n, ?:help skip:n) : использовать ли многомасштабный декодер, позволяет добиться более высокой четкости. Use pixel loss? (y/n, ?:help skip: n/default ) позволяет быстрее улучшать мелкие детали и убрать дрожание. Включать только после 20к эпох.Face style power ( 0.0 .. 100.0 ?:help skip:%.1f) : скорость изучения переноса стиля лица, таких как освещение и цвет. Может вызывать артефакты при больших значениях. Число с плавающей точкой. 0 - не учитьBackground style power ( 0.0 .. 100.0 ?:help skip:%.1f) : скорость изучения фона вокруг лица. В большинстве случаев морфирует лицо в dst. Число с плавающей точкой. 0 - не учитьВ процессе тренировки можно выходить через Enter, нажав его в окне Training preview, и запускать в любое время, модель будет продолжать обсчитываться с той же точки.Тренируем от 24 часов и больше. Когда результат удовлетворяет - выходим также через Enter, нажав его в окне Training preview.Кнопка 'p'(на англ раскладке) в окне Training preview обновляет предпросмотр.В окне Training preview также мы видим кривую ошибки. Понижаясь, она показывает прогресс тренировки с течением времени.Итог по тренировке.Выбираете модель в зависимости от сцены и вашего личного опыта.7) convert ... .bat Наложение лиц.Выбираете ту модель и тот номер GPU (если у вас их несколько), с которым тренировали.Опция debug позволяет посмотреть процесс наложения лиц и некоторую техническую информацию по каждому кадру в консоли, нажимаете пробел в окне просмотра.Основная концепция наложения лиц.Далее при запуске программа спросит об опциях:Choose mode: (1) overlay, (2) hist match, (3) hist match bw, (4) seamless (default), (5) raw :Выбор режима наложения лиц.РежимыOverlayпрямое наложение предсказанного лица из нейросети без предварительной обработкиHist-matchналожение с уравниванием гистограммы.Histh-match-bwналожение с уравниванием гистограммы из чернобелого канала.Seamlessналожение методом Пуассо"Poisson image editing." ACM Transactions on Graphics (TOG). Vol. 22. No. 3. ACM, 2003.Rawполучить сырые слои для собственной обработки в видео редакторе, например After Effects.По-умолчанию, если нажать Enter - выберет seamless.Какую выбрать? Зависит от случая. Пробуете все и смотрите результат.ОпцииSuppress seamless jitter? [ y/n ] (?:help skip:n ) :Для режима seamless. Подавляет дрожание лица, возникающее только в seamless режиме. Включение этой опции сделает процесс конвертации в несколько раз дольше.Seamless hist match? (y/n skip:n) :Для режима seamless. Включить ли уравнивание гистограммы.Masked hist match? (y/n skip:y) :Для режимов hist match, hist match bw, seamless, указывает, уравнивать ли гистограмму по маске лица.Use predicted mask? (y/n skip:y) : Использовать ли маску, которая предсказана моделью (только если маска изучалась, например в SAE модели можно выключить изучение маски) - по умолчанию да. Либо использовать маску из dst лица.NoYesChoose erode mask modifier [-200..200] (default 0) :Указываете насколько уменьшить в размерах dst маску. Значение < 0 - расширить маску. Это адаптивное значение, а не абсолютное.-100+100Choose seamless erode mask modifier [-100..100] (default 0) : только для режима seamless - модификация размеров маски, использующейся для самой seamless функции. Значение < 0 - расширить маску. Эта маска задаёт непосредственно шов, по которому будет проходить адаптация цвета.0+40 Choose blur mask modifier [-200..200] (default 0) : Указываете насколько сгладить dst маску. Значение < 0 - уменьшает сглаживание по-умолчанию моделями H64 и H128. Это адаптивное значение, а не абсолютное.-200+200Hist match threshold. [0..255] (default - 255) :Уменьшение значения подавляет артефакты для режимов с уравниванием гистограммы.(по-умолчанию) 255231Choose output face scale modifier [-50..50] (default 0) : изменить масштаб выходного лица в пределах -50+50%. Полезно, когда предсказанное лицо несколько больше оригинала.-50+50Apply color transfer to predicted face? Choose mode ( rct/lct skip:None ) : дополнительно адаптировать цвет лица, используя rct или lct алгоритмDst лицоПредсказанное лицоrctlctDegrade color power of final image [0..100] (default 0) : Степень деградации цветности конечной картинки от 0 до 100. Уменьшая общее качество картинки, можно скрыть недостатки наложения лица.0100Export png with alpha channel? [0..1] (default 0) : экспортирует только лицо с альфа каналом для последующей работы в видео редакторе.Итог по наложению лиц.В начале запускаете с отладкой, пробуя различные параметры и смотрите результат.Запомнив подходящие значения, запускаете наложение без отладки.Результат картинок в workspace\data_dst\merged - можно использовать самому в видеоредакторе, либо склеить в видео в п.88)convertedbat Склейка в видео.Следующие .bat файлы склеивают картинки в видео с тем же FPS и звуком, что и data_dst.mp4 - поэтому не удаляйте data_dst.mp4 из workspace папки.to avi.batв формат avito mp4.batв формат mp4to mp4(lossless+alpha).batmp4 без потерь с использованием alpha канала.to mov(lossless+alpha).batmov без потерь с использованием alpha канала. Sony Vegas с использованием QuickTime сможет использовать alpha канал из mov файла.Всё. Результат в workspace\result.mp4Если результат не удовлетворил, можно пробовать разные опции наложения, либо продолжать тренировать для повышения четкости, либо пробовать другую модель, либо пробовать другое исходное лицо.Дополнительная информация:9) util convert aligned PNG to JPG (drop folder on me).batпозволяет конвертировать папку с извлеченными PNG лицами из старых версий DeepFaceLab в JPG. Для этого перетяните папку с набором лиц прямо на этот .bat файл. Известны случаи, когда Windows 10 резервирует % видеопамяти, даже если видеокарта не используется для вывода картинки. В таком случае придётся чем-то жертвовать, чтобы тренировка запустилась (batch size, размерности в SAE, итд).Советы и хитрости.Узкие лица лучше тренируются на широкие лица. Вот почему фейки с Кейджем так популярны.Иногда, если нейронная сеть будет получать dst лица только одного освещения, например, с затенённым носом, при этом src лица не содержат аналогичного лица с таким же освещением, то нейронная сеть может не понять, куда вообще смотрит лицо на некоторых ракурсах, в результате предсказанное лицо будет содержать неправильный поворот головы.В этом случае полезно добавить в тренировочный набор data_dst\aligned лица того же персонажа, но извлеченные из других сцен с другим освещением.Тем самым можно несколько улучшить результат. Но лучше всего, конечно, найти src лица с тем же освещением носа.Продвинутые советы от @GAN-er ( только на английском языке ):Tip 1:You may benefit by starting with a small batch size (within reason) and increasing it later. The reason is that a **large batch size will give you a more accurate descent direction but it will also be costlier to calculate**, and when you just start, you care mostly about the general direction; no need to sacrifice speed for precision at that point. There are plenty of sources discussing the batch size, as an example you can check this one:https://stats.stackexchange.com/questions/164876/tradeoff-batch-size-vs-number-of-iterations-to-train-a-neural-networkTip 2:Unlike the batch size that the only thing that does is affecting how accurate each step will be as far a the true gradient goes, the dimensions, actually, increase the complexity of your NN. As a rule, **the more complex a network the better the resulting model**, but since nothing comes for free, **the more complex the network the more time it will take to converge**.What you generally want is to **_figure out the max dimensions that you can use_** given your GPU's memory, and your desired max batch size.You can set the max batch size to something, say K, and then increase the dimensions until you get OOM errors. In the end, you will end up with a triplet, {batch size, ae_dims, ed_dims}Ideally, you would use 1024 and 85 for your autoencoder and encoder/decoder dimensions, but no card has enough memory for such a configuration even with batch size 1.Remember that unlike batch size that you can change at will, once you set up the dimensions you can not change them.Note that **if you use a complex - high number of dimensions NN, in combination with a small batch size, it will take _considerably_ longer for your model to converge**. So keep that in mind! You will simply have to wait longer, but also you will get a much much better result.For cards with 11Gb of memory, and for SAE you can try the following settings:For DF architecture: 12 698 51 For LIAEF architecture: 8 402 47Tip 3:If you end up being stuck, i.e. the loss does not go down but for no obvious reason or if you get weird artifacts in some previews before you discard and start from scratch, you may want to flip your DST and SRC for a while. This often is all you need to keep things going again.Tip 4:99.995% of your success or failure rate is due to bad SRC or DST sets. This means that 99.995% of your time should be spent in actually ensuring that your sets are well curated. Throwing together a hot podge of material and expecting a decent outcome is guaranteed to result in disappointment. Garbage in, garbage out.Дополнительное описание SAE.Эта модель по сути содержит все другие модели, если отключить тренировку стиля и multiscale decoder.SAE очень гибкая, можно подстроить либо под лучшее обобщение лиц сетью, либо под лучшую четкость изображения, либо просто чтобы заработало на вашей GPU.Если src сборка лиц содержит количество лиц больше чем dst, модель может не сойтись. В этом случае используйте опцию Feed faces to network sorted by yaw.Если src лицо шире чем dst, модель может не сойтись. В этом случае можете попробовать опцию Src face scale modifier в -5.Архитектура df делает лицо более похожее на src, но если модель не сходится, используйте liae.VG архитектура SAE пока что не показала каких-либо улучшений, нужно больше тестов.Если на вашей видеокарте много видеопамяти, вы можете выбрать между большим batch size, которое улучшает обобщение лиц, и Encoder/Decoder dims размерностями, которые улучшают качество картинки.Face стиль тренируется, чтобы перенести цвет лица, освещение, макияж. Если он уже хорошо перенесен, то продолжение тренировки с высоким значением может сделать артефакты.Background стиль тренируется, чтобы перенести контур лица и окружение. Благодаря контуру лица, подгоняется src лицо под контур dst.Как лучше всего тренировать SAE со стилем? Не существует лучшего решения, всё зависит от сцены. Экспериментируйте со style значениями по своему усмотрению. Включите write preview history и отслеживайте изменения. Делайте резервную копию файлов модели каждые 10к эпох. Вы можете откатывать файлы модели и менять значения, если что-то пошло не так в превью-истории.Работа на AMD/Старых NVIDIA/IntelHD видеокартах.DeepFaceLab поддерживает старые процессоры без AVX инструкций. Для этого используйте DeepFaceLabCUDA9.2SSE сборку.DeepFaceLab поддерживает AMD, IntelHD Graphics и любые старые GeForce видеокарты через использование OpenCL 1.2 движка.Для этого используйте DeepFaceLabOpenCLSSE сборку.Работа на OpenCL в сравнении с CUDA имеет некоторые недостатки:- извлечение лиц можно запускать только MT, при этом первый проход (1st pass) всё равно будет работать на CPU, но достаточно быстро! Второй проход работает на OpenCL без проблем.- чтобы запустилась SAE, её нужно урезать существенно как в ae_dims , ed_ch_dims так и в batch size по-сравнению с тем же количеством видеопамяти на CUDA версии. Можете поставить вообще самые минимальные значения, а также разрешение 64 и half face - в качестве демонстрации натренируете фейк без проблем даже на IntelHD Graphics с 256МБ памяти !- каждый запуск тренировки и после сохранения в процессе тренировки, OpenCL будет перезагружать свои подпрограммы, что будет занимать некоторое время.Пожертвование разработке.Если вам нравится данная программа, вы можете пожертвовать денег для дальнейшего развития.Yandex.moneyhttps://money.yandex.ru/to/41001142318065Paypalhttps://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KK5ZCH4JXWMQS&source=urlbitcoin:31mPd6DxPCzbpCMZk4k1koWAbErSyqkAXrПолезные ссылкиСтраница разработкиhttps://github.com/iperov/DeepFaceLabВводная видео инструкция по работе с программойhttps://www.youtube.com/watch?v=K98nTNjXkq8 Мой канал фейковhttps://www.youtube.com/channel/UCEtoVzBLuE-ni-54h7kYvsgПопулярный канал фейков https://www.youtube.com/channel/UCUix6Sk2MZkVOr5PWQrtH1g/videos Фейки на реддитеhttps://www.reddit.com/r/GifFakes Готовые src наборы лиц для DeepFaceLabhttps://mega.nz/#F!y1ERHDaL!PPwg01PQZk0FhWLVo5_MaQ поиск подходящей знаменитости по загруженному лицуhttp://www.pictriev.com поиск подходящей порнозвезды по загруженному лицуhttps://findface.sex/ruhttps://findpornface.comhttps://pornstarbyface.comhttp://www.didshedoporn.com/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG BwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACAAYADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA @@ -46694,4 +46694,4 @@ AFzb+dfn3qP/AB8N/vGiivr8J/DifLYv4jQ8P9639I+81FFdByRE/wCW6/71P07/AI+R/vUUVUth z/yC5v8AcP8AKvx1/wCCmf8AyUD8/wCtFFc9TdmmX7r1PlWw/wCPdfxqRP8Aj7H0oorza2x9hT2P o79ib/kaV+o/rX35oH/Ityf7o/kaKK4aXxI5cV1PyV/4Lpf8lY0P/rh/Wvz5vv8AXN/vUUV9fhPg PmsVui/pv3G+lbml/wCs/CiiunqckjM1T/kJJ9TV7QP9cv8Av0UVc9icP8Z2Fj/qV+prgPHH/IWX -/fH8xRRUQ6ndiNkf/9k=ckpoonckpoon62019-03-07T16:50:00Z2019-03-08T16:05:00Z2019-03-09T05:58:00Z2923478127256Microsoft Office Word022763falseНазвание1false31974falsefalse12.0000 \ No newline at end of file +/fH8xRRUQ6ndiNkf/9k=ckpoonckpoon132019-03-07T16:50:00Z2019-03-08T16:05:00Z2019-03-10T18:38:00Z3423479427327Microsoft Office Word022764falseНазвание1false32057falsefalse12.0000 \ No newline at end of file diff --git a/facelib/2DFAN-4.h5 b/facelib/2DFAN-4.h5 index 9d995f9..4a4f46e 100644 Binary files a/facelib/2DFAN-4.h5 and b/facelib/2DFAN-4.h5 differ diff --git a/facelib/LandmarksExtractor.py b/facelib/LandmarksExtractor.py index 210fd5c..8a8a38c 100644 --- a/facelib/LandmarksExtractor.py +++ b/facelib/LandmarksExtractor.py @@ -3,101 +3,18 @@ import os import cv2 from pathlib import Path -def transform(point, center, scale, resolution): - pt = np.array ( [point[0], point[1], 1.0] ) - h = 200.0 * scale - m = np.eye(3) - m[0,0] = resolution / h - m[1,1] = resolution / h - m[0,2] = resolution * ( -center[0] / h + 0.5 ) - m[1,2] = resolution * ( -center[1] / h + 0.5 ) - m = np.linalg.inv(m) - return np.matmul (m, pt)[0:2] - -def crop(image, center, scale, resolution=256.0): - ul = transform([1, 1], center, scale, resolution).astype( np.int ) - br = transform([resolution, resolution], center, scale, resolution).astype( np.int ) - if image.ndim > 2: - newDim = np.array([br[1] - ul[1], br[0] - ul[0], image.shape[2]], dtype=np.int32) - newImg = np.zeros(newDim, dtype=np.uint8) - else: - newDim = np.array([br[1] - ul[1], br[0] - ul[0]], dtype=np.int) - newImg = np.zeros(newDim, dtype=np.uint8) - ht = image.shape[0] - wd = image.shape[1] - newX = np.array([max(1, -ul[0] + 1), min(br[0], wd) - ul[0]], dtype=np.int32) - newY = np.array([max(1, -ul[1] + 1), min(br[1], ht) - ul[1]], dtype=np.int32) - oldX = np.array([max(1, ul[0] + 1), min(br[0], wd)], dtype=np.int32) - oldY = np.array([max(1, ul[1] + 1), min(br[1], ht)], dtype=np.int32) - newImg[newY[0] - 1:newY[1], newX[0] - 1:newX[1] ] = image[oldY[0] - 1:oldY[1], oldX[0] - 1:oldX[1], :] - newImg = cv2.resize(newImg, dsize=(int(resolution), int(resolution)), interpolation=cv2.INTER_LINEAR) - return newImg - -def get_pts_from_predict(a, center, scale): - b = a.reshape ( (a.shape[0], a.shape[1]*a.shape[2]) ) - c = b.argmax(1).reshape ( (a.shape[0], 1) ).repeat(2, axis=1).astype(np.float) - c[:,0] %= a.shape[2] - c[:,1] = np.apply_along_axis ( lambda x: np.floor(x / a.shape[2]), 0, c[:,1] ) - for i in range(a.shape[0]): - pX, pY = int(c[i,0]), int(c[i,1]) - if pX > 0 and pX < 63 and pY > 0 and pY < 63: - diff = np.array ( [a[i,pY,pX+1]-a[i,pY,pX-1], a[i,pY+1,pX]-a[i,pY-1,pX]] ) - c[i] += np.sign(diff)*0.25 - - c += 0.5 - return [ transform (c[i], center, scale, a.shape[2]) for i in range(a.shape[0]) ] - - class LandmarksExtractor(object): def __init__ (self, keras): self.keras = keras K = self.keras.backend - class TorchBatchNorm2D(self.keras.layers.Layer): - def __init__(self, axis=-1, momentum=0.99, epsilon=1e-3, **kwargs): - super(TorchBatchNorm2D, self).__init__(**kwargs) - self.supports_masking = True - self.axis = axis - self.momentum = momentum - self.epsilon = epsilon - - def build(self, input_shape): - dim = input_shape[self.axis] - if dim is None: - raise ValueError('Axis ' + str(self.axis) + ' of ' 'input tensor should have a defined dimension ' 'but the layer received an input with shape ' + str(input_shape) + '.') - shape = (dim,) - self.gamma = self.add_weight(shape=shape, name='gamma', initializer='ones', regularizer=None, constraint=None) - self.beta = self.add_weight(shape=shape, name='beta', initializer='zeros', regularizer=None, constraint=None) - self.moving_mean = self.add_weight(shape=shape, name='moving_mean', initializer='zeros', trainable=False) - self.moving_variance = self.add_weight(shape=shape, name='moving_variance', initializer='ones', trainable=False) - self.built = True - - def call(self, inputs, training=None): - input_shape = K.int_shape(inputs) - - broadcast_shape = [1] * len(input_shape) - broadcast_shape[self.axis] = input_shape[self.axis] - - broadcast_moving_mean = K.reshape(self.moving_mean, broadcast_shape) - broadcast_moving_variance = K.reshape(self.moving_variance, broadcast_shape) - broadcast_gamma = K.reshape(self.gamma, broadcast_shape) - broadcast_beta = K.reshape(self.beta, broadcast_shape) - invstd = K.ones (shape=broadcast_shape, dtype='float32') / K.sqrt(broadcast_moving_variance + K.constant(self.epsilon, dtype='float32')) - - return (inputs - broadcast_moving_mean) * invstd * broadcast_gamma + broadcast_beta - - def get_config(self): - config = { 'axis': self.axis, 'momentum': self.momentum, 'epsilon': self.epsilon } - base_config = super(TorchBatchNorm2D, self).get_config() - return dict(list(base_config.items()) + list(config.items())) - self.TorchBatchNorm2D = TorchBatchNorm2D - + def __enter__(self): keras_model_path = Path(__file__).parent / "2DFAN-4.h5" if not keras_model_path.exists(): return None - self.keras_model = self.keras.models.load_model ( str(keras_model_path), custom_objects={'TorchBatchNorm2D': self.TorchBatchNorm2D} ) + self.keras_model = self.keras.models.load_model (str(keras_model_path)) return self @@ -116,13 +33,58 @@ class LandmarksExtractor(object): center[1] -= (bottom - top) * 0.12 scale = (right - left + bottom - top) / 195.0 - image = crop(input_image, center, scale).transpose ( (2,0,1) ).astype(np.float32) / 255.0 + image = self.crop(input_image, center, scale).astype(np.float32) image = np.expand_dims(image, 0) - predicted = self.keras_model.predict (image) - - pts_img = get_pts_from_predict ( predicted[-1], center, scale) + predicted = self.keras_model.predict (image).transpose (0,3,1,2) + + pts_img = self.get_pts_from_predict ( predicted[-1], center, scale) pts_img = [ ( int(pt[0]), int(pt[1]) ) for pt in pts_img ] landmarks.append ( ( (left, top, right, bottom),pts_img ) ) return landmarks + + def transform(self, point, center, scale, resolution): + pt = np.array ( [point[0], point[1], 1.0] ) + h = 200.0 * scale + m = np.eye(3) + m[0,0] = resolution / h + m[1,1] = resolution / h + m[0,2] = resolution * ( -center[0] / h + 0.5 ) + m[1,2] = resolution * ( -center[1] / h + 0.5 ) + m = np.linalg.inv(m) + return np.matmul (m, pt)[0:2] + + def crop(self, image, center, scale, resolution=256.0): + ul = self.transform([1, 1], center, scale, resolution).astype( np.int ) + br = self.transform([resolution, resolution], center, scale, resolution).astype( np.int ) + if image.ndim > 2: + newDim = np.array([br[1] - ul[1], br[0] - ul[0], image.shape[2]], dtype=np.int32) + newImg = np.zeros(newDim, dtype=np.uint8) + else: + newDim = np.array([br[1] - ul[1], br[0] - ul[0]], dtype=np.int) + newImg = np.zeros(newDim, dtype=np.uint8) + ht = image.shape[0] + wd = image.shape[1] + newX = np.array([max(1, -ul[0] + 1), min(br[0], wd) - ul[0]], dtype=np.int32) + newY = np.array([max(1, -ul[1] + 1), min(br[1], ht) - ul[1]], dtype=np.int32) + oldX = np.array([max(1, ul[0] + 1), min(br[0], wd)], dtype=np.int32) + oldY = np.array([max(1, ul[1] + 1), min(br[1], ht)], dtype=np.int32) + newImg[newY[0] - 1:newY[1], newX[0] - 1:newX[1] ] = image[oldY[0] - 1:oldY[1], oldX[0] - 1:oldX[1], :] + newImg = cv2.resize(newImg, dsize=(int(resolution), int(resolution)), interpolation=cv2.INTER_LINEAR) + return newImg + + def get_pts_from_predict(self, a, center, scale): + b = a.reshape ( (a.shape[0], a.shape[1]*a.shape[2]) ) + c = b.argmax(1).reshape ( (a.shape[0], 1) ).repeat(2, axis=1).astype(np.float) + c[:,0] %= a.shape[2] + c[:,1] = np.apply_along_axis ( lambda x: np.floor(x / a.shape[2]), 0, c[:,1] ) + + for i in range(a.shape[0]): + pX, pY = int(c[i,0]), int(c[i,1]) + if pX > 0 and pX < 63 and pY > 0 and pY < 63: + diff = np.array ( [a[i,pY,pX+1]-a[i,pY,pX-1], a[i,pY+1,pX]-a[i,pY-1,pX]] ) + c[i] += np.sign(diff)*0.25 + + c += 0.5 + return [ self.transform (c[i], center, scale, a.shape[2]) for i in range(a.shape[0]) ] \ No newline at end of file diff --git a/facelib/S3FD.h5 b/facelib/S3FD.h5 new file mode 100644 index 0000000..f9229f3 Binary files /dev/null and b/facelib/S3FD.h5 differ diff --git a/facelib/__init__.py b/facelib/__init__.py index ebe0907..6340745 100644 --- a/facelib/__init__.py +++ b/facelib/__init__.py @@ -1,4 +1,5 @@ from .FaceType import FaceType from .DLIBExtractor import DLIBExtractor from .MTCExtractor import MTCExtractor +from .S3FDExtractor import S3FDExtractor from .LandmarksExtractor import LandmarksExtractor \ No newline at end of file diff --git a/main.py b/main.py index 5a3d72f..182ee24 100644 --- a/main.py +++ b/main.py @@ -39,7 +39,7 @@ if __name__ == "__main__": extract_parser.add_argument('--output-dir', required=True, action=fixPathAction, dest="output_dir", help="Output directory. This is where the extracted files will be stored.") extract_parser.add_argument('--debug', action="store_true", dest="debug", default=False, help="Writes debug images to [output_dir]_debug\ directory.") extract_parser.add_argument('--face-type', dest="face_type", choices=['half_face', 'full_face', 'head', 'avatar', 'mark_only'], default='full_face', help="Default 'full_face'. Don't change this option, currently all models uses 'full_face'") - extract_parser.add_argument('--detector', dest="detector", choices=['dlib','mt','manual'], default='dlib', help="Type of detector. Default 'dlib'. 'mt' (MTCNNv1) - faster, better, almost no jitter, perfect for gathering thousands faces for src-set. It is also good for dst-set, but can generate false faces in frames where main face not recognized! In this case for dst-set use either 'dlib' with '--manual-fix' or '--detector manual'. Manual detector suitable only for dst-set.") + extract_parser.add_argument('--detector', dest="detector", choices=['dlib','mt','s3fd','manual'], default='dlib', help="Type of detector. Default 'dlib'. 'mt' (MTCNNv1) - faster, better, almost no jitter, perfect for gathering thousands faces for src-set. It is also good for dst-set, but can generate false faces in frames where main face not recognized! In this case for dst-set use either 'dlib' with '--manual-fix' or '--detector manual'. Manual detector suitable only for dst-set.") extract_parser.add_argument('--multi-gpu', action="store_true", dest="multi_gpu", default=False, help="Enables multi GPU.") extract_parser.add_argument('--manual-fix', action="store_true", dest="manual_fix", default=False, help="Enables manual extract only frames where faces were not recognized.") extract_parser.add_argument('--manual-output-debug-fix', action="store_true", dest="manual_output_debug_fix", default=False, help="Performs manual reextract input-dir frames which were deleted from [output_dir]_debug\ dir.") diff --git a/mainscripts/Extractor.py b/mainscripts/Extractor.py index 7aa7be1..eddf66f 100644 --- a/mainscripts/Extractor.py +++ b/mainscripts/Extractor.py @@ -6,6 +6,7 @@ import multiprocessing import shutil from pathlib import Path import numpy as np +import mathlib import cv2 from utils import Path_utils from utils.DFLJPG import DFLJPG @@ -47,6 +48,9 @@ class ExtractSubprocessor(Subprocessor): elif self.detector == 'dlib': nnlib.import_dlib (device_config) self.e = facelib.DLIBExtractor(nnlib.dlib) + elif self.detector == 's3fd': + nnlib.import_all (device_config) + self.e = facelib.S3FDExtractor() else: raise ValueError ("Wrond detector type.") @@ -104,15 +108,11 @@ class ExtractSubprocessor(Subprocessor): debug_output_file = '{}{}'.format( str(Path(str(self.output_path) + '_debug') / filename_path.stem), '.jpg') debug_image = image.copy() - for (face_idx, face) in enumerate(faces): - output_file = '{}_{}{}'.format(str(self.output_path / filename_path.stem), str(face_idx), '.jpg') - - rect = face[0] + face_idx = 0 + for face in faces: + rect = np.array(face[0]) image_landmarks = np.array(face[1]) - if self.debug: - LandmarksProcessor.draw_rect_landmarks (debug_image, rect, image_landmarks, self.image_size, self.face_type) - if self.face_type == FaceType.MARK_ONLY: face_image = image face_image_landmarks = image_landmarks @@ -120,6 +120,20 @@ class ExtractSubprocessor(Subprocessor): image_to_face_mat = LandmarksProcessor.get_transform_mat (image_landmarks, self.image_size, self.face_type) face_image = cv2.warpAffine(image, image_to_face_mat, (self.image_size, self.image_size), cv2.INTER_LANCZOS4) face_image_landmarks = LandmarksProcessor.transform_points (image_landmarks, image_to_face_mat) + + landmarks_bbox = LandmarksProcessor.transform_points ( [ (0,0), (0,self.image_size-1), (self.image_size-1, self.image_size-1), (self.image_size-1,0) ], image_to_face_mat, True) + + rect_area = mathlib.polygon_area(np.array(rect[[0,2,2,0]]), np.array(rect[[1,1,3,3]])) + landmarks_area = mathlib.polygon_area(landmarks_bbox[:,0], landmarks_bbox[:,1] ) + + if landmarks_area > 4*rect_area: #get rid of faces which umeyama-landmark-area > 4*detector-rect-area + continue + + if self.debug: + LandmarksProcessor.draw_rect_landmarks (debug_image, rect, image_landmarks, self.image_size, self.face_type) + + output_file = '{}_{}{}'.format(str(self.output_path / filename_path.stem), str(face_idx), '.jpg') + face_idx += 1 if src_dflimg is not None: #if extracting from dflimg just copy it in order not to lose quality @@ -199,13 +213,13 @@ class ExtractSubprocessor(Subprocessor): cpu_only = True if not cpu_only and (type == 'rects' or type == 'landmarks'): - if type == 'rects' and self.detector == 'mt' and nnlib.device.backend == "plaidML": + if type == 'rects' and (self.detector == 'mt' or self.detector == 's3fd') and nnlib.device.backend == "plaidML": cpu_only = True else: if multi_gpu: devices = nnlib.device.getValidDevicesWithAtLeastTotalMemoryGB(2) if not multi_gpu or len(devices) == 0: - devices = [nnlib.device.getBestValidDeviceIdx()] + devices = [nnlib.device.getBestValidDeviceIdx()] if len(devices) == 0: devices = [0] @@ -213,7 +227,7 @@ class ExtractSubprocessor(Subprocessor): dev_name = nnlib.device.getDeviceName(idx) dev_vram = nnlib.device.getDeviceVRAMTotalGb(idx) - if not self.manual and ( (self.type == 'rects') ): + if not self.manual and ( self.type == 'rects' and self.detector != 's3fd' ): for i in range ( int (max (1, dev_vram / 2) ) ): yield (idx, 'GPU', '%s #%d' % (dev_name,i) , dev_vram) else: diff --git a/mathlib/__init__.py b/mathlib/__init__.py index 9780bac..3b038f3 100644 --- a/mathlib/__init__.py +++ b/mathlib/__init__.py @@ -19,4 +19,7 @@ def rotationMatrixToEulerAngles(R) : x = math.atan2(-R[1,2], R[1,1]) y = math.atan2(-R[2,0], sy) z = 0 - return np.array([x, y, z]) \ No newline at end of file + return np.array([x, y, z]) + +def polygon_area(x,y): + return 0.5*np.abs(np.dot(x,np.roll(y,1))-np.dot(y,np.roll(x,1))) \ No newline at end of file