NTA

Анонимизация лиц на фото, видео и веб-камере с помощью OpenCV и Python

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

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

  1. Размытие по Гауссу
  2. Пиксельное размытие

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

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

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

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

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. Обезличивание видеопотока методом пикселизации

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

0
Комментарии
Читать все 0 комментариев
null