¡Tecnología cambiante, implementada con Python-OpenCV!

Antes de comenzar, eche un vistazo a las representaciones (declare de antemano: las imágenes son de Internet), porque el contraste de la cara es un poco grande, por lo que es un poco picante.

Imagen original izquierda y derecha, el medio es la imagen generada

Cambie los roles en la imagen y luego observe el efecto del reemplazo facial después de la conversión:

Mapa de reemplazo de rostro de transformación de personaje

Emm, cómo dices el resultado, el efecto se siente bien (la costura de reemplazo producida no será tan distorsionada y abrupta), pero se siente que la nueva cara está deformada.

1. Introducción a la tecnología Face Swap

Bueno, lo siguiente presentará la tecnología de reemplazo facial en detalle y la implementará con OpenCV; hasta ahora, si no ha leído los artículos anteriores para
lograr el reconocimiento facial y la extracción de 68 puntos característicos de caras, tal vez esta biblioteca de Python pueda ayudarlo. !
El uso de OpenCV-Python para realizar la triangulación facial de Delaunay (una de las tecnologías principales de detección de rostros)
recomienda que lo comprenda de antemano, ya que este artículo utilizará la extracción de puntos de características faciales y la triangulación de Delaunay.

La tecnología de reemplazo facial es relativamente difícil. Una de las razones es que existe una gran diferencia en la forma de la cara entre las personas (textura, forma de la cara, irregularidades regionales, etc.), lo que hace que el área de la cara y el tejido cutáneo circundante sean diferentes después del reemplazo. Efectos visuales distorsionados y antinaturales,

En cuanto a las imágenes finales de reemplazo facial que se muestran en las siguientes dos imágenes, las principales razones por las que los resultados son muy picantes son las siguientes:

1. Las diferencias de edad, las arrugas faciales y las áreas de textura son bastante diferentes;

2. Diferencias étnicas: una es la raza amarilla asiática, la otra es blanca, el grado de ojos hundidos y la estructura facial son bastante diferentes;

3. Diferencias de género: todavía habrá ligeras diferencias entre las formas de la cara de hombres y mujeres;

2. La tecnología de reemplazo facial debe resolver las dificultades.

1. El tamaño del área de la cara es inconsistente. Por ejemplo, el tamaño de una persona más gorda y una persona más delgada es obviamente diferente. La operación de reemplazo directo es obviamente inapropiada. Necesitamos unificar la forma de la cara de antemano para tener operaciones posteriores;

2. Después del reemplazo de la cara, habrá diferencias obvias de color entre el área de la cara reemplazada y el tejido de la piel circundante. Problemas como la iluminación hacen que el espacio de reemplazo sea más abrupto, como se muestra en la figura siguiente. Si este problema no se resuelve, el la imagen procesada será muy diferente. "falso";

combina.jpg

3. Hay un problema con el ángulo de la cámara de la cara Algunas imágenes muestran la cara frontal y otras muestran la cara de perfil;

4. Para el problema final de la piel, la textura del área de la cara reemplazada debe mantenerse consistente con los tejidos circundantes, y el cambio final no es muy diferente;

Debido a la tecnología limitada, este artículo usa OpenCV para resolver solo los problemas 1 y 2. Las soluciones a los problemas 3 y 4 pueden continuar excavando lo siguiente.

3. OpenCV realiza reconocimiento facial;

1. Extracción de puntos característicos, encontrar Convexhull

Utilice el paquete del programa dlib para extraer puntos de características faciales y delinear el área facial de acuerdo con los puntos de características ** busque Convexhull (casco convexo) ** (aquí solo se debe delinear el contorno de la cara, sin puntos de características en el medio de la cara)), consulte la extracción de puntos de características faciales: para
lograr el reconocimiento facial, extracción de 68 puntos de características faciales, ¡tal vez esta biblioteca de Python pueda ayudarlo!
Inserte la descripción de la imagen aquí

2. Triangulación de Delaunay

Utilice el casco convexo (casco convexo) calculado en el paso 1 para realizar la triangulación de Delaunay. El resultado es como se muestra en la figura siguiente. Para la operación específica de triangulación, consulte:
Utilice OpenCV-Python para realizar la triangulación de Delaunay frontal (una de las tecnologías centrales de detección de rostros))
Inserte la descripción de la imagen aquí
3. Transformación afín

Calcule la matriz de transformación afín para cada área de triángulo en 2 y aplíquela al área de la cara para finalmente lograr la alineación preliminar:

combina.jpg

4. Clonación sin fisuras (clonación sin fisuras)

En el paso 3, los espacios en los bordes resaltados son obvios y la distorsión es grande. Aquí, finalmente usamos la función de clonación perfecta de OpenCV para el posprocesamiento. Aquí necesitamos una máscara facial (con la ayuda de la función fillConvexPoly), una comparación imagen y la imagen de procesamiento

output = cv2.seamlessClone(np.uint8(img1Warped),img2,mask,center,cv2.NORMAL_CLONE)

Inserte la descripción de la imagen aquí
Se ve bastante bien, verdad

4. Pequeño resumen

Hay muchas técnicas utilizadas en este artículo, que incluyen extracción de puntos de características dlib, cálculo Subdiv2D, triangulación de Delaunay, búsqueda de casco convexo, cálculo de área poligonal, casco convexo, relleno de área poligonal de relleno Convexpoly y otras tecnologías

Este artículo también se considera una aplicación avanzada de OpenCV. Para aquellos que lo acaban de aprender, se necesita algo de tiempo para comprenderlo completamente. Aún así, se recomienda seguir el código para comprender la secuencia básica del proceso de Codificación. Por razones de espacio , el código principal se coloca a continuación:

def warpTriangle(img1,img2,t1,t2):

    # Find bounding rectangle for each triangle
    r1 = cv2.boundingRect(np.float32([t1]))
    r2 = cv2.boundingRect(np.float32([t2]))

    # Offset points by left top corner of respective rectangles

    t1Rect =[]
    t2Rect = []
    t2RectInt = []

    for i in range(0,3):
        t1Rect.append(((t1[i][0]-r1[0]),(t1[i][1]-r1[1])))
        t2Rect.append(((t2[i][0]-r2[0]),(t2[i][1]-r2[1])))
        t2RectInt.append(((t2[i][0] - r2[0]),(t2[i][1]-r2[1])))


    # Get mask by filling triangle
    mask = np.zeros((r2[3],r2[2],3),dtype = np.float32)
    cv2.fillConvexPoly(mask,np.int32(t2RectInt),(1.0,1.0,1.0),16,0)

    # Apply warpImage to small rectangular patches
    img1Rect = img1[r1[1]:r1[1]+r1[3],r1[0]:r1[0]+r1[2]]

    size = (r2[2],r2[3])
    img2Rect = applyAffineTransform(img1Rect,t1Rect,t2Rect,size)

    img2Rect = img2Rect*mask

    # Copy triangular region of the rectangular patch to the output image

    img2[r2[1]:r2[1]+r2[3],r2[0]:r2[0]+r2[2]] = img2[r2[1]:r2[1]+r2[3],r2[0]:r2[0]+r2[2]] *((1.0,1.0,1.0)-mask)
    img2[r2[1]:r2[1] +r2[3],r2[0]:r2[0]+r2[2]] = img2[r2[1]:r2[1]+r2[3],r2[0]:r2[0]+r2[2]] +img2Rect

Los archivos de código involucrados en el artículo se han subido a Github, siga la cuenta oficial: Mr. Z señala para recordar, y puede obtenerlo respondiendo a la palabra clave Face Swap en segundo plano .

Supongo que te gusta

Origin blog.csdn.net/weixin_42512684/article/details/106761336
Recomendado
Clasificación