face_recognition停止时触发KeyboardInterrupt报错问题排查
问题原因分析
该报错不属于业务逻辑错误,是手动终止程序时触发的标准中断异常,具体触发逻辑:
- 你的代码通过
while True无限循环实现实时人脸识别,循环内第73行调用的face_recognition.face_encodings()是CPU密集型操作,底层依赖dlib库完成128维人脸特征计算,单次执行有固定耗时 - 当你通过Ctrl+C、IDE停止按钮等方式手动终止程序时,系统会向Python进程发送
KeyboardInterrupt中断信号,如果信号送达时程序正好在执行人脸编码计算、尚未走完单次循环流程,解释器就会在当前执行的代码位置抛出中断,打印对应的栈追踪信息 - 程序运行阶段功能完全正常,已经可以证明人脸识别的业务逻辑没有问题,这个报错仅会在手动强制终止时出现,不影响功能实际运行效果。
可行解决方法
- 捕获中断信号实现优雅退出(推荐)
将主循环逻辑包裹在异常捕获块中,拦截KeyboardInterrupt信号,完成摄像头资源释放后正常退出,不会抛出红色错误栈,参考代码:import cv2 import face_recognition # 原有初始化逻辑 cap = cv2.VideoCapture(0) try: while True: success, img = cap.read() if not success: break imgS = cv2.resize(img, (0,0), None, 0.25, 0.25) imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB) facedetectionFrame = face_recognition.face_locations(imgS) encodecurFrame = face_recognition.face_encodings(imgS, facedetectionFrame) # 原有后续人脸匹配、结果绘制、画面展示等逻辑 except KeyboardInterrupt: # 拦截手动终止信号,不抛出异常栈 pass finally: # 统一释放资源 cap.release() cv2.destroyAllWindows() - 优化识别逻辑降低计算耗时
调用face_encodings时保持num_jitters参数为默认值1,该参数控制编码时的图像重采样次数,数值越高计算耗时越长;另外可以设置隔帧检测(比如每2-3帧做一次人脸定位和编码),既能降低CPU占用,也能减少中断信号命中计算环节的概率。 - 不推荐的临时方案:运行脚本时重定向错误输出到空设备,直接屏蔽所有错误打印,该方式会同时掩盖代码本身的真实运行报错,排查问题时很难定位故障。
内容的提问来源于stack exchange,提问作者Fahad Waseem
相关产品推荐
相关产品推荐

