如何解决输出大于输入的追加列表?

时间:2019-10-23 09:47:56

标签: python python-3.x loops opencv enumeration

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

尝试过的背景

a。首先对图像进行编码,然后运行辅助过程,从而利用face_recognition.compare_faces对每个编码的条目进行针对自己(i + 1)的操作。

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


有关数据的说明:
-imagePaths 293 .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)

描述期望的|实际结果:

预期: 长度为matchesOutput的列表(293)。对于,每个索引都等于matchedIdxs

实际: 长度为 330 的列表(matchesOutput)。

1 个答案:

答案 0 :(得分:0)

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

即使具有非常精确的预测变量,这些图像也可能包含例如同卵双胞胎或同一个人的两张图像,因此330(这是您看到的匹配数)甚至可能是正确的输出。

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