Я пытаюсь создать ту же кодировку лица в 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-точечный) предиктор формы,
, поэтому я вызываю код c ++ с numberOfTimesToUpsample
в качестве 1, и так как мой код c ++ не выполняет дрожание, то я вызываю код python как: encoding = face_recognition.face_encodings(image, num_jitters=0)[0]
Однако, когда я запускаю изображение с лицом через обе системы, кодировки получаются совершенно разными.Например, выходные данные c ++ первых нескольких dims:
-0.131519
0.0520326
0.0556113
-0.101895
-0.165266
и python:
-0.14469159
0.04349349
0.03403644
-0.1062524
-0.18296713
Я исследовал dlib C ++ - Python API для вычисления кодировок здесь: https://github.com/davisking/dlib/blob/master/tools/python/src/face_recognition.cpp и на самом деле не вижу никаких существенных отличий, кроме того, что не приводим все к double
.
Редактировать : я также пытался преобразовать в удвоение.Все числа одинаковы.
Я пытался создать свой проект, связанный с файлом .so, который поставляется с библиотекой python dlib.Все еще получил те же числа.
Я проверил, что мой метод чтения данных изображения выдает те же значения пикселей RGB, что и массив python PIL.Image чтения-в-numpy.Там все выглядит хорошо.
Я бы хотел, чтобы можно было надежно производить тот же вывод.Чего мне не хватает?