Мой пост в прошлом месяце объяснил задачу Facebook по обнаружению дипфейков и создал новые рамки лица с помощью OpenCV и GAN (генератора и дискриминатора).
Все пошло быстро!
- Задача переместилась в эту задачу Kaggle; у него есть больше видео, и любой может зарегистрироваться.
- Я узнал, что дипфейки обычно не используют GAN; вместо этого они используют автоэнкодеры.
Планирование следующих шагов
Что касается моих запланированных шагов по обнаружению дипфейков, мой следующий шаг — классификатор реальных и фальшивых сцен одного актера, а также карта внимания, показывающая, какие пиксели использует классификатор. Сосредоточение внимания на одном актере означает, что я буду заниматься распознаванием лиц, что является более простой задачей, чем обнаружение дипфейков, но… маленькими шагами.
Один актер, одна сцена
Сцена снимается перед дверью и имеет шесть альтернативных лиц. Задача связана с двумя методами дипфейка (названными Методом А и Методом Б), и один из альтернативных вариантов присутствует в обоих методах.
Я решил использовать OpenCV, чтобы обрезать область вокруг головы актера. Я выбираю разные 240 кадров исходного видео и 80 последующих кадров трех фальшивых лиц, поэтому обучающие данные будут сбалансированы и не будут иметь идентичных кадров для сравнения.
Я сделал двоичный классификатор, который, по словам TensorFlow, был очень точным, но инструмент изображения, который я использовал, ожидал многоклассового вывода от ImageNet. После попытки подделать вывод ImageNet я подумал о переходе на ELI5, но у него возникли трудности с работой с разными слоями из TensorFlow и Keras.
Начните с конвейера, который работает
Я хочу перенести изображения в двоичный классификатор и вывести прогноз из некоторой структуры объяснимого ИИ. Я наткнулся на shap для значений Шепли. Я начал с их примера Imagenet, который работает, как и было обещано:
Следующим моим шагом было поменять местами мои видеокадры в качестве исходных данных. Imagenet ожидает входное изображение 224x224, поэтому я изменил размер одного кадра из оригинального и поддельного источников.Image.open("./mlin/training/originals/face38.jpg").resize((224, 224), Image.ANTIALIAS)
В стране Imagenet эти изображения соответствовали «абайе» или другим предметам одежды.
Обучение пользовательского классификатора изображений
Я искал классификатор изображений Keras и нашел это руководство.
Вставив эту модель в наш существующий код, я сначала был впечатлен — данные обучения точны на 75–85%! Затем я увидел, что кадры проверки были не такими точными.
Выборка из двух проверочных кадров (исходное лицо слева, дипфейк справа) намекает на две проблемы:
- Положение двери и свет вокруг головы актера включены в качестве важных данных о пикселях.
- Классификатор ожидает, что лицо находится в постоянном положении, вероятно, из первых кадров видео.
Моя интерпретация заключается в том, что мы включили слишком много пикселей, которые были слишком близко друг к другу, на этапе генерации данных.
Разнообразие пикселей
Я распределил свои тренировочные данные, выбрав случайным образом 25% кадров с обнаружением лиц, пока у меня не будет достаточно данных для работы. Я также разрешаю поддельные кадры из одного и того же таймфрейма видео. Здесь мы видим две подделки и оригинал:
Синие отголоски в первых двух очень похожи на меня, только немного смещены вверх или вниз. Я видел аналогичные результаты на оригиналах, а затем переобучил модель для изображения, которое вы видите здесь.
Интересно, что в оригинальном видео весовая шкала составляет примерно 1/3 диапазона, который мы видели в поддельных видео.
Идти вперед
Текущий код находится здесь (блокнот CoLab плохо делится) https://gist.github.com/mapmeld/0730b9e3e9a7baf68b937c30ff04e9a9
Я нашел конвейер для обучения нейронной сети и объяснения результатов с помощью карты изображений SHAP. Это позволит мне подтвердить, что окончательный детектор дипфейков проверяет лица пользователей, а не постороннюю информацию на фоне. Как бы то ни было, я не уверен, что мои тренировочные рамки были достаточно разнообразны. Иногда я смотрю на слой 7 или 8 с моей картой изображений SHAP, и он выглядит по-другому. Иногда я перезапускаю код и не могу создать красочную карту изображений. В будущем я постараюсь больше понять, что там происходит внутри. Я сделаю больше кадров для будущего обучения и проверки.