Я пишу код dlib для распознавания лиц от 1 до 1.
Я следовал за примером кода в образцах dlib и сделал следующее:
std::vector<matrix<rgb_pixel>> faces;
for (auto face : detector(img1))
{
auto shape = sp(img1, face);
matrix<rgb_pixel> face_chip;
extract_image_chip(img1, get_face_chip_details(shape, 150, 0.25), face_chip);
faces.push_back(move(face_chip));
}
это для первого изображения, а затем сделал то же самое для второго изображения:
for (auto face : detector(img2))
{
auto shape = sp(img2, face);
matrix<rgb_pixel> face_chip;
extract_image_chip(img2, get_face_chip_details(shape, 150, 0.25), face_chip);
faces.push_back(move(face_chip));
}
, затем я продолжаю по указанной ссылке:
std::vector<matrix<float, 0, 1>> face_descriptors = net(faces);
std::vector<sample_pair> edges;
for (size_t i = 0; i < face_descriptors.size(); ++i)
{
for (size_t j = i; j < face_descriptors.size(); ++j)
{
if (length(face_descriptors[i] - face_descriptors[j]) < threshold)
edges.push_back(sample_pair(i, j));
}
}
std::vector<unsigned long> labels;
const int num_clusters = chinese_whispers(edges, labels);
//etc
и теперь приходит мойвопрос.img1 - это изображение, уже доступное коду, который читается, когда мне нужно найти конкретного человека.(т.е. если я хочу обработать personX, img1 читается с использованием
load_image(img1, "personX.jpg");
. Вместо сохранения изображения я пытался сохранить объекты и загрузить их, чтобы сократить время, затрачиваемое на извлечение объектов.то, что я сделал, я переместил первый цикл for для другой функции (например, для регистрации) и сделал это примерно так:
std::vector<matrix<rgb_pixel>> faces;
for (auto face : detector(img1))
{
auto shape = sp(img1, face);
matrix<rgb_pixel> face_chip;
extract_image_chip(img1, get_face_chip_details(shape, 150, 0.25), face_chip);
serialize("personX.dat") <<face_chip;
}
затем при распознавании вместо цикла я использовал
matrix<rgb_pixel> face_chip;
deserialize("personX.dat")>>face_chip;
faces.push_back(move(face_chip));
и остальная часть кода после извлечения img2 и далее осталась прежней. Код скомпилирован. Но во время выполнения, когда я достигаю распознавания, я получаю следующую ошибку:
**************************** ОБНАРУЖЕНА ФАТАЛЬНАЯ ОШИБКА ****************************
Ошибка обнаружена в строке 216. Ошибка обнаружена в файле /usr/local/include/dlib/dnn/input.h. Ошибка обнаружена в функции void dlib :: input_rgb_image_sized :: to_tensor (forward_iterator,forward_iterator, dlib :: resizable_tensor &) const [with forward_iterator = __gnu_cxx :: __ normal_iterator *, std :: vector>>; long unsigned int NR = 150 мул;long unsigned int NC = 150ul].
Неудачное выражение было i-> nr () == NR && i-> nc () == NC input_rgb_image_sized :: to_tensor ()
Все входные данныеизображения должны иметь 150 строк и 150 столбцов, но мы получили одно с 0 строками и 0 столбцами.
Что-то не так с сериализацией / десериализацией?или я должен сделать запись функций в файл другим методом?
код для полной функции:
try
{
load_image(img1, check_image);
}
catch (...)
{
cout<<"Name: "<<uname<<" doesn't exist"<<endl;
return;
}
else
{
QElapsedTimer timer;
timer.start();
dlib::assign_image(img2, dlib::cv_image<bgr_pixel>(colorImage));
std::vector<matrix<rgb_pixel>> faces;
for (auto face : detector(img1))
{
auto shape = sp(img1, face);
matrix<rgb_pixel> face_chip;
extract_image_chip(img1, get_face_chip_details(shape, 150, 0.25), face_chip);
faces.push_back(move(face_chip));
// serialize("out.dat")<<face_chip; //used whin i dont need to read image
}
// matrix<rgb_pixel> face_chip; //used whin i dont need to read image
// deserialize("out.dat")>>face_chip; //used whin i dont need to read image
// faces.push_back(move(face_chip)); //used whin i dont need to read image
cout<<"Time to extract features for enroled image: "<<timer.elapsed()<<endl;
timer.restart();
for (auto face : detector(img2))
{
auto shape = sp(img2, face);
matrix<rgb_pixel> face_chip;
extract_image_chip(img2, get_face_chip_details(shape, 150, 0.25), face_chip);
faces.push_back(move(face_chip));
}
cout<<"Time to extract features for new image: "<<timer.elapsed()<<endl;
timer.restart();
if (faces.size() < 2)
{
cout<<"No Face"<<endl;
}
else
{
std::vector<matrix<float, 0, 1>> face_descriptors = net(faces);
std::vector<sample_pair> edges;
for (size_t i = 0; i < face_descriptors.size(); ++i)
{
for (size_t j = i; j < face_descriptors.size(); ++j)
{
if (length(face_descriptors[i] - face_descriptors[j]) < threshold)
edges.push_back(sample_pair(i, j));
}
}
std::vector<unsigned long> labels;
const int num_clusters = chinese_whispers(edges, labels);
if (num_clusters == 1)
{
cout<<"Recognized"<<endl;
}
else
{
cout<<"Faces don't match";
}
}
cout<<"Needed time is: "<<timer.elapsed()<<" ms"<<endl;
}