IndexError:列表索引超出范围,face_recognition
Posted
技术标签:
【中文标题】IndexError:列表索引超出范围,face_recognition【英文标题】:IndexError: list index out of range, face_recognition 【发布时间】:2020-05-12 04:06:12 【问题描述】:我同时使用open cv和人脸识别,但是这行代码:
biden_encoding = face_recognition.face_encodings(known_image)[0]
给我以下错误:
IndexError: list index out of range
我已经阅读了这个错误并且大多数人认为这意味着 face_recognition 没有检测到帧中的任何人脸。 然而,open cv 正在检测同一帧 内的人脸,所以我不确定 face_recognition 是否确实没有检测到任何人脸,或者由于其他原因我收到了 IndexError?
获取问题背景所需的所有代码:
check, frame = video.read()
faceCascade = cv2.CascadeClassifier(
'C:\\Users\\Astroid\\Desktop\\face detection software\\data\\haarcascade_frontalface_alt.xml')
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
frame,
scaleFactor=1.2,
minNeighbors=5,
)
for x, y, w, h in faces:
img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 1)
if len(os.listdir("C:\\Users\\Astroid\\Desktop\\face detection software\\saved faces\\")) == 0:
cv2.imwrite(
"C:\\Users\\Astroid\\Desktop\\face detection software\\saved faces\\" + "1 faces.jpg", cropped)
else:
cv2.imwrite(
"C:\\Users\\Astroid\Desktop\\face detection software\\unknown faces\\" + " unknown_faces.jpg", cropped)
known_image = face_recognition.load_image_file(
"C:\\Users\\Astroid\\Desktop\\face detection software\\saved faces\\" + "1 faces.jpg")
unknown_image = face_recognition.load_image_file(
"C:\\Users\\Astroid\Desktop\\face detection software\\unknown faces\\" + " unknown_faces.jpg"
biden_encoding = face_recognition.face_encodings(known_image)[0]
print(biden_encoding)#
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
print(unknown_encoding)#
results = face_recognition.compare_faces([biden_encoding], [unknown_encoding])
if results >= (60):
shutil.move(
"C:\\Users\\Astroid\Desktop\\face detection software\\unknown faces\\" + " unknown_faces.jpg",
"C:\\Users\\Astroid\\Desktop\\face detection software\\saved faces\\" + (face_num) + (" faces.jpg"))
else:
pass
【问题讨论】:
你想给我看剩下的代码吗? 打印face_recognition.face_encodings(known_image)
会得到什么?
代码的逻辑是 open-cv 在实时视频源的帧中检测到人脸,然后 opencv 将帧裁剪到该人脸并将其保存为 .jpg,人脸-识别然后将该 .jpg 加载到软件中并为加载的图像和来自下一帧的传入图像绘制“.face_encodings”,并比较两种编码以检查面部是否是同一张脸。请在几秒钟内将必要的代码写入问题中。
回答 arsho 的问题我得到了一个数字列表,这就是为什么我对这个错误如此困惑
请注意,我确实从与问题无关的代码中删除了一些内容,因此代码可能无法运行...
【参考方案1】:
这意味着,dlib
人脸检测器无法检测到您传入的图像中的人脸。您可以添加类似这样的尝试异常块:
try:
image_to_be_matched_encoded = face_recognition.face_encodings(known_image)[0]
except IndexError as e:
print(e)
sys.exit(1) # stops code execution in my case you could handle it differently
可以在这里找到更多信息:https://github.com/ageitgey/face_recognition/issues/100#issuecomment-307590846
【讨论】:
【参考方案2】:我通过将图像更改为 jpeg 来解决该问题,这意味着您应该使用 jpeg 类型包含此类图像的干净质量,问候
【讨论】:
【参考方案3】:这意味着face_recognition
模块在图像中找不到任何面孔。 face_recognition.face_encodings(known_image)
基本上返回照片中找到的所有面孔的列表。现在,您正在使用索引[0]
来获取第一个找到的人脸。但是,当图像中没有人脸时,您会尝试获取不存在的索引,因此是 IndexError
。
唯一真正的解决方案是使用新图像。 face_recognition
找不到任何人脸,所以你可以自己制定算法来找到人脸,我强烈不建议这样做,或者你使用不同的图像。
【讨论】:
以上是关于IndexError:列表索引超出范围,face_recognition的主要内容,如果未能解决你的问题,请参考以下文章