Как исправить добавленный список, вывод которого больше ввода? - PullRequest
0 голосов
/ 23 октября 2019

Подведите итог проблемы Я запускаю список изображений через модель CNN, используя модули OpenCV и face_recognition. Я запустил запись несколько раз, но продолжаю оканчивать список большим, чем ввод.

Фон того, что было опробовано

a. Сначала закодируйте изображения, затем запустите вторичный процесс, в результате которого каждая закодированная запись запускается против себя (i + 1), используя face_recognition.compare_faces.

b. Кодирование изображений с последующей загрузкой закодированного файла огурцов и перечислением каждого изображения из исходного места извлечения файлов.


Примечание к данным:
- imagePaths - списокиз 293 .png файлов.

- encodings.pickle - это словарь тех изображений в imagePaths, которые уже были закодированы.

Показать некоторый код
Исходный код был изменен по сравнению с показанным здесь .

data = pickle.loads(open("encodings.pickle","rb").read())

imagePaths = list(paths.list_images("./images")

matchesOutput = []

for (i,imagePath) in enumerate(imagePaths):
  d = dt.datetime.now()
  print(d.isoformat())
  print("[INFO] processing image {}/{}".format(i + 1, 
        len(imagePaths)))
  image = cv2.imread(imagePath)
  rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
  boxes = face_recognition.face_locations(rgb,model = 'cnn')
  encodings = face_recognition.face_encodings(rgb,boxes)
  names = []

  for encoding in encodings:
    matches = face_recognition.compare_faces(data["encodings"],encoding)
    name = "Unknown"

    if True in matches:
        matchedIdx=[i for (i,b) in enumerate (matches) if b]
        matchesOutput.append(matchedIdxs)

Опишите ожидаемое |фактические результаты:

Ожидается : список (matchesOutput) длины 293. Где каждый индекс равен matchedIdxs для .

Actual : список (matchesOutput) длиной 330 .

1 Ответ

0 голосов
/ 23 октября 2019

Вы проходите через каждый путь изображения (293 записи), а затем для каждого из тех, кто просматривает все кодировки (предположительно также 293 записи), и, если есть какие-либо совпадения для этой кодировки, добавляя соответствующие индексы. Поэтому для каждого пути к изображению, в зависимости от того, насколько точен метод face_recognition.compare_faces, вы можете получить более одной подходящей кодировки или ни одной (что должно происходить, только если метод очень слабый, поскольку каждое изображение также находится в закодированном списке),и, следовательно, больше (или потенциально меньше), чем 293 значения в вашем окончательном списке.

Даже с очень точным предиктором изображения могут содержать идентичных близнецов, например, или два изображения одного и того же человека, и поэтому 330, который являетсяколичество совпадений, которые вы видите, может даже быть правильным выводом.

Если вы хотите список точно из 293, вам придется решить, как выбрать между несколькими совпадениями (то есть, какое совпадение является наилучшим) ипотенциально, что добавить, если не найдено совпадений.

...