Я давно интересуюсь машинным обучением и нейронными сетями. Недавно один юзер на реддите(ну вы же все знаете, да?) опубликовал программное обеспечение, готовое для преобразования одних лиц на другие.
Это круто и я даже попробовал(в культурных целях, естесственно... Хехехе). Одна проблема, которая меня коснулась - отбор видеофрагментов с лицами крупным планом(если это возможно). Если брать в рассчет популярных личностей, то можно найти интервью какое-нибудь долгое или просто качественное. Главное, что там зачастую есть крупные планы. И вот эти самые крупные планы будут в разы полезнее, чем вся информация о целевом лице из видео.
Поставил себе задачу: написать скрипт, который с помощью глубоких нейронных сетей будет вычленять из видео фрагменты именно с крупными планами. Ну и так как понятие крупного плана растяжимое, то я просто ввел как параметр ширину лица в пикселях на картинке. Для определения ширины лица просто брал один кадр крупного плана и руками измерял ширину лица в пикселях и брал значение на 10% меньше того, что определил. Это для того, чтобы если крупные планы не всегда настолько крупные, как на взятом кадре, не потерять полезную для сети deepfakesapp информацию.
В итоге провел тестирование на Эмме Уотсон(я заметил, многим она нравится. Мне вот почему-то нет), на нескольких найденных на ютубе видео. В одном видео крупных планов не особо много, но много фрагментов без лиц(программа сначала находит лицо, потом проверяет размер и принимает решение о валидности кадра). Во втором есть много крупных планов ведущего. А третье - просто большое интервью.
В итоге первое и третье - отработали как надо.
Со вторым вопросы у меня, но буду как-то оптимизировать. Может стоит настроить LSTM слои, чтобы запоминалось лицо по признакам и не брать в рассчет другие лица. Тут думать надо.
Ну и по классике - сначала результат. Вдруг кому для той же deepfakesapp пригодится. Видео без звука. Ссылка на МЕГА-диск, может быть не очень быстрая скачка. https://mega.nz/#!rk8wGDAK!RUdyOo5gPA4QAQwyrlOJjjk6l459--Szo...
Если кому пригодится скрипт в будущем, то оптимизирую код и выложу в доступ.
P.S. Лайфкахи deepfakesapp:
1) Если при обучении не хватает ракурсов повернутой головы направо(или налево), но в есть ракурсы в другую сторону, то зеркальное отображение по горизонтали хорошо отрабатывает и сетка лучше учиться. С поворотом головы вверх-вниз, конечно, не работает :)
2) Если для обучения системы недостаточно оперативной памяти(мне вот моих 16Гб не всегда хватает), лучше выбрать необходимые ракурсы лица(учитывая эмоции), которое будет переноситься на будущий видеоролик. Это не так сложно, как кажется, но процесс обучения будет легче. Ну и с оперативной памятью ниже 16Гб лучше не подходить к обучению, т.к. либо библиотеки для обучения будет мало, либо все будет происходить очень медленно(даже если установлена топовая видеокарта). Также можно уменьшить количество кадров набора для обучения рандомом, оставив 3000-4000 кадров(у меня тогда хватает оперативы), но результат после рандома не всегда удовлетворительный.
3) Декодеры и энкодеры можно сохранять отдельными файлами, если есть желание передать их кому-либо или "преобразовать" несколько видеороликов с одной личностью.
4) Если у вас нет хорошей видеокарты, но есть у друга(настоящего, а не того, кому нужны итоговые видео), то можно подготовить вырезанные с помощью deepfakesapp лица и попросить обучить сеть своего друга. Если он не знает о программе, то не догадается в чем состоят ваши цели(наверное).