@Black_sun_1906

Почему не удается распознать лицо из базы данный с веб-камеры?

Программа должна находить в базе данных фотографии, на которых изображен человек, обнаруженной веб-камерой, и выводить в форме название этих фотографий. Проблема заключается в том, что программа не находит людей, полученной веб-камерой, и выводит сообщение, что лицо не найдено в базе данных. Ниже прикрепляю код. Помогите , разобраться, пожалуйста, в чем проблема

import os
#from gc import callback
from deepface import DeepFace
import cv2
from PIL import Image
from PIL import ImageTk
import threading
import tkinter as tk
from tkinter import ttk

#изменение камеры
cap = cv2.VideoCapture(1)

while True:
ret, frame = cap.read()

cv2.imshow('Камера', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()

def recognichen_euclidean():
# находит в библиотеке похожие лица
models = ['VGG-Face', 'Facenet', 'OpenFace', 'DeepFace'
, 'DeepID', 'Dlib', 'ArcFace']
metrics = ['cosine', 'euclidean', 'euclidean_l2']
try:
recognition = DeepFace.find(img_path="Detection/photo.jpg", db_path="foto", model_name = models[0], distance_metric = metrics[1])[0]
print('найденные фото')
print(recognition)
print('Выбор фото первого найденного распознавания')
df = recognition.head(1)
print("1 - я row of DataFrame:\n", df)
for index, row in df.iterrows():
file_path = row["identity"]
print(file_path)
file_name = os.path.basename(file_path)
print(file_name)
#Вырезать из имени изображения до .jpg
ind = file_name.rindex('.')
myname = file_name[0:ind]
myname = "Result(euclidean):" + myname
print (myname)
except Exception:
myname = "Result(euclidean): Not in DB"
return myname
def recognichen_cosine():
# находит в библиотеке похожие лица
models = ['VGG-Face', 'Facenet', 'OpenFace', 'DeepFace'
, 'DeepID', 'Dlib', 'ArcFace']
metrics = ['cosine', 'euclidean', 'euclidean_l2']
try:
recognition = DeepFace.find(img_path="Detection/photo.jpg", db_path="foto", model_name = models[0], distance_metric = metrics[0])[0]
print('найденные фото')
print(recognition)
print('Выбор фото первого найденного распознавания')
df = recognition.head(1)
print("1 - я row of DataFrame:\n", df)
for index, row in df.iterrows():
file_path = row["identity"]
print(file_path)
file_name = os.path.basename(file_path)
print(file_name)
#Вырезатьиз имени изображения до .jpg
ind = file_name.rindex('.')
myname = file_name[0:ind]
myname = "Result(cosine):" + myname
print (myname)
except Exception:
myname = "Result(cosine): Not in DB"
return myname
def button1_clicked(videoloop_stop):
threading.Thread(target=videoLoop, args=(videoloop_stop,)).start()

def button2_clicked(videoloop_stop):
videoloop_stop[0] = True
name = recognichen_euclidean()
if name == "Result(euclidean): Not in DB":
name = recognichen_cosine()
print(name)
label = ttk.Label(text= name, font=("Arial", 20), width=30, anchor="e")
label.pack()

def videoLoop(mirror=False):
No = 1
cap = cv2.VideoCapture(No)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 700)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
# Load face cascade classifier
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Start capturing video
while True:
ret, to_draw = cap.read()
if mirror is True:
to_draw = to_draw[:, ::-1]
image_gray = cv2.cvtColor(to_draw, cv2.COLOR_BGR2RGB)
# обнаружение лиц на фотографии по Хаару - рамка вывод в другое окно
faces = face_cascade.detectMultiScale(image_gray, 1.3, 5)
# для каждого обнаруженного лица нарисовать синий квадрат
for x, y, width, height in faces:
cv2.rectangle(to_draw, (x, y), (x + width, y + height), color= (255,0,255), thickness=2) #синий (255, 0, 0) БЕЛЫЙ (245, 245, 245)
cv2.imshow("Biometric authentication", to_draw)
if cv2.waitKey(1) == ord("q"):
break
# Конец обнаружения
cv2.imwrite("Detection/photo.jpg", image_gray )
print("Сохранила серую - 1")
image = Image.fromarray(image_gray)
image = ImageTk.PhotoImage(image)
panel = tk.Label(image=image)
panel.image = image
panel.place(x=50, y=50)
i = 11
cv2.imwrite("Detection/photo" + str(i) + ".jpg", to_draw)
print("Сохранила цветную- 1")

# check switcher value
if videoloop_stop[0]:
# if switcher tells to stop then we switch it again and stop videoloop
videoloop_stop[0] = False
panel.destroy()
break

# videoloop_stop is a simple switcher between ON and OFF modes
videoloop_stop = [False]

root = tk.Tk()
root.title("Биометрическая аутентификация. ")
root.geometry("1920x1080+0+0")

label = ttk.Label(text="Биометрическая аутентификация", font=("Arial", 14))
label.pack()

button1 = tk.Button(
root, text="Включить камеру", bg="#fff", font=("", 20),
command=lambda: button1_clicked(videoloop_stop))
button1.place(x=1200, y=360, width=400, height=100)

button2 = tk.Button(
root, text="Остановить и распознать", bg="#fff", font=("", 20),
command=lambda: button2_clicked(videoloop_stop))
button2.place(x=1200, y=500, width=400, height=100)

root.mainloop()
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
1. Как у тебя устроена "база данных" лиц? Ты указываешь относительный путь к ней - ты уверен, что программа корректно этот путь обрабатывает? Будет ли лучше работать, если указать абсолютный путь к каталогу с эталонными фото?
2. Насколько качественное изображение идёт с вебки? Если лицо занимает три с половиной пикселя, никакая сеть не справится. По-хорошему тебе стоило поэкспериментировать, постепенно уменьшая размер входных изображений и фиксируя процент ошибок. Это дало бы ответ на вопрос "насколько крупным должно быть лицо, чтобы его уверенно распознавало".
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы