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

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

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