【问题标题】:improper training result dlib不正确的训练结果 dlib
【发布时间】:2017-02-18 14:35:58
【问题描述】:

我正在尝试训练 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个点。所有带有训练集的图像在检测中都给出了相同的错误。点被标记为正确我已经交叉检查了几次,甚至 0 训练错误可能意味着点是正确的。当我通过 face_landmark_detection 检测到图片之外时,边界框实际上没有出现某些点像素位置,即图像中实际存在的像素更多
  • 耳朵在上传的图片中不可见。但该图像实际上是一张完整的扫描账单。只是两张图片都太大了,无法同时显示在屏幕上,所以我就这样剪了
  • 您有什么建议吗?我都试试。我之前曾在几个数据集上进行过培训,并且一直运行良好。但是有些问题可能会少点?还是更少的样本?还是需要更改三个训练参数中的任何一个?训练中可能出现的眼间距部分问题?
  • 你的训练数据集应该有面部边界框。你是怎么得到它们的?手绘?当您尝试测试形状预测器时,如何获得人脸边界框?通过 frontal_face 检测器?

标签: dlib


【解决方案1】:

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

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

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

【讨论】:

  • 除了第二点和第六点我都做了。我也拿到了第六个,我会试试的。
  • 但我无法理解第二个。我知道你的意思是有一个像素区域相同但位置相同的盒子!我无法得到那个。你能详细说明一下吗
  • 如果调整相同图像的大小,为什么盒子会有相同的大小。我从中收集到的是,我只需要在所有图像上具有相同的像素区域,并且中心具有相同的地标点。框是否与其他地标边界无关。
  • 还有一点虽然 render_face_detctions 不会正确绘制形状,但它仍然应该准确定义像素位置,因为我还训练了 194 个点的 ibug 数据集,并且所有点的像素位置都是准确的,只是代码需要修改为正确连接行
  • 关于#2 - 你可以 1. 加载数据集。 2. 迭代所有图像 3. 重新检测面部并根据检测到的改变矩形位置。 4.使用更新的数据集进行训练。关于调整大小 - 当您调整图像大小并在其上检测人脸时 - 检测到的矩形也将根据新图像大小调整大小
猜你喜欢
  • 2017-12-02
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 2019-02-12
  • 2019-11-04
  • 2020-06-25
相关资源
最近更新 更多