不正确的训练结果dlib
improper training result dlib
我正在尝试训练 train_shape_predictor_ex 以检测印度钞票中的以下图像。我使用了 34 张不同的图像,包括点击和扫描。
使用
成功训练模型
taining error = 0
testing error = 0.35468-6
我试过将过采样参数从 300 更改为 12000
但仍然是相同的结果。
我做错了什么?
绘图代码——从图片加载到绘图步骤:
image_window win;
frontal_face_detector detector = get_frontal_face_detector();
shape_predictor pose_model;
deserialize("sp.dat") >> pose_model;
while (!win.is_closed())
{
cv::Mat temp;
cap >> temp;
cv_image<bgr_pixel> cimg(temp);
std::vector<rectangle> faces = detector(cimg);
std::vector<full_object_detection> shapes;
for (unsigned long i = 0; i < faces.size(); ++i)
{
full_object_detection shape = pose_model(cimg, faces[i]);
std::vector<rectangle> dets = detector(cimg);
shapes.push_back(pose_model(cimg, faces[i]));
win.clear_overlay();
win.set_image(cimg);
win.add_overlay(dets, rgb_pixel(255, 0, 0));
win.add_overlay(render_face_detections(shapes));
}
}
正如我现在看到的那样 - 你正在尝试训练自定义 shape_predictor,它只有 14 个点,而使用 Dlib 的 render_face_detections
函数需要 Dlib 的面部形状有 68 个点。 render_face_detections
不会正确绘制您的形状,应该抛出异常。
要使您的形状预测有效,请确保您遵循以下条件:
- 每个点在每个图像上的含义应该相同。不要在第一张图片上将点 #0 放在耳朵上,在第二张图片上不要将点 #0 放在鼻尖上
- 如果您的数据集较小,则不应手绘对象边界框。如果您使用面部检测器来测试形状预测器 - 确保您的 training/testing 图像边界框是通过使用相同的面部检测器检测面部来制作的。是的,您可以手绘 whis 边界框,但请确保它们具有相同的大小和位置,就像它们将被检测到一样。 您将 box 放入训练集的方式应该与您将来获取它的方式相同。
- 不需要将所有点都放入人脸边界框内。实际上它可以有任何大小和位置,即使是鼻尖上每张脸的静态 10x10 框(或完整的喙矩形)也可以工作——但你应该有足够的训练样本。并遵循之前的条件
- 使用尽可能多的图片。 34 张图像对于训练形状预测器来说是不够的——如果只是将它们记住在其内部存储器中并且在未来将无法工作。 Dlib 的形状预测器使用大约 2-3k 个图像进行训练。
- 您可以通过扭曲原始图像来生成新图像 - 缩放、调整大小、添加噪声...
- 如果您的形状预测器没有与 dlib 的面部形状预测器具有相同含义的 68 个点,请不要使用 Dlib 的测试和绘图功能。您可以使用它的源代码并根据需要制作您的功能
我正在尝试训练 train_shape_predictor_ex 以检测印度钞票中的以下图像。我使用了 34 张不同的图像,包括点击和扫描。 使用
成功训练模型taining error = 0
testing error = 0.35468-6
我试过将过采样参数从 300 更改为 12000 但仍然是相同的结果。 我做错了什么?
绘图代码——从图片加载到绘图步骤:
image_window win;
frontal_face_detector detector = get_frontal_face_detector();
shape_predictor pose_model;
deserialize("sp.dat") >> pose_model;
while (!win.is_closed())
{
cv::Mat temp;
cap >> temp;
cv_image<bgr_pixel> cimg(temp);
std::vector<rectangle> faces = detector(cimg);
std::vector<full_object_detection> shapes;
for (unsigned long i = 0; i < faces.size(); ++i)
{
full_object_detection shape = pose_model(cimg, faces[i]);
std::vector<rectangle> dets = detector(cimg);
shapes.push_back(pose_model(cimg, faces[i]));
win.clear_overlay();
win.set_image(cimg);
win.add_overlay(dets, rgb_pixel(255, 0, 0));
win.add_overlay(render_face_detections(shapes));
}
}
正如我现在看到的那样 - 你正在尝试训练自定义 shape_predictor,它只有 14 个点,而使用 Dlib 的 render_face_detections
函数需要 Dlib 的面部形状有 68 个点。 render_face_detections
不会正确绘制您的形状,应该抛出异常。
要使您的形状预测有效,请确保您遵循以下条件:
- 每个点在每个图像上的含义应该相同。不要在第一张图片上将点 #0 放在耳朵上,在第二张图片上不要将点 #0 放在鼻尖上
- 如果您的数据集较小,则不应手绘对象边界框。如果您使用面部检测器来测试形状预测器 - 确保您的 training/testing 图像边界框是通过使用相同的面部检测器检测面部来制作的。是的,您可以手绘 whis 边界框,但请确保它们具有相同的大小和位置,就像它们将被检测到一样。 您将 box 放入训练集的方式应该与您将来获取它的方式相同。
- 不需要将所有点都放入人脸边界框内。实际上它可以有任何大小和位置,即使是鼻尖上每张脸的静态 10x10 框(或完整的喙矩形)也可以工作——但你应该有足够的训练样本。并遵循之前的条件
- 使用尽可能多的图片。 34 张图像对于训练形状预测器来说是不够的——如果只是将它们记住在其内部存储器中并且在未来将无法工作。 Dlib 的形状预测器使用大约 2-3k 个图像进行训练。
- 您可以通过扭曲原始图像来生成新图像 - 缩放、调整大小、添加噪声...
- 如果您的形状预测器没有与 dlib 的面部形状预测器具有相同含义的 68 个点,请不要使用 Dlib 的测试和绘图功能。您可以使用它的源代码并根据需要制作您的功能