总结问题 我正在使用OpenCV和face_recognition模块通过CNN模型运行图像列表。我已经多次运行该条目,但是继续以大于输入的列表结束。
尝试过的背景
a。首先对图像进行编码,然后运行辅助过程,从而利用face_recognition.compare_faces
对每个编码的条目进行针对自己(i + 1)的操作。
b。对图像进行编码,然后加载编码的pickle文件,并从原始文件提取位置枚举每个图像。
有关数据的说明:
-imagePaths
是 293 .png文件的列表。
-encodings.pickle
是imagePaths
中已被编码的那些图像的字典。
显示一些代码
源代码已从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
)。
答案 0 :(得分:0)
您正在遍历每个图像路径(293个条目),然后针对每个查看所有编码的人(大概也是293个条目),如果该编码有任何匹配项,则附加匹配的索引。因此,对于每个图像路径,根据face_recognition.compare_faces
方法的精确度,您可能会获得多个匹配编码,或者没有一个匹配编码(仅在该方法非常弱的情况下才会发生,因为每个图像也在编码列表中) ),因此比最终列表中的293个值更多(或可能更少)。
即使具有非常精确的预测变量,这些图像也可能包含例如同卵双胞胎或同一个人的两张图像,因此330(这是您看到的匹配数)甚至可能是正确的输出。
如果您想要一个正好为293的列表,则必须决定如何在多个匹配项之间进行选择(即最佳匹配项),如果没有匹配项,则可能要追加什么内容。