Время прочтения: 4 мин.
В наше время конфиденциальность и защита личности в интернете, чуть ли не первостепенная задача. Для ее решения нужно реализовать обезличивание лица. Анонимизации необходима при достижении конфиденциальности и защиты личности, для защиты детей в Интернете, а именно обезличивание несовершеннолетних, также репортажи новостей или журналистов (например, людей, которые не давали разрешение на разглашение своего лица).
Реализуем два метода анонимизации лиц:
- Размытие по Гауссу
2. Пиксельное размытие
Примерный алгоритм:
- С помощью компьютерного зрения и модели по распознаванию лиц, находим лица людей;
- Обрезаем ROI лица;
- Анонимизируем лица;
- Объединяем оригинальное фото и обезличиное лицо.
Для начала импортируем необходимые библиотеки:
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
Далее загружаем модель для распознавания лиц. Обычные детекторы лиц включают:
- Каскады Хаара;
- HOG + Линейный SVM;
- Детекторы лиц на основе глубокого обучения.
В своей разработке я буду использовать модель на основе глубокого обучения. При использовании модели глубокой нейронной сети OpenCV с моделями Caffe вам понадобятся два набора файлов:
- Файлы prototxt, определяют архитектуру модели (т. е. сами слои)
- Файлы 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])
Результаты обезличивания двумя методами: размытия и пикселизации.
Для примера давайте изменим фактор размытия для уменьшения вероятности идентифицировать личность человека и возьмем фактор 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()
Результат:
Такое же действие проводим и с видео. Делим его на кадры, обезличиваем каждый, затем снова собираем результативное видео. Таким образом, был реализован алгоритм для обезличивания фото, видео и видеопотока с камеры способами пикселизации и размытия.