如何使用 dlib 训练或合并多个 .svm 并检测多个类

Posted

技术标签:

【中文标题】如何使用 dlib 训练或合并多个 .svm 并检测多个类【英文标题】:How to train or merge multiple .svm and detect multiple classes using dlib 【发布时间】:2017-11-11 22:01:53 【问题描述】:

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

到目前为止,我发现的例子是只训练一个类并生成一个 .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
);

问题:

    我需要生成一个 .dat 文件,如此处http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 的人脸标志检测。那么我如何一次训练和序列化或组合 .svm 文件呢?

    然后我需要运行检测来检测 .dat 文件中的所有 .svm。我可以举一个如何使用 C++ 或 Python 执行此操作的示例吗?

谢谢。

【问题讨论】:

【参考方案1】:

我可以告诉你如何在 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 倍。但这将取决于每个检测器的检测窗口相似程度。

【讨论】:

以上是关于如何使用 dlib 训练或合并多个 .svm 并检测多个类的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python/Numpy 的 dlib SVM 的最小示例

Dlib 中 .svm 文件和 .dat 文件之间的区别

如何使用 Dlib 的多目标检测器?

dlib 的 dcd 训练器的“热启动”选项是不是仅适用于 1 类分类?

使用多个特征的支持向量机 (SVM) 训练

是否可以使用 Keras 在卷积神经网络的最后一层特征上训练 SVM 或随机森林?