es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Extractor de rostros Mtcnn para extracción de cabeza

Estoy utilizando la red Mtcnn (https://towardsdatascience.com/face-detection-using-mtcnn-a-guide-for-face-extraction-with-a-focus-on-speed-c6d59f82d49) para detectar rostros y cabezas. Para esto, estoy utilizando el código clásico de detección facial: obtengo las coordenadas de la esquina superior izquierda del cuadro delimitador del rostro (x, y) + la altura y anchura del cuadro (h, w), luego amplío el cuadro para obtener la cabeza en mi recorte:

import mtcnn
img = cv2.imread(‘images/’+path_res)
faces = detector.detect_faces(img) # resultado
for result in faces:
x, y, w, h = result[‘box’]
x1, y1 = x + w, y + h
x, y, w, h = result[‘box’]
x1, y1 = x + w, y + h

if x-100 >= 0:
a = x-100
else:
a = 0

if y-150 >= 0:
b = y-150
else:
b = 0

if x1+100 >= w:
c = x1+100
else:
c = w

if y1+60 >= h:
d = y1+60
else:
d = h

crop = img[b:d, a:c] # <– recorte final de la cabeza

El problema es que esta solución funciona para algunas imágenes, pero para muchas otras, en mi recorte obtengo los hombros y el cuello de la persona objetivo. Creo que esto se debe a que los píxeles/pulgada en cada imagen (es decir, +150 píxeles en una imagen no es lo mismo en otra imagen). Por lo tanto, ¿qué puedo hacer para extraer correctamente la cabeza?
Muchas gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para extraer correctamente la cabeza es ajustar la expansión del cuadro delimitador en función del tamaño de la cara detectada en cada imagen. Esto se puede hacer calculando la relación entre el ancho o la altura del cuadro delimitador y el tamaño de la imagen, luego escalando la expansión por esa relación.

    Por ejemplo, en lugar de agregar un valor fijo de 100 píxeles a los lados izquierdo y derecho del cuadro, podrías calcular la relación entre el ancho del cuadro (w) y el ancho de la imagen (img_w), y usar eso para escalar la expansión. Lo mismo se podría hacer para los lados superior e inferior del cuadro.

    Aquí tienes un ejemplo de segmento de código:

    import mtcnn
    import cv2
    
    img = cv2.imread('imagenes/'+path_res)
    faces = detector.detect_faces(img)
    
    for result in faces:
        x, y, w, h = result['box']
        img_h, img_w = img.shape[:2]
    
        # Calcular las relaciones para escalar la expansión
        x_ratio = w / img_w
        y_ratio = h / img_h
    
        # Escalar la expansión en función de las relaciones
        x_expansion = int(100 * x_ratio)
        y_expansion = int(150 * y_ratio)
    
        # Ajustar las coordenadas del cuadro delimitador
        a = max(x - x_expansion, 0)
        b = max(y - y_expansion, 0)
        c = min(x + w + x_expansion, img_w)
        d = min(y + h + y_expansion, img_h)
    
        crop = img[b:d, a:c]  # <-- recorte final de la cabeza
    

    Este enfoque debería proporcionar una expansión del cuadro delimitador más adaptativa y permitir una mejor extracción de la región de la cabeza en diferentes imágenes, independientemente de su tamaño o relación de aspecto.

Comments are closed.