Почему я получаю индекс списка из-за ошибки диапазона при использовании библиотеки face_recognition в python? - PullRequest
0 голосов
/ 21 января 2019

Я пишу программу на python, которая принимает ввод изображения, имеющего человека, сравнивает его с изображениями в каталоге и копирует те изображения, где face_recognition оказывается верным для другого каталога. Кажется, это работает нормально, когда нужно сравнить только 10 изображений, но когда я сравниваю изображение с изображениями, почти равными 1000 в каталоге, я получаю индекс списка вне ошибки диапазона. Почему это происходит ? Код ниже

import face_recognition
import os
from shutil import copy

person = input("Enter the photo location of person to be found (eg. users/rishabh/my_photo.jpg) : ")
photos = input("Enter the photos folder location (eg. users/photo_folder) : ")
dest = input("Enter the location of folder to copy items into (eg. users/destination_folder) : ")
for filename in os.listdir(photos):
    if filename.endswith(".jpg") or filename.endswith(".jpeg") or filename.endswith(".png") or filename.endswith(".JPG"): 
    print(filename)
    files = photos + '/' + filename

    known_image = face_recognition.load_image_file(person)
    unknown_image = face_recognition.load_image_file(files)
    biden_encoding = face_recognition.face_encodings(known_image)[0]
    unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

    results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
    if(results[0]==True):
        src = photos+'/'+str(filename)
        copy(src, dest)

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Возможно, для изображений не будет кодировок лиц (изображений без лиц).

В этом случае вы получите пустой список при выполнении face_recognition.face_encodings.

Индексирование по пустому списку вызовет исключение (a = []; a [0]).

Итак, я добавил одну строку в ваш код, которая проверяет, есть ли в списке значения.

Попробуйте запустить приведенный ниже код и проверьте

import face_recognition
import os
from shutil import copy

person = input("Enter the photo location of person to be found (eg. users/rishabh/my_photo.jpg) : ")
photos = input("Enter the photos folder location (eg. users/photo_folder) : ")
dest = input("Enter the location of folder to copy items into (eg. users/destination_folder) : ")

known_image = face_recognition.load_image_file(person)
biden_encoding = face_recognition.face_encodings(known_image)

for filename in os.listdir(photos):
    if filename.endswith(".jpg") or filename.endswith(".jpeg") or filename.endswith(".png") or filename.endswith(".JPG"):
        print(filename)
        f = os.path.join(photos, filename)

        unknown_image = face_recognition.load_image_file(f)
        unknown_encoding = face_recognition.face_encodings(unknown_image)
        if not len(unknown_encoding):
            print(filename, "can't be encoded")
            continue

        results = face_recognition.compare_faces(biden_encoding, unknown_encoding[0])
        if(results[0]==True):
            copy(f, dest)
0 голосов
/ 21 января 2019

Эта ошибка вызвана тем, что сценарий последовательности выходит за пределы допустимого диапазона. рассмотрим следующее:

my_list = []
mylist[0]

приведет к следующей ошибке:

----> 1 my_list[0]
IndexError: list index out of range

Поскольку в данном диапазоне последовательностей не найдено ни одного элемента, возникает ошибка

Так что следующее будет работать

my_list = [1,2]
my_list[0]
my_list[1]

Но снова

my_list[2] will raise same error

Кажется, что следующее возвращает пустой список / кортеж:

face_recognition.face_encodings(unknown_image)
...