Использование opencv для пакетного распознавания лиц + обрезка + настройка разрешения (совместное использование кода Python)

Недавно при обучении модели LoRA мне нужно было распознать лица на серии изображений, обрезать их, а затем установить определенное разрешение.
Сначала импортируйте библиотеку cv. import cv2
Если библиотеки opencv нет, pip install opencv-python
сначала используйте pip, чтобы установить ее. 1. Определите лицо изображения и перехватите самую большую квадратную часть исходного изображения рядом с лицом и измените разрешение захваченное изображение до 512*512

import numpy as np
import cv2
import os

def crop_face(input_folder_path, output_folder_path):
    # 加载面部识别模型
    face_detector = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    images = os.listdir(input_folder_path)
    for image in images:
        image_path = os.path.join(input_folder_path, image)
        img = cv2.imread(image_path)
        height, width, channels = img.shape
        # 将图像转换为灰度图像
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # 检测面部
        faces = face_detector.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5, minSize=(30, 30))

        
        # 无法识别面部的图片
        if len(faces)==0:
            print(f"No face found in {
      
      image_path}")
            return
    
        if len(faces) > 0:
            # 取第一个脸部位置,这里假设一张图片只有一个脸部特征
            # x、y 为人脸的像素位置,w、h 为人脸的宽度和高度。
            x, y, w, h = faces[0]
            # 确定最大正方形的位置
            # 原图片竖方向长,截取正方形长度为原图横方向长,square_size截取正方形的长度
            if height>width:
                square_size = width
                x1=0
                x2=square_size
                # 原图面部靠上
                if y<square_size/2:
                    y1=0
                    y2 =square_size
                # 原图面部靠下
                else:
                    y1=int(square_size/2)
                    y2 =height
           # 原图片是横方向长,截取正方形长度为原图竖方向长度      
            else:
                square_size =  height
                y1=0
                y2=square_size
                # 原图面部靠右
                if x<square_size/2:
                    x1=0
                    x2 =square_size
                # 原图面部靠左
                else:
                    x1=int(square_size/2)
                    x2 =square_size
                
                
            # 根据最大正方形位置裁剪图片并保存
            cropped_img = img[y1:y2, x1:x2] 
            # 调整图像大小为512x512
            resized = cv2.resize(cropped_img, (512, 512), interpolation=cv2.INTER_AREA)
            output_path = os.path.join(output_folder_path,image)
            cv2.imwrite(output_path, resized)


if __name__ == "__main__":
    input_folder = r"输入图片所在文件夹路径" 
    output_folder = r"输出图片所在文件夹路径"  
    # 创建输出目录
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    crop_face(input_folder, output_folder)
    print('Done!')

вставьте сюда описание изображения
вставьте сюда описание изображения

Вы видите картинку а1(7), но модель не может ее распознать.При этом настройте параметры этой позиции в соответствии с реальной ситуацией, чтобы повысить точность распознавания.

faces = face_detector.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5, minSize=(30, 30))

ScaleFactor: указывает коэффициент масштабирования окна поиска при двух последовательных сканированиях. По умолчанию установлено значение 1,1, что означает, что окно поиска каждый раз расширяется на 10%. Этот параметр можно установить в соответствии со значением пикселя изображения.Чем больше пикселей, тем быстрее скорость уменьшения, обычно от 1 до 1,5.

minNeighbors: указывает минимальное количество соседних прямоугольников, составляющих цель обнаружения (по умолчанию — 3). Чтобы получить наиболее точную дальность, необходимо выполнить определенное количество обнаружений вблизи лица. Чем выше значение параметра, тем ниже уровень ложного обнаружения. Однако для размытых изображений, чем выше значение параметра, тем труднее его обнаружить, и оно должно быть соответствующим образом уменьшено.

2. Возьмите лицо за центр и перехватите самый большой квадрат.

import numpy as np
import cv2
import os


def crop_face(input_folder_path, output_folder_path):
    face_detector = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    images = os.listdir(input_folder_path)
    for image in images:
        image_path = os.path.join(input_folder_path, image)
        img = cv2.imread(image_path)
        height, width, channels = img.shape
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        faces = face_detector.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5, minSize=(30, 30))
        
        # 无法识别面部的图片
        if len(faces)==0:
            print(f"No face found in {
      
      image_path}")
            return
        
        if len(faces) > 0:
            # 取第一个脸部位置,这里假设一张图片只有一个脸部特征
            x, y, w, h = faces[0]
            # 确定最大正方形的位置
            square_size=min(width-x,x,y,height-y)
           
                
            # 根据最大正方形位置裁剪图片并保存
            cropped_img = img[y-square_size:y+h+square_size, x-square_size:x+w+square_size] #img[y1:y2, x1:x2]
            # 调整图像大小为512x512
            resized = cv2.resize(cropped_img, (512, 512), interpolation=cv2.INTER_AREA)
            output_path = os.path.join(output_folder_path, image)
            cv2.imwrite(output_path, resized)


if __name__ == "__main__":
    input_folder = r"输入图片所在文件夹路径"  
    output_folder = r"输出图片所在文件夹路径" 
    # 创建输出目录
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    crop_face(input_folder, output_folder)
    print('Done!')

вставьте сюда описание изображения
3. Снимайте только часть лица

import numpy as np
import cv2
import os


def crop_face(input_folder_path, output_folder_path):
    face_detector = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    images = os.listdir(input_folder_path)
    for image in images:
        image_path = os.path.join(input_folder_path, image)
        img = cv2.imread(image_path)
        height, width, channels = img.shape
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        faces = face_detector.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=7, minSize=(30, 30))
        
        # 无法识别面部的图片
        if len(faces)==0:
            print(f"No face found in {
      
      image_path}")
            return
        
        for (x,y,w,h) in faces:
            cropped_img = img[y:y+h, x:x+w]  
            # 调整图像大小为512x512
            resized = cv2.resize(cropped_img, (512, 512), interpolation=cv2.INTER_AREA)
            # 将图像保存到输出目录
            output_path = os.path.join(output_folder_path, image)
            cv2.imwrite(output_path, resized)
            
if __name__ == "__main__":
    input_folder = r"输入图片所在文件夹路径"  
    output_folder = r"输出图片所在文件夹路径"  
    # 创建输出目录
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    crop_face(input_folder, output_folder)
    print('Done!')

вставьте сюда описание изображения

おすすめ

転載: blog.csdn.net/qq_45694768/article/details/129305840