Время прочтения: 4 мин.

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

Реализуем два метода анонимизации лиц:

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

2. Пиксельное размытие

Примерный алгоритм:

  1. С помощью компьютерного зрения и модели по распознаванию лиц, находим лица людей;
  2. Обрезаем ROI лица;
  3. Анонимизируем лица;
  4. Объединяем оригинальное фото и обезличиное лицо.

Для начала импортируем необходимые библиотеки:

from imutils.video import VideoStream
import numpy as np
import imutils
import time
import cv2
from tqdm import tqdm
import os

Реализуем функцию размытия лица используя «Размытие Гаусса»:

def blur_face(img, f=3.0):
    (height, widht) = img.shape[:2]
    kof_widht = int(widht / f)
    kof_height = int(height / f)
    if kof_widht % 2 == 0:
        kof_widht -= 1
    if kof_height % 2 == 0:
        kof_height -= 1
    	return cv2.GaussianBlur(img, (kof_widht, kof_height), 0)

Такую же функцию реализуем для «Пиксельного размытия», где сначала вычисляем длину и ширину фото, и делим на количество пикселей. Каждый пиксель заполним средним цветом по контуру.

def pixel_face(img, b=3):
    (height, widht) = img.shape[:2]
    x = np.linspace(0, widht, b + 1, dtype="int")
    y = np.linspace(0, height, b + 1, dtype="int")
    for i in range(1, len(y)):
        for j in range(1, len(x)):
            X_1 = x[j - 1]
            Y_1 = y[i - 1]
            X_2 = x[j]
            Y_2 = y[i]

            ROI = img[Y_1:Y_2, X_1:X_2]
            (B, G, R) = [int(k) for k in cv2.mean(ROI)[:3]]
            cv2.rectangle(img, (X_1, Y_1), (X_2, Y_2),
                (B, G, R), -1)
    return img

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

  1. Каскады Хаара;
  2. HOG + Линейный SVM;
  3. Детекторы лиц на основе глубокого обучения.

В своей разработке я буду использовать модель на основе глубокого обучения. При использовании модели глубокой нейронной сети OpenCV с моделями Caffe вам понадобятся два набора файлов:

  1. Файлы prototxt, определяют архитектуру модели (т. е. сами слои)
  2. Файлы caffemodel содержат веса для реальных слоев.

Оба файла необходимы при использовании моделей, обученных с использованием caffe для глубокого обучения.

Однако найти файлы prototxt можно только здесь, в репозитории GitHub OpenCV.

Детектор лиц с глубоким обучением OpenCV основан на платформе детектора одиночных снимков (SSD) с базовой сетью ResNet (в отличие от других OpenCV SSDs, которые обычно используют MobileNet в качестве базовой сети). Caffe модель можно взять в репозитории Github learnopencv.

Приступаем к реализации анонимизации лиц на фото, видео и видеопотоке с веб-камеры. Начнем с фото. Вычисляем вероятность обнаружения, если она больше 0.5, то это наше лицо. Получаем координаты ROI, далее анонимизируем лицо, и накладываем на оригинал.

for i in range(0, detect.shape[2]):
    find = detect[0, 0, i, 2]
    if find > 0.5:
        object_detect = detect[0, 0, i, 3:7] * np.array([widht, height, widht, height])
        (X_1, Y_1, X_2, Y_2) = object_detect.astype("int")
        roi = img[Y_1:Y_2, X_1:X_2]
        if method == "blur":
            roi = blur_face(roi, f=3.0)
        elif method == "pixel":
            roi = pixel_face(roi,
                b=20)
        img[Y_1:Y_2, X_1:X_2] = roi
img_output = np.hstack([image_original, img])

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

Рисунок 1. Обезличивание методом пикселизации с 20 блоками
Рисунок 2. Обезличивание методом размытия с фактором 3

Для примера давайте изменим фактор размытия для уменьшения вероятности идентифицировать личность человека и возьмем фактор 2.

Рисунок 3. Обезличивание методом размытия с фактором 2

Далее реализуем функцию обезличивания в реальном времени с веб-камеры, и для примера возьмем метод пикселизации. Суть такая же как и с фото, только обезличиваем каждый кадр видеопотока.

stream = VideoStream(src=0).start()
method="pixel"
while True:
    f_stream = stream.read()
    f_stream = imutils.resize(f_stream, width=400)
    (height, widht) = f_stream.shape[:2]
    img_blob = cv2.dnn.blobFromImage(f_stream, 1.0, (300, 300),
                                 (104.0, 177.0, 123.0))
    model.setInput(img_blob)
    detect = model.forward()

Результат:

Рисунок 4. Обезличивание видеопотока методом пикселизации

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