Una implementación completa del sistema "con máscara" basado en reconocimiento facial-python

Tabla de contenido

0 Prefacio

1 Propósito del diseño

2 Tareas y requisitos

3 Principio de diseño

3.1 Descripción general de la detección y el reconocimiento de rostros

3.2 Detección de caracterización facial (ubicación del sentido facial)

3.3 Introducción a la biblioteca dlib

3.4 Introducción a Tkinter

4 Establecimiento del sistema

4.1 Diseño de interfaz

4.2 Reconocimiento facial

5 Resultados de la operación del sistema

5.1 Diagrama esquemático de la máscara

5.2 Visualización de resultados del sistema

6 sugerencias

7. Referencias

apéndice

Código de posicionamiento de cinco sentidos

Código de compilación del sistema


0 Prefacio

El nuevo tipo de coronavirus ha mostrado una tendencia de globalización y propagación, lo que nos recuerda que la prevención y el control de las enfermedades infecciosas seguirá siendo el foco de la prevención y el control de enfermedades durante mucho tiempo en el futuro. Por lo tanto, llevar una máscara es una parte necesaria de la vida diaria. Por la seguridad de los demás y por su propia seguridad, todos deben usar una máscara. El objetivo del diseño de este curso es realizar el trabajo de "enmascaramiento" de rostros humanos basado en el reconocimiento facial.

  • 1. Complete la prueba de la cara más la máscara en la imagen dada.
  • 2. De acuerdo con el modelo diseñado, dé las sugerencias correspondientes.
  • 3. Dar el proceso de simulación y los resultados.

El enlace de descarga del código fuente de este artículo: https://download.csdn.net/download/weixin_43442778/12503099

1 Propósito del diseño

El nuevo tipo de coronavirus ha mostrado una tendencia de globalización y propagación, lo que nos recuerda que la prevención y el control de las enfermedades infecciosas seguirá siendo el foco de la prevención y el control de enfermedades durante mucho tiempo en el futuro. Por lo tanto, llevar una máscara es una parte necesaria de la vida diaria. Por la seguridad de los demás y por su propia seguridad, todos deben usar una máscara. El objetivo del diseño de este curso es realizar el trabajo de "enmascaramiento" de rostros humanos basado en el reconocimiento facial.

2 Tareas y requisitos

1. Complete la prueba de la cara más la máscara en la imagen dada.

2. De acuerdo con el modelo diseñado, dé las sugerencias correspondientes.

3. Dar el proceso de simulación y los resultados.

3 principios de diseño

El principio de realización de este sistema es utilizar la biblioteca de detección de rostros Landmark del módulo Dlib para identificar datos de rasgos faciales, según estos datos, determinar los datos de posición de los labios (48 puntos a 67 puntos), según la boca detectada. El tamaño y la dirección de la máscara se pueden ajustar con la ayuda del módulo PLL para lograr la posición adecuada de la máscara en la imagen.

3.1 Descripción general de la detección y el reconocimiento de rostros

La detección de rostros se utiliza principalmente en el preprocesamiento del reconocimiento de rostros en la práctica, es decir, para calibrar con precisión la posición y el tamaño del rostro en la imagen. Las características de patrón contenidas en las imágenes de caras son muy ricas, como características de histograma, características de color, características de plantilla, características estructurales y características de Haar. El preprocesamiento de la imagen del rostro se basa en el resultado de la detección del rostro [2], la imagen se procesa y finalmente sirve para el proceso de extracción de características. La detección de rostros consiste en seleccionar la información útil y utilizar estas funciones para realizar la detección de rostros.

El reconocimiento facial [1] es un tipo de tecnología de reconocimiento biométrico basada en información de rasgos faciales humanos. Consiste en comparar las características faciales que se van a reconocer con las plantillas de características faciales obtenidas y juzgar la información de identidad de la cara según el grado de similitud. Las características que se pueden utilizar en un sistema de reconocimiento facial se dividen generalmente en características visuales, características estadísticas de píxeles, características del coeficiente de transformación de la imagen de la cara, características de álgebra de la imagen de la cara, etc. Una serie de tecnologías relacionadas que utilizan una cámara o cámara para recopilar imágenes o secuencias de video que contienen rostros humanos, y detectar y rastrear automáticamente rostros humanos en las imágenes, y luego realizar el reconocimiento facial en los rostros detectados, generalmente también llamado reconocimiento facial y reconocimiento facial. . El sistema de reconocimiento facial incluye principalmente cuatro componentes, a saber: adquisición y detección de imágenes faciales, preprocesamiento de imágenes faciales, extracción de características de imágenes faciales y comparación y reconocimiento.

3.2 Detección de caracterización facial (ubicación del sentido facial)

Generalmente, las aplicaciones faciales utilizan dos tecnologías, "detección de rostros" y "comparación de rostros", como perforación de rostros, mosaico automático de rostros, desbloqueo de rostros y otras aplicaciones. Sin embargo, debido a la complejidad de este experimento, solo la detección y la comparación de rostros no son suficientes. Por lo tanto, no solo necesitamos juzgar la posición de la cara (caja rectangular), sino que también necesitamos detectar la posición de los rasgos faciales, como la forma de las cejas, el área de los ojos, la posición de la nariz, la posición. de la boca, etc. Después de tener los datos de posición de los rasgos faciales, podemos basarnos en Estos datos se utilizan en este experimento. La siguiente figura muestra el resultado de la detección de caracterización facial:

Figura 3.1 Diagrama de detección de caracterización facial

La figura anterior muestra 68 puntos de una cara representada por aprendizaje automático. Las partes de la cara y los puntos correspondientes se muestran en la tabla:

Tabla 3.1 Tabla de correspondencias de la detección de caracterización facial

Podemos obtener rápidamente el punto de coordenadas correspondiente a través del subíndice (el corte se puede usar en Python), que representa la posición real (unidad de píxel) de la representación de la cara en la imagen de entrada original.

3.3 Introducción a la biblioteca dlib

Dlib es una caja de herramientas C ++ moderna que contiene algoritmos y herramientas de aprendizaje automático para crear software complejo en C ++ para resolver problemas prácticos. Se utiliza ampliamente en la industria y el mundo académico, incluida la robótica, los dispositivos integrados, los teléfonos móviles y los entornos informáticos de alto rendimiento a gran escala. En este experimento, se usa el extractor de características faciales que viene con dlib, lo cual es muy conveniente.

3.4 Introducción a Tkinter

Tkinter [3] es un módulo para el diseño de ventanas usando Python. El módulo Tkinter ("interfaz Tk") es una interfaz para el kit de herramientas GUI Tk estándar de Python. Como interfaz GUI específica para Python, es una ventana de imagen. Tkinter es una interfaz GUI que viene con Python y se puede editar. Podemos usar GUI para lograr muchas funciones intuitivas.

La biblioteca de la interfaz Tkinter de Python es muy simple. Hay muchas bibliotecas GUI para Python. Elija Tkinter, una es la más fácil, la otra es su propia biblioteca, no es necesario descargarla e instalarla, puede usarla en cualquier momento y la tercera es comenzar desde la demanda. lenguaje de programación, Python se puede utilizar como una herramienta flexible, bajo esta demanda, ¡Tkinter puede hacerlo!

Para la programación de Tkinter, puede comenzar con los siguientes dos aspectos:

La primera, la pintura, corresponde a la programación de tkinter. La pantalla de visualización es el caballete que se apoya. La ventana raíz es el tablero de dibujo. En tkinter es el Toplevel. El lienzo es el contenedor (Frame) en tkinter. Muchos lienzos pueden colocarse en el tablero de dibujo (Convas), el contenedor en tkinter también puede contener muchos contenedores. El diseño de composición en la pintura es el administrador de diseño (administrador de geometría) en tkinter. El contenido de la pintura son los componentes pequeños en tkinter. elementos constituyen, y nuestra interfaz GUI se compone de componentes individuales, que son widgets.

En segundo lugar, los componentes de tkinter también pueden verse como bloques de construcción. Las formas pueden ser diferentes, pero la esencia es la misma. Es un bloque de construcción. No importa cómo se vea, ¡siempre es un bloque de construcción! Estos pequeños componentes tienen muchos puntos en común, el más importante de los cuales es el uso del administrador de diseño.

4 establecimiento del sistema

Esta parte incluye dos partes en total, a saber, diseño de interfaz y reconocimiento de órganos.

4.1 diseño de interfaz

Basado en el módulo tkinter para implementar el diseño de la GUI, puede cargar imágenes de personajes, seleccionar cuatro tipos de máscaras (las máscaras aquí son imágenes procesadas), mostrar el efecto de usar la máscara y salir del sistema una vez completada la operación. se muestra en la figura siguiente, consulte el apéndice del código específico.

Figura 4.1 Diseño de interfaz

4.2 Reconocimiento facial

Una vez realizada la función de página, se debe confiar en la biblioteca Dlib para realizar el reconocimiento de los puntos clave de los órganos faciales, analizar la posición y el tamaño de la boca y mostrar los puntos clave del rostro del personaje.

Figura 4.2 Comparación del reconocimiento de rasgos faciales

La biblioteca de detección de puntos clave 68 del módulo Dlib de Landmark person identifica los datos de las características de la cara para determinar los datos de posición (la parte del labio 48 en punto a 67 en punto ), la detección del tamaño y la dirección de la boca, por medio del módulo PLL ajusta la máscara El tamaño y la dirección permiten colocar la máscara en la posición adecuada de la imagen.

Figura 4.3 Parte de la máscara

5 Resultados de la operación del sistema

5.1 Diagrama esquemático de la máscara

La siguiente imagen muestra la máscara que podemos usar Cabe señalar que el fondo blanco de la máscara no está relleno de blanco, sino de blanco transparente (el software PS se puede utilizar para un procesamiento específico).

Figura 5.1 Estilo de máscara

5.2 Visualización de resultados del sistema

Probado en las tres imágenes dadas, todos obtuvieron buenos resultados, ver Figura 5.2, 5.3, 5.4.

Figura 5.2 Representación de imágenes de la prueba 1

Figura 5.3 Representaciones de imágenes de la prueba 2

Figura 5.4 Prueba de 3 representaciones de imágenes

6 recomendaciones

El uso de mascarillas científicamente tiene un efecto preventivo en enfermedades respiratorias infecciosas como la nueva neumonía coronaria y la influenza, no solo protege a uno mismo, sino que también beneficia la salud pública. En la actualidad, en la lucha contra la nueva situación epidémica de la neumonía de la corona, los ciudadanos chinos usan máscaras científicamente, para que la epidemia se pueda prevenir y controlar de manera efectiva, medida que vale la pena aprender de otros países, especialmente de Estados Unidos.

7 referencias

  1. Reconocimiento facial: https://baike.baidu.com/item/%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB/4463435?fr=aladdin
  2. https://blog.csdn.net/weixin_42346564/article/details/82500454
  3. Introducción de Tkinter : https://www.cnblogs.com/shwee/p/9427975.html#B
  4. Instalación correcta de Python dlib: https://ai-word.blog.csdn.net/article/details/88713658
  5. Instale rápidamente el paquete de Python: https://blog.csdn.net/weixin_43442778/article/details/103095442
  6. Aplicación facial: https://www.cnblogs.com/xiaozhi_5638/p/12697035.html
  7. Detección de puntos clave de rasgos faciales: https://blog.csdn.net/zhr1030635594/article/details/104411165
  8. Sistema automático de uso de máscara facial basado en Python: https://handsome-man.blog.csdn.net/article/details/104174562

Anexo registrado

Enlace de descarga del código fuente que se puede ejecutar directamente: https://download.csdn.net/download/weixin_43442778/12503099

Código de posicionamiento de cinco sentidos

# codificación = utf-8

#Picture Detection-versión Dlib

importar cv2

importar dlib

tiempo de importación

t = tiempo.tiempo ()

ruta = "./pic/test1.jpeg"

img = cv2.imread (ruta)

gris = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)

 

# Clasificador facial

detector = dlib.get_frontal_face_detector ()

# Obtener detector de rostros

predictor = dlib.shape_predictor (

    "./shape_predictor_68_face_landmarks.dat"

)

 

dets = detector (gris, 1)

para la cara en dets:

    shape = predictor (img, face) # Encuentra 68 puntos de calibración de la cara

    # Atraviese todos los puntos, imprima sus coordenadas y enciérrelos

    para pt en shape.parts ():

        pt_pos = (pt.x, pt.y)

        cv2.circle (img, pt_pos, 1, (0, 255, 0), 2)

    cv2.imshow ("imagen", img)

print ('El tiempo usado es {)'. formato (time.time () - t))

cv2.waitKey (0)

# cv2.destroyAllWindows ()

hora de dormir (5)

Código de compilación del sistema

de la imagen de importación PIL, ImageTk

de tkinter.filedialog importar askopenfilename

importar cv2

importar tkinter como tk

importe PIL

importar dlib

 

 

clase AddMask (objeto):

    def __init __ (yo):

        self.root = tk.Tk ()

        self.root.title ('Sistema automático de enmascaramiento facial basado en Pyhon')

        self.root.geometry ('1200x500')

 

        self.path1_ = Ninguno

# self.path2_ = Ninguno

        self.seg_img_path = None

        self.mask = None

        self.label_Img_seg = None

 

        decoration = PIL.Image.open('./pic/bg.png').resize((1200, 500))

        render = ImageTk.PhotoImage(decoration)

        img = tk.Label(image=render)

        img.image = render

        img.place(x=0, y=0)

 

        # 原图1的展示

        tk.Button(self.root, text="打开头像", command=self.show_original1_pic).place(x=50, y=120)

        tk.Button(self.root, text="退出软件", command=quit).place(x=900, y=40)

 

        tk.Label(self.root, text="头像", font=10).place(x=280, y=120)

        self.cv_orinial1 = tk.Canvas(self.root, bg='white', width=270, height=270)

        self.cv_orinial1.create_rectangle(8, 8, 260, 260, width=1, outline='red')

        self.cv_orinial1.place(x=180, y=150)

        self.label_Img_original1 = tk.Label(self.root)

        self.label_Img_original1.place(x=180, y=150)

 

        tk.Label(self.root,text="选择口罩",font=10).place(x=600,y=120)

 

        first_pic = Image.open("./pic/Mask1.png")

        first_pic = first_pic.resize((60, 60), Image.ANTIALIAS)

        first_pic = ImageTk.PhotoImage(first_pic)

        self.first = tk.Label(self.root, image=first_pic)

        self.first.place(x=600,y=160, width=60, height=60)

        self.first.bind("<Button-1>", self.mask1)

 

        second_pic = Image.open("./pic/Mask2.png")

        second_pic = second_pic.resize((60, 60), Image.ANTIALIAS)

        second_pic = ImageTk.PhotoImage(second_pic)

        self.second_pic = tk.Label(self.root, image=second_pic)

        self.second_pic.place(x=600, y=230, width=60, height=60)

        self.second_pic.bind("<Button-1>", self.mask2)

 

        third_pic = Image.open("./pic/Mask3.png")

        third_pic = third_pic.resize((60, 60), Image.ANTIALIAS)

        third_pic = ImageTk.PhotoImage(third_pic)

        self.third_pic = tk.Label(self.root, image=third_pic)

        self.third_pic.place(x=600, y=300, width=60, height=60)

        self.third_pic.bind("<Button-1>", self.mask3)

 

        forth_pic = Image.open("./pic/Mask4.png")

        forth_pic = forth_pic.resize((60, 60), Image.ANTIALIAS)

        forth_pic = ImageTk.PhotoImage(forth_pic)

        self.forth_pic = tk.Label(self.root, image=forth_pic)

        self.forth_pic.place(x=600, y=370, width=60, height=60)

        self.forth_pic.bind("<Button-1>", self.mask4)

 

        tk.Label(self.root, text="佩戴效果", font=10).place(x=920, y=120)

        self.cv_seg = tk.Canvas(self.root, bg='white', width=270, height=270)

        self.cv_seg.create_rectangle(8, 8, 260, 260, width=1, outline='red')

        self.cv_seg.place(x=820, y=150)

        self.label_Img_seg = tk.Label(self.root)

        self.label_Img_seg.place(x=820, y=150)

 

        self.root.mainloop()

 

    # 原图1展示

    def show_original1_pic(self):

        self.path1_ = askopenfilename(title='选择文件')

        print(self.path1_)

        self.Img = PIL.Image.open(r'{}'.format(self.path1_))

        Img = self.Img.resize((270,270),PIL.Image.ANTIALIAS)   # 调整图片大小至256x256

        img_png_original = ImageTk.PhotoImage(Img)

        self.label_Img_original1.config(image=img_png_original)

        self.label_Img_original1.image = img_png_original  # keep a reference

        self.cv_orinial1.create_image(5, 5,anchor='nw', image=img_png_original)

 

    # 人脸戴口罩效果展示

    def show_morpher_pic(self):

        img1 = cv2.imread(self.path1_)

        x_min, x_max, y_min, y_max, size = self.get_mouth(img1)

        adding = self.mask.resize(size)

        im = Image.fromarray(img1[:, :, ::-1])  # 切换RGB格式

        # 在合适位置添加头发图片

        im.paste(adding, (int(x_min), int(y_min)), adding)

        # im.show()

        save_path = self.path1_.split('.')[0]+'_result.jpg'

        im.save(save_path)

        Img = im.resize((270, 270), PIL.Image.ANTIALIAS)  # 调整图片大小至270x270

        img_png_seg = ImageTk.PhotoImage(Img)

        self.label_Img_seg.config(image=img_png_seg)

        self.label_Img_seg.image = img_png_seg  # keep a reference

 

    def mask1(self, event):

        self.mask = Image.open('pic/Mask1.png')

        self.show_morpher_pic()

 

    def mask2(self, event):

        self.mask = Image.open('pic/Mask2.png')

        self.show_morpher_pic()

 

    def mask3(self, event):

        self.mask = Image.open('pic/Mask3.png')

        self.show_morpher_pic()

 

    def mask4(self, event):

        self.mask = Image.open('pic/Mask4.png')

        self.show_morpher_pic()

 

    def get_mouth(self, img):

        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#        img_gray = cv2.gray2bgr(img, cv2.COLOR_BGR2GRAY)

       

        detector = dlib.get_frontal_face_detector()

        predictor = dlib.shape_predictor('./shape_predictor_68_face_landmarks.dat')

        faces = detector(img_gray, 0)

        for k, d in enumerate(faces):

            x = []

            y = []

            # 人脸大小的高度

            height = d.bottom() - d.top()

            # 人脸大小的宽度

            width = d.right() - d.left()

            shape = predictor(img_gray, d)

            # 48-67 为嘴唇部分

            for i in range(48, 68):

                x.append(shape.part(i).x)

                y.append(shape.part(i).y)

            # 根据人脸的大小扩大嘴唇对应口罩的区域

            y_max = (int)(max(y) + height / 3)

            y_min = (int)(min(y) - height / 3)

            x_max = (int)(max(x) + width / 3)

            x_min = (int)(min(x) - width / 3)

            size = ((x_max - x_min), (y_max - y_min))

            return x_min, x_max, y_min, y_max, size

 

    def quit(self):

        self.root.destroy()

 

 

 

if __name__ == '__main__':

    AddMask()

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43442778/article/details/114950169
Recomendado
Clasificación