Не работает код с созданием модели для распознавания cv

Рейтинг: 1Ответов: 1Опубликовано: 09.06.2023

Подскажите пожалуйста почему не сохраняется yml файл?

import cv2
# библиотека для вызова системных функций
import os
# для обучения нейросетей
import numpy as np
# встроенная библиотека для работы с изображениями
from PIL import Image 
# получаем путь к этому скрипту
path = os.path.dirname(os.path.abspath('\face_gen.py'))
# создаём новый распознаватель лиц
recognizer = cv2.face.LBPHFaceRecognizer_create()
# указываем, что мы будем искать лица по примитивам Хаара
faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
# путь к датасету с фотографиями пользователей
dataPath = path+r'/dataSet'

# получаем картинки и подписи из датасета
def get_images_and_labels(datapath):
    # получаем путь к картинкам
    image_paths = [os.path.join(datapath, f) for f in os.listdir(datapath)]
    # списки картинок и подписей на старте пустые
    images = []
    labels = []
    # перебираем все картинки в датасете 
    for image_path in image_paths:
        # читаем картинку и сразу переводим в ч/б
        image_pil = Image.open(image_path).convert('L')
        # переводим картинку в numpy-массив
        image = np.array(image_pil, 'uint8')
        # получаем id пользователя из имени файла
        nbr = int(os.path.split(image_path)[1].split(".")[0].replace("face-", ""))
        # определяем лицо на картинке
        faces = faceCascade.detectMultiScale(image)
        # если лицо найдено
        for (x, y, w, h) in faces:
            # добавляем его к списку картинок 
            images.append(image[y: y + h, x: x + w])
            # добавляем id пользователя в список подписей
            labels.append(nbr)
            # выводим текущую картинку на экран
            cv2.imshow("Adding faces to traning set...", image[y: y + h, x: x + w])
            # делаем паузу
            cv2.waitKey(100)
    # возвращаем список картинок и подписей
    return images, labels

# получаем список картинок и подписей
images, labels = get_images_and_labels(dataPath)
# обучаем модель распознавания на наших картинках и учим сопоставлять её лица и подписи к ним
recognizer.train(images, np.array(labels))
# сохраняем модель
recognizer.save(path+r'\trainer\trainer.yml')
# удаляем из памяти все созданные окнаы
cv2.destroyAllWindows()

Ответы

▲ 0

В вашем коде есть смесь разных слешей в путях к файлам.

path = os.path.dirname(os.path.abspath('\face_gen.py'))
...
dataPath = path+r'/dataSet'
recognizer.save(path+r'\trainer\trainer.yml')

ОС такое не нравится. Посмотрите в интерактивном режиме значение dataPath и сразу увидите проблему:

'D:\\Users\\User\\temp/dataSet'

Либо правильно и единообразно пропишите пути ко всем файлам и папкам (в целом, windows принимает от питона и пути с прямыми одиночными слешами), либо везде в коде единообразно используйте библиотеки для управления путями (os.path, Pathlib и пр.)