如何修复输出大于输入的附加列表?

How to fix appended list having output greater than input?

总结问题 我正在 运行 使用 OpenCV 和 face_recognition 模块通过 CNN 模型生成图像列表。我有多次 运行 条目,但继续以大于输入的列表结尾。

尝试的背景

一个。首先对图像进行编码,然后是 运行 二次处理,其中每个编码条目都是 运行 自身 (i+1),利用 face_recognition.compare_faces.

b。对图像进行编码,然后加载编码的 pickle 文件并从原始文件提取位置枚举每个图像。


数据说明:
-imagePaths293.png 文件的列表。

-encodings.pickleimagePaths 中已经编码的那些图像的字典。

显示一些代码
源代码已根据显示的 here 进行了修改。

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)

描述预期 |实际结果:

预计: 长度为 293 的列表 (matchesOutput)。其中每个索引等于 matchedIdxs for .

实际: 长度为 330.

的列表 (matchesOutput)

您正在遍历每个图像路径(293 个条目),然后为每个查看所有编码的路径(大概也是 293 个条目),如果该编码有任何匹配项,则附加匹配的索引。因此,对于每个图像路径,根据 face_recognition.compare_faces 方法的准确度,您可能会得到不止一种匹配编码或 none(只有当该方法非常弱时才会发生这种情况,因为每个图像也是在编码列表中),因此最终列表中的值多于(或可能少于)293 个。

即使使用非常准确的预测器,图像也可能包含同卵双胞胎或同一个人的两张图像,因此 330(即您看到的匹配数)甚至可能是正确的输出。

如果您想要一个恰好包含 293 个的列表,您将必须决定如何在多个匹配项之间进行选择(即最佳匹配项是什么),以及如果没有匹配项可能要追加的内容。