如何提升Python face_recognition库compare_faces万级人脸比对速度
人脸比对速度优化方法
以下是针对你当前场景可直接落地的优化方案:
- 去掉冗余IO操作
你当前循环内两次print调用属于性能损耗极高的控制台IO操作,Windows系统下该类操作的耗时远高于计算逻辑,可直接删除这两行打印,仅保留匹配成功时的打印逻辑即可,单这一项就能提升30%以上的运行速度。 - 预缓存人脸编码,避免重复计算
你当前方案的90%以上耗时都集中在face_encodings提取人脸特征的步骤,比对逻辑本身开销极低。你可以首次运行时将10000张图的人脸编码序列化保存到本地(比如用pickle库存为.pkl文件),后续所有比对任务直接读取本地缓存的编码列表即可,无需反复加载图片、提取特征,后续比对速度可提升到每秒数千次。
示例序列化代码片段:import pickle import os # 首次生成编码时运行 encodings = [] filenames = [] for f in files: # 只处理jpg文件,避免异常 if not f.lower().endswith('.jpg'): continue img = face_recognition.load_image_file(os.path.join(path, f)) face_enc = face_recognition.face_encodings(img) # 跳过检测不到人脸的图片 if not face_enc: continue encodings.append(face_enc[0]) filenames.append(f) # 保存到本地 with open('face_encodings.pkl', 'wb') as f: pickle.dump({'encodings': encodings, 'filenames': filenames}, f) # 后续比对时直接读取,无需再遍历图片 with open('face_encodings.pkl', 'rb') as f: data = pickle.load(f) all_encodings = data['encodings'] all_filenames = data['filenames'] # 批量比对效率远高于循环单次比对 results = face_recognition.compare_faces(all_encodings, known_encoding) - 开启并行特征提取
face_encodings方法支持num_jobs参数,传入你的CPU线程数即可开启并行提取,比如4线程CPU就设置num_jobs=4,特征提取速度可提升3-4倍:unknown_encoding = face_recognition.face_encodings(unknown_image, num_jobs=4)[0] - 优化运行环境
- 不要在Visual Studio 2019中运行脚本,直接使用系统命令行执行Python脚本,可减少IDE占用的内存和CPU资源,避免系统资源争抢
- 关闭所有后台不必要的进程,你当前仅4GB内存,Windows7系统本身就会占用2GB左右内存,内存不足触发虚拟内存分页会大幅降低运行速度
- 可编译安装支持OpenVINO加速的dlib依赖,适配你的Intel HD Graphics核显,特征提取速度可再提升2-3倍
内容的提问来源于stack exchange,提问作者данил куролесов
相关产品推荐
相关产品推荐

