如何使用dlib

时间:2017-06-09 19:24:30

标签: python c++ image-processing deep-learning dlib

我想做一个非常简单的例子:使用dlib训练检测“cat”和“dog”(两个类)并提供盒子坐标。

到目前为止,我发现的示例是只训练一个类并生成一个.svm文件:http://dlib.net/train_object_detector.cpp.html

我不擅长C ++(但我可以学习)而且我更喜欢用Python做事。经过几天的研究(我也是深度学习的新手),我想我必须改变这些方面:

object_detector<image_scanner_type> detector = trainer.train(images, object_locations, ignore);
serialize("object_detector.svm") << detector;

因此我应该在http://dlib.net/dlib/image_processing/object_detector_abstract.h.html中使用以下内容:

explicit object_detector (
  const std::vector<object_detector>& detectors
);

问题:

  1. 我需要在这里http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2生成一个.dat文件,就像Face地标检测一样。那么我如何一次训练和序列化或者将.svm文件结合起来呢?

  2. 然后我需要运行检测来检测.dat文件中的所有.svm。我可以通过C ++或Python获得如何使用它的示例吗?

  3. 感谢。

1 个答案:

答案 0 :(得分:3)

我可以告诉你如何在C ++中这样做。我希望你能够弄清楚如何用Python做到这一点。

您不需要使用单个.dat文件来执行此操作。您可以单独训练探测器并保存到单独的文件中。这允许您添加新的探测器,替换现有的等,而无需重新训练。 在您需要创建探测器矢量后。即:

std::vector<object_detector> detectors(3);
dlib::deserialize(detectors[0], "object_detector.svm");
dlib::deserialize(detectors[1], "object_detector_2.svm");
dlib::deserialize(detectors[2], "object_detector_3.svm");

然后你运行这样的检测:

std::vector<dlib::rect_detection> detections;
dlib::evaluate_detectors(detectors, image, detections);

然后您可以访问检测到的对象:

for (auto& det : detections) {
    det.rect;          // found rectangle
    det.weight_index;  // detector index in vector (to indentify object class)
}

在我的情况下,一次运行所有探测器(5)的速度比顺序运行快2.5-3倍。但这取决于每个探测器的检测窗口的相似程度。