我正在尝试在C ++中产生与该python包装器库相同的人脸编码: https://github.com/ageitgey/face_recognition/blob/master/face_recognition/api.py
C ++代码:
frontal_face_detector detector;
...
for (auto face : detector(img, numberOfTimesToUpsample))
{
auto shape = sp(img, face); //sp = shape_predictor 5 face landmarks same as python lib
matrix<rgb_pixel> face_chip;
extract_image_chip(img, get_face_chip_details(shape,150,0.25), face_chip); // Chip size and padding same as dlib python settings
faces.push_back(move(face_chip));
coords.push_back(face);
}
...
std::vector<dlib::matrix<float,0,1>> face_descriptors = net(faces, 16); // net is dlib_face_recognition_resnet_model_v1 same as python lib
...
python库默认情况下会升采样一次,并使用小的(5点)形状预测器,
所以我以numberOfTimesToUpsample
为1来调用c ++代码,并且由于我的c ++代码没有抖动,所以我以如下方式调用python代码:
encoding = face_recognition.face_encodings(image, num_jitters=0)[0]
但是,当我通过两个系统运行带有人脸的图像时,编码方式会大不相同。例如,前几次暗淡的c ++输出:
-0.131519
0.0520326
0.0556113
-0.101895
-0.165266
还有python:
-0.14469159
0.04349349
0.03403644
-0.1062524
-0.18296713
我已经在https://github.com/davisking/dlib/blob/master/tools/python/src/face_recognition.cpp处检查了用于计算编码的dlib C ++-Python API,除了没有将所有内容都强制转换为double
之外,我看不到任何主要区别。
修改:我也尝试将其转换为两倍。所有数字都一样。
我尝试构建链接到python dlib库随附的.so文件的项目。仍然有相同的数字。
我检查了我读取图像数据的方法产生的RGB像素值是否与python PIL.Image read-into-numpy-array相同。那里一切都很好。
我希望能够可靠地产生相同的输出。 我想念什么?