如何为dlib的compute_face_descriptor函数设置随机种子保证结果可复现
原因说明
dlib的随机数生成逻辑完全独立于numpy、Python标准库的random模块,你设置np.random.seed()只会影响numpy的随机行为,无法作用于dlib做jitter扰动时的随机采样过程,所以会出现设置了numpy种子但结果仍然不稳定的情况。
解决方案
调用dlib自带的全局随机种子设置函数dlib.set_seed()即可固定内部随机状态,保证num_jitters>0时多次计算的人脸嵌入完全一致。
代码示例
import dlib import numpy as np # 固定dlib全局随机种子,数值可自定义 dlib.set_seed(43) # 原有numpy种子设置可以保留,不影响dlib逻辑 np.random.seed(43) # 初始化人脸识别模型 face_rec_model = dlib.face_recognition_model_v1('dlib_face_recognition_resnet_model_v1.dat') # 传入对齐后人脸图像、人脸关键点,num_jitters设为10计算嵌入 # 注:img、shape为你提前获取的人脸输入数据 face_embedding = face_rec_model.compute_face_descriptor(img, shape, num_jitters=10) # 转为numpy数组可选 face_embedding = np.array(face_embedding)
注意事项
- 如果程序中存在多线程调用dlib接口的场景,需要保证每个线程在调用
compute_face_descriptor前都重新设置一次dlib种子,避免多线程随机状态互相干扰 - 每次重启进程、重新初始化模型后,只要重新调用
dlib.set_seed()传入相同数值,就能得到完全一致的输出结果
内容的提问来源于stack exchange,提问作者Amandeep Singh Uppal
相关产品推荐
相关产品推荐

