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的主要内容,如果未能解决你的问题,请参考以下文章

我如何解决IndexError:列表索引超出范围?

IndexError:列表索引超出范围(打印整数)

Python:IndexError:列表索引超出范围

csv,IndexError:列表索引超出范围

IndexError:列表索引超出范围(对象检测)

IndexError:列表索引超出范围。无法理解问题出在哪里?