不正确的训练结果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 不会正确绘制您的形状,应该抛出异常。

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

  1. 每个点在每个图像上的含义应该相同。不要在第一张图片上将点 #0 放在耳朵上,在第二张图片上不要将点 #0 放在鼻尖上
  2. 如果您的数据集较小,则不应手绘对象边界框。如果您使用面部检测器来测试形状预测器 - 确保您的 training/testing 图像边界框是通过使用相同的面部检测器检测面部来制作的。是的,您可以手绘 whis 边界框,但请确保它们具有相同的大小和位置,就像它们将被检测到一样。 您将 box 放入训练集的方式应该与您将来获取它的方式相同。
  3. 不需要将所有点都放入人脸边界框内。实际上它可以有任何大小和位置,即使是鼻尖上每张脸的静态 10x10 框(或完整的喙矩形)也可以工作——但你应该有足够的训练样本。并遵循之前的条件
  4. 使用尽可能多的图片。 34 张图像对于训练形状预测器来说是不够的——如果只是将它们记住在其内部存储器中并且在未来将无法工作。 Dlib 的形状预测器使用大约 2-3k 个图像进行训练。
  5. 您可以通过扭曲原始图像来生成新图像 - 缩放、调整大小、添加噪声...
  6. 如果您的形状预测器没有与 dlib 的面部形状预测器具有相同含义的 68 个点,请不要使用 Dlib 的测试和绘图功能。您可以使用它的源代码并根据需要制作您的功能