转自:https://blog.csdn.net/longji/article/details/77984753
版权声明:技术分享,csdn longji https://blog.csdn.net/longji/article/details/77984753
68个关键点的训练 数据集 (1.7GB):http://dlib.net/files/data/ibug_300W_large_face_landmark_dataset.tar.gz
194个关键点的数据集(需要翻墙):http://stackoverflow.com/questions/36711905/dlib-train-shape-predictor-ex-cpp?answertab=votes#tab-top
dlib中examples中的代码。
dlib/examples/train_shape_predictor_ex. cpp
// dlib/examples/train_shape_predictor_ex.cpp#include <dlib/image_processing.h>#include <dlib/data_io.h>#include <iostream> using namespace dlib;using namespace std; std::vector<std::vector<double> > get_interocular_distances ( const std::vector<std::vector<full_object_detection> >& objects); int main(int argc, char** argv){ try { if (argc != 2) { cout << "Give the path to the examples/faces directory as the argument to this" << endl; cout << "program. For example, if you are in the examples folder then execute " << endl; cout << "this program by running: " << endl; cout << " ./train_shape_predictor_ex faces" << endl; cout << endl; return 0; } const std::string faces_directory = argv[1]; dlib::array<array2d<unsigned char> > images_train, images_test; std::vector<std::vector<full_object_detection> > faces_train, faces_test; // 1. 载入训练集,测试集 // load_image_dataset(images_train, faces_train, faces_directory+"/training_with_face_landmarks.xml"); // load_image_dataset(images_test, faces_test, faces_directory+"/testing_with_face_landmarks.xml"); // 68个点的训练数据集:http://dlib.net/files/data/ibug_300W_large_face_landmark_dataset.tar.gz load_image_dataset(images_train, faces_train, faces_directory + "/labels_ibug_300W_train.xml"); load_image_dataset(images_test, faces_test, faces_directory + "/labels_ibug_300W_test.xml"); shape_predictor_trainer trainer; // 测试中调节了 tree_depth参数:2,4, 5, 10 // 测试机器为8核,set_num_threads使用8,训练时cpu:70% trainer.set_oversampling_amount(300); trainer.set_nu(0.05); trainer.set_tree_depth(5); trainer.set_num_threads(8); trainer.be_verbose(); // 训练 shape_predictor sp = trainer.train(images_train, faces_train); cout << "mean training error: "<< test_shape_predictor(sp, images_train, faces_train, get_interocular_distances(faces_train)) << endl; cout << "mean testing error: "<< test_shape_predictor(sp, images_test, faces_test, get_interocular_distances(faces_test)) << endl; // 保存模型 serialize("sp.dat") << sp; std::string str; std::cin >> str; } catch (exception& e) { cout << "\nexception thrown!" << endl; cout << e.what() << endl; }} double interocular_distance ( const full_object_detection& det){ dlib::vector<double,2> l, r; double cnt = 0; for (unsigned long i = 36; i <= 41; ++i) { l += det.part(i); ++cnt; } l /= cnt; cnt = 0; for (unsigned long i = 42; i <= 47; ++i) { r += det.part(i); ++cnt; } r /= cnt; return length(l-r);} std::vector<std::vector<double> > get_interocular_distances ( const std::vector<std::vector<full_object_detection> >& objects){ std::vector<std::vector<double> > temp(objects.size()); for (unsigned long i = 0; i < objects.size(); ++i) { for (unsigned long j = 0; j < objects[i].size(); ++j) { temp[i].push_back(interocular_distance(objects[i][j])); } } return temp;}194关键点训练情况:
tree_depth=2,num_threads=2,
Release版本训练时间 5+小时
Debug 版本训练时间 148+小时(训练一定要使用Release版本)
tree_depth=2,sp.dat=44.6MB,占用内存最大11GB
tree_depth=10,sp.data=11GB
68关键点训练结果:
tree_depth=2,num_threads=8, CPU :70% 内存:20+GB 6+小时 sp.data=15.8MB
tree_depth=4,num_threads=8,CPU:70% 内存:20+GB 12+小时 sp.data=63.3MB
tree_depth=5,num_threads=8,CPU:70% 内存:20+GB 16+小时 sp.data=126MB
tree_depth=5,num_threads=8mean training error: 0.0479476mean testing error: 0.0586204使用dlib中examples中的代码测试。
dlib/examples/face_landmark_detection_ex.cpp
也可食用dlib提供的训练 模型 :
http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
原图:
检测效果图: 
http://blog.csdn.net/jcx1314/article/details/65937839
http://blog.csdn.net/elaine_bao/article/details/53054533
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删