Разблокирование силы размытия лиц в медиа всестороннее исследование и сравнение моделей

Анализ и сравнение моделей размытия лиц в медиа

Сравнение различных алгоритмов обнаружения и размытия лиц

Обработанное фото OSPAN ALI на Unsplash

В современном мире, основанном на данных, обеспечение конфиденциальности и анонимности личностей является важнейшей задачей. От защиты личных идентификаторов до соблюдения строгих нормативов, таких как GDPR, необходимость в эффективных и надежных решениях для анонимизации лиц в различных медиаформатах никогда не была такой велика.

Содержание

  • Введение
  • Обнаружение лиц – Haar Cascade – MTCNN – YOLO
  • Размытие лиц – Гауссово размытие – Пикселизация
  • Результаты и обсуждение – Работа в режиме реального времени – Оценка на основе сценариев – Конфиденциальность
  • Использование в видео
  • Веб-приложение
  • Заключение

Введение

В данном проекте мы исследуем и сравниваем несколько решений по размытию лиц и разрабатываем веб-приложение, которое позволяет легко оценить их эффективность. Давайте рассмотрим разнообразные приложения, стимулирующие спрос на такую систему:

  • Сохранение конфиденциальности
  • Навигация по регуляторным ландшафтам: В условиях быстро меняющегося регулирующего окружения отрасли и регионы всего мира настаивают на более строгих нормах для защиты личности людей.
  • Конфиденциальность тренировочных данных: Модели машинного обучения нуждаются в разнообразных и хорошо подготовленных тренировочных данных. Однако обмен такими данными часто требует тщательной анонимизации.

Это решение можно разделить на две основные компоненты:

  • Обнаружение лиц
  • Техники размытия лиц

Обнаружение лиц

Для решения задачи анонимизации первым шагом является определение области изображения, где присутствует лицо. Для этой цели я протестировал три модели для обнаружения изображений.

Haar Cascade

Рисунок 1. Хаар-подобные признаки (источник - оригинальная статья)

Haar Cascade – это метод машинного обучения, используемый для обнаружения объектов, таких как лица, на изображениях или видео. Он работает путем использования набора обученных признаков, называемых “хаар-подобными признаками” (Рисунок 1), которые являются простыми прямоугольными фильтрами, фокусирующимися на изменениях интенсивности пикселей внутри областей изображения. Эти признаки могут захватывать грани, углы и другие характеристики, характерные для лиц.

Процесс обучения включает предоставление алгоритму положительных примеров (изображений, содержащих лица) и отрицательных примеров (изображений без лиц). Затем алгоритм настраивает веса признаков, чтобы научиться различать эти примеры. После обучения Haar Cascade становится иерархией классификаторов, каждый из которых последовательно улучшает процесс обнаружения.

Для обнаружения лиц я использовал предобученную модель Haar Cascade, обученную на изображениях лиц, смотрящих вперед.

import cv2face_cascade = cv2.CascadeClassifier('./configs/haarcascade_frontalface_default.xml')def haar(image):    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))    print(len(faces) + " общее количество обнаруженных лиц.")    for (x, y, w, h) in faces:        print(f"Обнаружено лицо в рамке {x} {y} {x+w} {y+h}")

MTCNN

Рисунок 2. Процесс обнаружения лиц в MTCNN (источник - оригинальная статья)

MTCNN (Multi-Task Cascaded Convolutional Networks) является сложным и высокоточным алгоритмом обнаружения лиц, превосходящим возможности Haar Cascade. Разработанный для достижения высокой точности в сценариях с разными размерами лиц, ориентациями и условиями освещения, MTCNN использует серию нейронных сетей, каждая из которых адаптирована для выполнения определенных задач в процессе обнаружения лиц.

  • Фаза первая — генерация предложений: MTCNN начинает процесс, генерируя множество потенциальных областей лиц (ограничивающие рамки) с помощью небольшой нейронной сети.
  • Фаза вторая — уточнение: Кандидаты, сгенерированные на первой фазе, проходят фильтрацию на этом шаге. Вторая нейронная сеть оценивает предложенные ограничивающие рамки, корректируя их положение для более точного выравнивания с истинными границами лиц. Это помогает улучшить точность.
  • Фаза третья — точки особенностей лица: На этом этапе определяются особые точки лица, такие как углы глаз, нос и рот. Нейронная сеть используется для точного определения этих особенностей.

Каскадная архитектура MTCNN позволяет быстро отбросить области, не содержащие лиц, на ранних этапах процесса, сосредотачивая вычисления на областях с более высокой вероятностью наличия лиц. Его способность обрабатывать лица разных масштабов и повороты делает его особенно подходящим для сложных сценариев по сравнению с каскадами Хаара. Однако его вычислительная интенсивность обусловлена его последовательным подходом, основанным на нейронной сети.

Для реализации MTCNN я использовал библиотеку mtcnn.

import cv2from mtcnn import MTCNNdetector = MTCNN()def mtcnn_detector(image):    faces = detector.detect_faces(image)    print(len(faces) + " общее количество обнаруженных лиц.")    for face in faces:        x, y, w, h = face['box']        print(f"Обнаружено лицо в рамке {x} {y} {x+w} {y+h}")

YOLOv5

Рисунок 3. Процесс обнаружения объектов YOLO (источник — оригинальная статья)

YOLO (You Only Look Once) — это алгоритм, используемый для обнаружения множества объектов, включая лица. В отличие от своих предшественников, YOLO выполняет обнаружение за один проход через нейронную сеть, что делает его более быстрым и подходящим для реального времени и видео. Процесс обнаружения лиц в медиафайлах с помощью YOLO можно разделить на четыре части:

  • Деление изображения на сетку: Входное изображение делится на сетку ячеек. Каждая ячейка отвечает за предсказание объектов, находящихся внутри ее границ. Для каждой ячейки YOLO предсказывает ограничивающие рамки, вероятности объектов и вероятности классов.
  • Предсказание ограничивающих рамок: В каждой ячейке YOLO предсказывает одну или несколько ограничивающих рамок вместе с соответствующими вероятностями. Эти ограничивающие рамки представляют потенциальные местоположения объектов. Каждая ограничивающая рамка определяется координатами ее центра, шириной, высотой и вероятностью наличия объекта в этой рамке.
  • Предсказание классов: Для каждой ограничивающей рамки YOLO предсказывает вероятности разных классов (например, «лицо», «автомобиль», «собака»), к которым может принадлежать объект.
  • Non-Maximum Suppression (NMS): Чтобы устранить дублирующиеся ограничивающие рамки, YOLO применяет NMS. Этот процесс отбрасывает избыточные ограничивающие рамки, оценивая их вероятности и перекрытие с другими рамками, оставляя только наиболее уверенные и не перекрывающиеся.

Основным преимуществом YOLO является его скорость. Поскольку он обрабатывает всё изображение за один проход через нейронную сеть, он значительно быстрее, чем алгоритмы, основанные на скользящих окнах или предложениях областей. Однако эта скорость может иметь небольшой компромисс с точностью, особенно для маленьких объектов или переполненных сцен.

YOLO может быть адаптирован для обнаружения лиц путем обучения его на специфических данных о лицах и модификации классов вывода, чтобы включить только один класс («лицо»). Для этого я использовал библиотеку «yoloface», построенную на основе YOLOv5.

import cv2from yoloface import face_analysisface=face_analysis()def yolo_face_detection(image):    img,box,conf=face.face_detection(image, model='tiny')    print(len(box) + " общее количество обнаруженных лиц.")    for i in range(len(box)):        x, y, h, w = box[i]        print(f"Обнаружено лицо в рамке {x} {y} {x+w} {y+h}")

Размытие лица

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

Рисунок 4. Ссылочное изображение от Этана Хувера на Unsplash

Размытие по Гауссу

Рисунок 5. Размытое ссылочное изображение (Рисунок 4) с размытием по Гауссу

Размытие по Гауссу – это техника обработки изображений, используемая для снижения шума и размытия деталей. Это особенно полезно в области размытия лиц, так как удаляет специфические детали из этой части изображения. Оно вычисляет среднее значение пикселей в окрестности каждого пикселя. Это среднее значение центрировано вокруг размытого пикселя и вычисляется с использованием гауссового распределения, придавая больший вес близким пикселям и меньший вес дальним. Результатом является смягченное изображение с уменьшенным шумом высокой частоты и мелкими деталями. Результат применения размытия по Гауссу показан на Рисунке 5.

Размытие по Гауссу имеет три параметра:

  1. Часть изображения, которую нужно размыть.
  2. Размер ядра: матрица, используемая для операции размытия. Больший размер ядра приводит к более сильному размытию.
  3. Стандартное отклонение: более высокое значение усиливает эффект размытия.
f = image[y:y + h, x:x + w]blurred_face = cv2.GaussianBlur(f, (99, 99), 15)  # Вы можете настроить параметры размытияimage[y:y + h, x:x + w] = blurred_face

Пикселизация

Рисунок 6. Размытое ссылочное изображение (Рисунок 4) с пикселизацией

Пикселизация – это техника обработки изображений, при которой пиксели на изображении заменяются большими блоками одного цвета. Этот эффект достигается путем разделения изображения на сетку ячеек, где каждая ячейка соответствует группе пикселей. Цвет или интенсивность всех пикселей в ячейке берется как среднее значение цветов всех пикселей в этой ячейке, и это среднее значение применяется ко всем пикселям в ячейке. Этот процесс создает упрощенный вид, уменьшая уровень мелких деталей на изображении. Результат применения пикселизации показан на Рисунке 6. Как можно заметить, пикселизация значительно затрудняет идентификацию личности человека.

Пикселизация имеет один основной параметр, который определяет, сколько сгруппированных пикселей должно представлять определенную область. Например, если у нас есть секция (10,10) изображения, содержащая лицо, она будет заменена 10×10 группой пикселей. Меньшее число приводит к более сильному размытию.

f = image[y:y + h, x:x + w]f = cv2.resize(f, (10, 10), interpolation=cv2.INTER_NEAREST)image[y:y + h, x:x + w] = cv2.resize(f, (w, h), interpolation=cv2.INTER_NEAREST)

Результаты и обсуждение

Я буду оценивать разные алгоритмы с двух точек зрения: анализ производительности в режиме реального времени и конкретные сценарии изображений.

Производительность в режиме реального времени

Используя то же самое ссылочное изображение (Рисунок 4), было измерено время, необходимое для обнаружения ограничивающей рамки лица на изображении для каждого алгоритма обнаружения лица. Результаты основаны на среднем значении из 10 измерений для каждого алгоритма. Время, необходимое для алгоритмов размытия, незначительно и не будет учитываться в процессе оценки.

Рисунок 4. Среднее время в секундах, необходимое для обнаружения лица каждым алгоритмом

Можно заметить, что YOLOv5 достигает лучшей производительности (скорости), благодаря своей однопроходной обработке через нейронную сеть. В отличие от этого, методы, такие как MTCNN, требуют последовательного прохода через несколько нейронных сетей. Это дополнительно усложняет процесс параллелизации алгоритма.

Работа алгоритмов в различных сценариях

Для оценки производительности вышеуказанных алгоритмов, помимо референтного изображения (Рисунок 4), я выбрал несколько изображений, которые тестируют алгоритмы в различных сценариях:

  1. Референтное изображение (Рисунок 4)
  2. Группа людей, находящихся близко друг к другу — для оценки способности алгоритма захватывать различные размеры лиц, некоторые ближе, а некоторые дальше (Рисунок 8)
  3. Лица в профиль — тестирование способности алгоритмов обнаруживать лица, не смотрящие прямо на камеру (Рисунок 10)
  4. Перевернутое лицо на 180 градусов — тестирование способности алгоритмов обнаруживать лицо, повернутое на 180 градусов (Рисунок 11)
  5. Перевернутое лицо на 90 градусов — тестирование способности алгоритмов обнаруживать лицо, повернутое на 90 градусов боком (Рисунок 12)
Рисунок 8. Группа людей, фото Николаса Грина на Unsplash
Рисунок 9. Несколько лиц, фото Наассома Азеведо на Unsplash
Рисунок 10. Лица в профиль, фото Kraken Images на Unsplash
Рисунок 11. Перевернутое лицо на 180 градусов от Рисунка 4
Рисунок 12. Перевернутое лицо на 90 градусов от Рисунка 4

Метод Хаара

Алгоритм Метод Хаара в целом хорошо справляется с анонимизацией лиц, за исключением некоторых случаев. Он успешно обнаруживает референтное изображение (Рисунок 4) и сценарий “Несколько лиц” (Рисунок 9) отлично. В сценарии “Группа людей” (Рисунок 8) он справляется с задачей достойно, хотя есть лица, которые не полностью обнаружены или находятся дальше. Метод Хаара сталкивается с проблемой обнаружения лиц, не смотрящих прямо на камеру (Рисунок 10) и повернутых лиц (Рисунки 11 и 12), где он не распознает лица полностью.

Рисунок 13. Результаты с использованием метода Хаара

MTCNN

MTCNN достигает очень похожих результатов на Метод Хаара, с теми же сильными и слабыми сторонами. Кроме того, MTCNN имеет проблемы с обнаружением лица на Рисунке 9 с более темным цветом кожи.

Рисунок 14. Результаты с использованием MTCNN

YOLOv5

YOLOv5 дает немного отличающиеся результаты от Haar Cascade и MTCNN. Он успешно обнаруживает одно из лиц, когда люди не смотрят прямо в камеру (рисунок 10), а также лицо, повернутое на 180 градусов (рисунок 11). Однако на изображении “Группа людей” (рисунок 8) он не обнаруживает лица, находящиеся дальше, так эффективно, как предыдущие алгоритмы.

Рисунок 15. Результаты с YOLOv5

Конфиденциальность

При решении проблемы конфиденциальности в обработке изображений важно учесть деликатный баланс между обеспечением неразличимости лиц и сохранением естественного вида изображений.

Размытие Гаусса

Размытие Гаусса эффективно размывает область лица на изображении (как показано на рисунке 5). Однако его успех зависит от параметров гауссового распределения, используемого для эффекта размытия. На рисунке 5 явно видно, что черты лица остаются различимыми, что указывает на необходимость использования большего стандартного отклонения и размеров ядра для достижения оптимальных результатов.

Пикселизация

Пикселизация (как показано на рисунке 6) чаще всего выглядит более приятной для глаза человека, поскольку она знакома как метод размытия лица по сравнению с размытием Гаусса. Количество пикселей, используемых для пикселизации, играет важную роль в этом контексте, поскольку меньшее количество пикселей делает лицо менее различимым, но может привести к менее естественному виду.

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

Реверс-инжиниринг

С развитием инструментов искусственного интеллекта становится необходимым предвидеть возможность применения техник реверс-инжиниринга, направленных на удаление конфиденциальных фильтров с размытых изображений. Тем не менее, сам факт размытия лица необратимо заменяет конкретные детали лица более обобщенными. На данный момент инструменты искусственного интеллекта способны обратно инжинирить размытое лицо только при наличии четких исходных изображений этого же человека. Парадоксально, это противоречит необходимости реверс-инжиниринга в первую очередь, так как это предполагает знание личности человека. Таким образом, размытие лица является эффективным и необходимым средством защиты конфиденциальности перед развивающимися возможностями искусственного интеллекта.

Применение в видео

Поскольку видео в основном являются последовательностью изображений, относительно легко модифицировать каждый алгоритм для анонимизации видео. Однако здесь важно время обработки. Для данного 30-секундного видео, записанного с частотой 60 кадров в секунду, алгоритмы должны обработать 1800 кадров. В этом контексте алгоритмы, такие как MTCNN, не будут возможными, несмотря на их улучшения в определенных сценариях. Поэтому я решил реализовать анонимизацию видео с использованием модели YOLO.

import cv2from yoloface import face_analysisface=face_analysis()def yolo_face_detection_video(video_path, output_path, pixelate):    cap = cv2.VideoCapture(video_path)    if not cap.isOpened():        raise ValueError("Could not open video file")    # Получение свойств видео    fps = int(cap.get(cv2.CAP_PROP_FPS))    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))    frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))    # Определение кодека и создание объекта VideoWriter для выходного видео    fourcc = cv2.VideoWriter_fourcc(*'H264')    out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))    while cap.isOpened():        ret, frame = cap.read()        if not ret:            break        tm = time.time()        img, box, conf = face.face_detection(frame_arr=frame, frame_status=True, model='tiny')        print(pixelate)        for i in range(len(box)):            x, y, h, w = box[i]            if pixelate:                f = img[y:y + h, x:x + w]                f = cv2.resize(f, (10, 10), interpolation=cv2.INTER_NEAREST)                img[y:y + h, x:x + w] = cv2.resize(f, (w, h), interpolation=cv2.INTER_NEAREST)            else:                blurred_face = cv2.GaussianBlur(img[y:y + h, x:x + w], (99, 99), 30)  # Вы можете настраивать параметры размытия                img[y:y + h, x:x + w] = blurred_face        print(time.time() - tm)        out.write(img)    cap.release()    out.release()    cv2.destroyAllWindows()

Веб-приложение

Для упрощенной оценки различных алгоритмов я создал веб-приложение, в котором пользователи могут загружать любые изображения или видео, выбирать алгоритм обнаружения лиц и размытия, и после обработки получать результат. Реализация была выполнена с использованием Flask и Python на серверной стороне, используя упомянутые библиотеки, а также OpenCV, и React.js на клиентской стороне для взаимодействия пользователя с моделями. Полный код доступен по этой ссылке.

Заключение

В рамках этого поста были исследованы, сравнены и проанализированы различные алгоритмы обнаружения лиц, включая Haar Cascade, MTCNN и YOLOv5, по разным аспектам. Проект также сосредоточился на техниках размытия изображений.

Haar Cascade оказался эффективным методом в определенных сценариях, обладая общей хорошей временной производительностью. MTCNN выделяется как алгоритм с надежными возможностями обнаружения лиц в различных условиях, хотя он имеет проблемы с лицами, которые не находятся в обычной ориентации. YOLOv5, с его возможностями реального времени обнаружения лиц, является отличным выбором для сценариев, где время является критическим фактором (например, видео), однако с небольшим снижением точности в групповых ситуациях.

Все алгоритмы и техники были интегрированы в одно веб-приложение. Это приложение обеспечивает легкий доступ и использование всех методов обнаружения лиц и размытия, а также возможность обработки видео с использованием техник размытия.

Этот пост является заключением моей работы для курса “Цифровая обработка изображений” на факультете компьютерных наук и инженерии в Скопье. Спасибо за чтение!