La visión por computadora protege la privacidad





La prevención es nuestro todo. La protección competente contra fugas de datos ayudará a prevenir consecuencias negativas que pueden conducir a pérdidas multimillonarias. En el mundo moderno, cada una de las organizaciones procesa y almacena información confidencial. Cuando se trata de grandes organizaciones, los volúmenes de información confidencial son enormes. El estado de "seguridad" de una computadora es un ideal conceptual que se logra cuando cada usuario observa todas las reglas de seguridad de la información.



Mientras está en la oficina, cualquier empleado deja su computadora de vez en cuando, y luego la computadora encendida está desatendida, a menudo con archivos y carpetas abiertos para el acceso, ya que muchos empleados simplemente olvidan bloquear su computadora, o no lo hacen a propósito, guiados por una frase similar. - "Retrocedí cinco metros, ¿por qué bloquearlo?" Desafortunadamente, esos momentos pueden ser utilizados por otros empleados interesados ​​en los materiales.







¿Cómo puede garantizar la seguridad de los datos en tales situaciones? Una forma sería utilizar tecnologías de autenticación biométrica para reconocer a los usuarios por sus rostros.



El reconocimiento facial no es un concepto nuevo y actualmente existen muchas herramientas para esta tarea. Si no está particularmente versado en métodos y herramientas para el reconocimiento facial, entonces usar la biblioteca de visión por computadora de código abierto (biblioteca de visión por computadora de código abierto) y el lenguaje de programación Python será una excelente solución que le permitirá alcanzar su objetivo lo más rápido posible.







Nos hemos decidido por el software, necesitamos un hardware más: una cámara web. ¿Cómo se configura el reconocimiento facial ahora? Primero, necesita detectar la cara en el marco. Uno de los métodos para detectar rostros es el método Viola-Jones, que ya se describió en 2001. Ya que estamos más interesados ​​en la práctica, no entraremos en detalles teóricos, solo mencionaremos que el método se basa en principios tan básicos como la transformación de una imagen en una representación integral, el método de la ventana de escaneo y el uso de características de Haar. Puede leer la descripción del método y ver información sobre la instalación de OpenCV en el sitio web oficial . A continuación se muestra el código Python que nos permitirá detectar rostros desde la transmisión de video de la cámara web:



import cv2 as cv
import numpy as np

face_cascade = 'haarcascade_frontalface_default.xml'
cam = 1

classifier = cv.CascadeClassifier(face_cascade)

video_stream = cv.VideoCapture(cam)
while True:
    retval, frame = video_stream.read()
    gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    found_faces = classifier.detectMultiScale(gray_frame, 1.2, 5, minSize=(197, 197))

    for x, y, w, h in found_faces:
        cv.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

    cv.namedWindow('Stream', cv.WINDOW_NORMAL)
    cv.imshow('Stream', frame)

    k = cv.waitKey(30) & 0xFF
    if k == 27:
        break

video_stream.release()
cv.destroyAllWindows()


En el código anterior, primero importamos los dos módulos necesarios para trabajar: cv2 (visión por computadora) y numpy (trabajando con matrices). En la variable face_cascade, guarde la ruta al archivo xml con Haar cascades. Este archivo, así como otros, por ejemplo para la detección de ojos, se pueden encontrar en la página de github.



En la variable cam escribimos el número de la cámara web, si hay varias conectadas, el número de la única cámara conectada por defecto es 0. A continuación, se crea un objeto clasificador mediante el método CascadeClassifier y la conexión a la cámara es cv.VideoCapture (cam). Luego, en un bucle, leemos las imágenes cuadro por cuadro en la variable de cuadro usando el método read (). El clasificador procesa una imagen en escala de grises, por lo tanto, utilizando el método cvtColor, transformamos la imagen en la forma deseada. El método detectMultiScale devuelve una lista con los parámetros de todas las caras detectadas, que es un rectángulo: la coordenada del vértice (x, y) y el ancho y alto del rectángulo (w, h). Las siguientes líneas son opcionales para que el programa funcione, pero son útiles para la depuración: el método del rectángulo agrega un marco al marco de origen en el lugar de la cara detectada e imshow muestra una ventana con un flujo de video.



Aquí todo es bastante simple, pero más interesante aún. Ahora necesitamos reconocer la cara. ¿Cómo hacerlo? OpenCV contiene varios métodos para el reconocimiento facial, entre los que se encuentra el método LBPH (Local Binary Patterns Histograms). Aquí nos detendremos con más detalle y entenderemos un poco cómo funciona.



En general, se toman los valores de brillo del píxel de la imagen y ocho píxeles más que rodean al original. Resulta una tabla de 3x3 con valores de brillo de píxeles. Luego se escribe 0 o 1 en la misma tabla. Si el valor de brillo del píxel más externo excede el valor de brillo del píxel central, se establece 1, de lo contrario - 0. Luego, el código resultante se lee en el sentido de las agujas del reloj desde la celda superior izquierda, se convierte a un número decimal y se escribe este número en una matriz del tamaño de una imagen en la posición adecuada. Y así para cada píxel.







La matriz se divide en un cierto número de segmentos (por defecto, esta es una cuadrícula de 8 × 8), se construye un histograma para cada segmento, y al final, al concatenar los histogramas, se obtiene un resultado que caracteriza la imagen completa. Durante el reconocimiento, se traza el mismo histograma para la imagen estudiada, que luego se compara con los datos de entrenamiento.







Usaremos este método, pero primero debe hacer un paso más importante: crear una base con caras. En general, la estructura de la base de datos se ve así:



--Storage\\
	--Person_1\\
		--img_1.jpg
		--img_2.jpg
		--img_n.jpg
	--Person_m\\
                --img_1.jpg
		--img_2.jpg
		--img_n.jpg


Ok, tenemos una base con imágenes de caras. Ahora necesita procesar de alguna manera la base para entrenar o entrenar el algoritmo. El procesamiento se reduce a generar una lista de todas las imágenes y una lista de identificaciones o etiquetas para cada persona. El código más simple para esta acción podría verse así:



storage = 'storage'
images = []
labels = []
names = {}
id = 0

for subdir in os.scandir(storage):
    names[id] = subdir.name
    subdir_path = os.path.join(storage, subdir.name)

    for file in os.scandir(subdir_path):
        if file.name.split('.')[-1].lower() not in ['png', 'bmp', 'jpeg', 'gif']:
            continue
        file_path = os.path.join(subdir_path, file.name)
        image = cv.imread(file_path, 0)
        label = id
        images.append(image)
        labels.append(label)
    id += 1


Aquí también todo es bastante sencillo. La variable de almacenamiento almacena la ruta a la carpeta que contiene las carpetas con imágenes de rostros de personas, luego una lista de imágenes, una lista de etiquetas y un diccionario con nombres. Cómo funciona: todas las imágenes de la carpeta de una determinada persona se agregan a la lista de imágenes, por ejemplo, hay 15 de ellas. Si esta es la primera carpeta del almacenamiento, entonces la etiqueta será igual a 0, por lo tanto, se agregan 0 hasta 15 veces a la lista de etiquetas, al mismo tiempo En el diccionario de nombres se crea un registro en el que la clave es la etiqueta y el valor es el nombre de la persona (el nombre de la carpeta con las imágenes de una persona en particular). Y así para todo el almacenamiento. En el código anterior, preste atención a la línea con el método imread: aquí la imagen se lee y se representa como una matriz de brillo de píxeles y se escribe en la variable de imagen.



Ahora la parte divertida es entrenar el algoritmo:



recognizer = cv.face.LBPHFaceRecognizer_create(1, 8, 8, 8, 130) 
recognizer.train(images, np.array(labels))


En la primera línea de código, inicializamos el algoritmo usando el método LBPHFaceRecognizer_create. ¿Recuerda también la descripción del algoritmo LBPH? Los parámetros de la función mencionada solo contienen lo que hablamos: el radio a lo largo del borde del cual se tomarán los píxeles alrededor del deseado, el número de píxeles del "círculo" formado por el radio, el número de segmentos horizontal y verticalmente, y el umbral que afecta la decisión de reconocimiento. personas, es decir, cuanto más estrictos son los requisitos, menor es el umbral. A continuación, llamamos al método train para el entrenamiento, pasando listas de imágenes y etiquetas como argumentos. Ahora el algoritmo ha memorizado los rostros de la base de datos y podrá reconocerlos. El asunto es pequeño, queda agregar algunas líneas al primer fragmento de código en el ciclo (para x, y, w, h en found_faces): después de detectar una cara, necesitamos reconocerla, y si la cara no es reconocida,u otra persona es reconocida, ¡luego bloquee la computadora inmediatamente!



roi = gray_frame[y:y+h, x:x+w]
name, dist = recognizer.predict(roi)
cv.putText(frame, '%s - %.0f' % (names[name], dist), (x, y), cv.FONT_HERSHEY_DUPLEX, 1, (0, 255, 0), 3)
if names[name] != "Ivan Petrov":
    ctypes.windll.user32.LockWorkStation()


En la primera línea, roi (de la región de interés) es una variable en la que escribimos un fragmento de la imagen que contiene la cara detectada. En la siguiente línea, el reconocimiento facial ocurre directamente cuando se llama al método de predicción. Este método devuelve una etiqueta correspondiente al rostro que se reconoció y un valor que caracteriza el grado de discrepancia entre el rostro detectado y el reconocido (cuanto más pequeño es, mayor es el grado de confianza en que se reconoció el rostro correcto). A continuación, nuevamente para fines de depuración, agregue texto al marco con el nombre de la persona reconocida utilizando el método putText. Y finalmente, verificamos la condición más simple: si se reconoció a un no propietario de la PC (aquí es donde se necesitaba un diccionario con nombres), entonces bloquee la computadora. La línea ctypes.windll.user32.LockWorkStation () es la responsable del bloqueo, como puede ver. Para que funcionenecesitará importar el módulo ctypes además de cv2 y numpy.



Como resultado, la PC se bloquea tan pronto como se reconoce el rostro de otra persona o, en principio, no se reconoce. Después de desbloquear la PC, el programa continúa ejecutándose. También puede agregar un bloqueo de PC en caso de que un empleado deje su lugar de trabajo. No tienes que pensar mucho para entender que aquí hay bastantes matices. Por ejemplo, ¿qué pasa si se reconoce otra cara en el fondo? En esta situación, puede establecer el tamaño mínimo de un objeto que parece una cara, luego las caras en el fondo se ignorarán (para esto, hay un parámetro minSize en el método detectMultiScale). En otras situaciones, también se pueden encontrar buenas soluciones si se desea.



Uno de los factores más importantes para que el bloqueo funcione correctamente es la calidad de las imágenes en la base de datos de fotos. En primer lugar, es deseable que haya muchos de ellos para una persona en particular, con diferentes ángulos y expresiones faciales. En segundo lugar, la iluminación realiza sus propios ajustes, por lo que vale la pena considerar este punto y utilizar imágenes tomadas bajo diferentes condiciones de iluminación. Y en tercer lugar, debe grabar imágenes de la cámara web que se encuentra en el lugar de trabajo del empleado; también existe un método para guardar imágenes en OpenCV. En cuanto al código, lo más probable es que se expanda, se agregarán funcionalidades adicionales, por lo que se puede "envolver" en funciones, usando clases. ¡No hay límite para la perfección! Lo principal es recordar el orden de las acciones del programa: procesamiento de la base de datos con fotografías, entrenamiento, detección, reconocimiento.



En el seminario web 03.09.2020 10-00 hora de Moscú, los oradores presentarán un método práctico para entrenar una red neuronal para detectar objetos con el código fuente y las tecnologías utilizadas, y también responderán sus preguntas. Puede registrarse en el enlace: newtechaudit.ru/vebinar-computer-vision






All Articles