Почему не удается распознать лицо из базы данный с веб-камеры?
Программа должна находить в базе данных фотографии, на которых изображен человек, обнаруженной веб-камерой, и выводить в форме название этих фотографий. Проблема заключается в том, что программа не находит людей, полученной веб-камерой, и выводит сообщение, что лицо не найдено в базе данных. Ниже прикрепляю код. Помогите , разобраться, пожалуйста, в чем проблема
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]
Black_sun_1906, нам с этой информации нет никакой пользы.
Смотри, если у тебя есть сложный алгоритм - то упрости задачу.
Пускай он распознает не лица а геометрические фигуры разных
цетов.
Пойди от простого к сложному.
Если ты систему сам обучал - то как ты проверял сходимость этой системы?
Она должна была повышать качество узнавания. У тебя должен был
быть асмимтотический график.
1. Надо заносить код в тег <code lang="python"></code>. Совершенно ни у кого нет желания копаться в таком куске текста
2. Используйте спойлер.
spoiler
while True:
ret, frame = cap.read()
cv2.imshow('Камера', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()#А это вообще в теле цикла или после?
cv2.destroyAllWindows()
3. Так возьмите Вы скрипт, который определяет по фото, делайте через питон одиночное фото и определяйте!!!
1. Как у тебя устроена "база данных" лиц? Ты указываешь относительный путь к ней - ты уверен, что программа корректно этот путь обрабатывает? Будет ли лучше работать, если указать абсолютный путь к каталогу с эталонными фото?
2. Насколько качественное изображение идёт с вебки? Если лицо занимает три с половиной пикселя, никакая сеть не справится. По-хорошему тебе стоило поэкспериментировать, постепенно уменьшая размер входных изображений и фиксируя процент ошибок. Это дало бы ответ на вопрос "насколько крупным должно быть лицо, чтобы его уверенно распознавало".
Vindicar, база данных находится в одном каталоге с кодом, программа заходит в этот каталог и начинает сравнение, но при этом она не находит похожие лица.
2. Качество хорошее, я подключаю камеру с телефона, и изображение отличное