01 dlib人脸检测器原始数据获取
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
02 训练代码
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; -
}
03 训练结果
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=8 -
mean training error: 0.0479476 -
mean testing error: 0.0586204
04 测试效果
使用dlib中examples中的代码测试。
dlib/examples/face_landmark_detection_ex.cpp
也可食用dlib提供的训练模型:
http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
原图:
检测效果图:
05 参考
http://blog.csdn.net/jcx1314/article/details/65937839
http://blog.csdn.net/elaine_bao/article/details/53054533