IndexError: list index out of range,face_recognition

3
我将使用OpenCV和人脸识别一起,但是这行代码:
```python ```
biden_encoding = face_recognition.face_encodings(known_image)[0]

给我报了以下错误:
IndexError: list index out of range

我已经阅读了这个错误,并且大多数人认为这意味着face_recognition在帧中没有检测到任何人脸。但是,open cv在同一帧中检测到了人脸,所以我不确定是否确实没有检测到任何人脸,或者我因为其他原因收到了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

你想展示代码的其余部分吗,伙计? - Sahil
当您打印 face_recognition.face_encodings(known_image) 时,会得到什么? - arshovon
代码的逻辑是,OpenCV在实时视频流的帧中检测到一个人脸,然后将该帧裁剪到该人脸并保存为.jpg格式。面部识别软件随后加载该.jpg文件,并为加载的图像和下一帧的传入图像绘制“.face_encodings”,并比较两个编码以检查是否为同一张脸。我稍后会将必要的代码加载到问题中。 - Jason Rieder
回答Arsho的问题,我得到了一个数字列表,这就是为什么我对这个错误感到困惑的原因。 - Jason Rieder
请注意,我已经从代码中删除了与问题无关的大量内容,因此代码可能无法运行... - Jason Rieder
4个回答

4
这意味着face_recognition模块在图像中找不到任何人脸。face_recognition.face_encodings(known_image)基本上返回照片中所有找到的人脸的列表。现在,您正在使用索引[0]获取第一个发现的人脸。然而,当图像中没有人脸时,您尝试获取不存在的索引,因此会出现IndexError错误。
唯一真正的解决方案是使用新图像。 face_recognition无法找到任何人脸,因此您可以编写自己的算法来查找人脸,但我强烈不建议这样做,或者您可以使用其他图像。

1

我通过将图片更改为JPEG格式来解决这个问题,这意味着您应该包含一张清晰质量的JPEG格式的图片,谢谢。


1
这意味着dlib人脸检测器无法在您传入的图像中检测到人脸。您可以添加一个类似于以下代码的try异常块:
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


0

我正在加载一个动画图片(它是以 .jpg 格式保存的,但是是动画图片),因此我遇到了这个错误。我将图片更改为普通的非动画图片,这次相同的代码就可以正常工作了,没有任何错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接