不正确的训练结果dlib

时间:2016-10-10 08:01:48

标签: dlib

left landmark markings. right detection results

我正在尝试训练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));
       }
    }

1 个答案:

答案 0 :(得分:1)

正如我现在看到的那样 - 你正在尝试训练自定义shape_predictor,在使用Dlib的render_face_detections函数时只需要14个点,这个函数需要Dlib的脸部形状有68个点。 render_face_detections不会正确绘制你的形状,应该抛出异常。

为了使您的形状预测有效,请确保您遵循以下条件:

  1. 每个图片的含义在每张图片上应该相同。不要在第一张图像上将第0点放在耳朵上,在第二张图像上放置鼻子上的#0
  2. 如果您的数据集较小,则不应手绘对象边框。如果使用面部检测器测试形状预测器 - 确保通过使用相同的面部检测器检测面部来制作训练/测试图像边界框。是的,您可以手绘边框,但请确保它们具有相同的尺寸和位置,就像检测它们一样。 如何将盒子放在训练台上的方式应该与将来获得它的方式相同。
  3. 无需在面部边界框内容纳所有点。真的,它可以有任何大小和位置,即使是鼻子上的每个脸(或全票据矩形)的静态10x10盒子也可以 - 但是你应该有足够的训练样本。并遵循先前的条件
  4. 使用尽可能多的图片。 34个图像不足以用于训练形状预测器 - 如果只是在内部记忆中记住它们并且将来不会起作用。 Dlib的形状预测器训练有大约2-3k图像。
  5. 您可以通过扭曲原始图像来生成新图像 - 缩放,调整大小,添加噪点......
  6. 如果您的形状预测器没有与dlib的面部形状预测器具有相同含义的68个点,请不要使用Dlib的测试和绘制函数。您可以使用其源代码并根据需要制作功能