@BogdanMetelsky

При сравнении лиц выдаёт ошибку, мол модель в базе = dtype('S10000'), а нового распознанного лица dtype('uint8'). Как исправить?

Пишу код, который распознаёт лицо, ищет совпадение в базе, если совпадения нет, то запрашивает имя лица и сохраняет в базу.
Возникает ошибка при сравнении нового лица и лица из базы:

line 41, in <module>
    distance = np.linalg.norm(face_encoding - saved_face)
                              ~~~~~~~~~~~~~~^~~~~~~~~~~~
numpy.core._exceptions._UFuncNoLoopError: ufunc 'subtract' did not contain a loop with signature matching types (dtype('uint8'), dtype('S10000')) -> None

Участок кода с ошибкой:

# Извлечение моделей лиц из базы данных
cursor.execute('SELECT face_encoding FROM faces')
saved_faces = cursor.fetchall()

# Преобразование списка кортежей в список массивов NumPy
saved_faces = [face[0] for face in saved_faces]

# Извлечение модели лица из изображения
face_encoding = face_image.flatten()

# Сравнение моделей лиц
for saved_face in saved_faces:
    # Вычисление евклидова расстояния между моделями лиц
    distance = np.linalg.norm(face_encoding - saved_face)

Я уже пробовал изменить saved_face с dtype('S10000') на dtype('uint8') прописывая следующую строку:

saved_face = saved_face.astype(np.uint8)

И тогда в новой строке появилась другая ошибка:

saved_face = saved_face.astype(np.uint8)
                 ^^^^^^^^^^^^^^^^^
AttributeError: 'bytes' object has no attribute 'astype'

Как решить эту ошибку?

Код я вообще не знаю, пишу код по различным статьям.

Весь код
import cv2
import tkinter as tk
import PIL
from PIL import Image, ImageTk
import sqlite3
import numpy as np


conn = sqlite3.connect('faces.db')
cursor = conn.cursor()

# Загрузить изображение
images = cv2.imread('img/_DSC0362+.jpg')

# Загрузить каскад Хаара для распознавания лиц
face_cascade = cv2.CascadeClassifier('venv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')

# Преобразовать изображение в серый цвет, так как каскад Хаара работает лучше с такими изображениями
gray = cv2.cvtColor(images, cv2.COLOR_BGR2GRAY)

# Найти лица на изображении с помощью каскада Хаара
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

# Извлечь изображение лица из изображения
for (x, y, w, h) in faces:
    face_image = gray[y:y + h, x:x + w]

# Извлечение моделей лиц из базы данных
cursor.execute('SELECT face_encoding FROM faces')
saved_faces = cursor.fetchall()

# Преобразование списка кортежей в список массивов NumPy
saved_faces = [face[0] for face in saved_faces]

# Извлечение модели лица из изображения
face_encoding = face_image.flatten()

# Сравнение моделей лиц
for saved_face in saved_faces:
    saved_face = saved_face.astype(np.uint8)
    # Вычисление евклидова расстояния между моделями лиц
    distance = np.linalg.norm(face_encoding - saved_face)

    # Установка порога совпадения
    threshold = 0.6

    # Проверка, существует ли совпадение
    if distance < threshold:
        print('Лицо распознано верно')
        break
else:
    # Изменить размер изображения лица на 100x100 пикселей
    face_image = cv2.resize(face_image, (100, 100))

    print('Лицо не распознано')
    # Создание окна
    window = tk.Tk()
    window.title('Неизвестное лицо')

    # Создание картинки
    image = Image.fromarray(face_image)
    image = ImageTk.PhotoImage(image)

    # Создание метки с картинкой
    label = tk.Label(window, image=image)
    label.pack()

    # Создание строки ввода имени
    entry = tk.Entry(window)
    entry.pack()
    # Ожидание ввода имени человека
    name = entry.get()

    # Сохранение имени и модели лица в базе данных
    def save_name():
        cursor.execute("INSERT INTO faces (name, face_encoding) VALUES (?, ?)", (name, face_encoding))
        conn.commit()
    # Создание кнопки сохранения имени
    button = tk.Button(window, text='Сохранить', command=save_name)
    button.pack()

    # Запуск окна
    window.mainloop()
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
Lord_of_Rings
@Lord_of_Rings
Python developer
Код я вообще не знаю

Не узнав код, ошибку (и ошибки в будущем) вы не исправите
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы