dlib-19.1:从图像初始化dlib :: matrix(例如dlib :: cv_image)进行DNN训练

时间:2016-10-05 15:20:52

标签: c++ opencv deep-learning dlib

我目前正在尝试使用我存档的图像训练DNN(OCR上下文...每类输入图像是几千个固定大小的小图像的聚合图像)。

我有一些代码可以打开并将聚合图像正确地分割成小的OpenCV cv :: Mat&#39。我的问题是,似乎没有办法

  • 直接在dlib :: cv_image上训练DNN(可以用cv :: Mat包裹;我得到500多行编译错误)或
  • 轻松转换/包装cv :: Mat到dlib :: matrix而不复制每个元素

我很确定我在这里遗漏了一些东西,任何指针都会非常感激。

注意:我编译的唯一变种是使用dlib :: matrix(在编译时修复大小)的向量调用dlib :: dnn_trainer :: train()和带有无符号长标签的向量(无符号标签没有尽管train()是两种类型的模板。有什么指针吗?

2 个答案:

答案 0 :(得分:2)

您不必在编译时修复dlib :: matrix的大小。只需在其上调用set_size()即可。另请参阅http://dlib.net/faq.html#HowdoIsetthesizeofamatrixatruntime

另外,如果你想使用除dlib :: matrix以外的东西作为输入,你可以这样做。您只需定义自己的输入图层即可。您必须实现的界面在此完整记录:http://dlib.net/dlib/dnn/input_abstract.h.html#EXAMPLE_INPUT_LAYER。您还可以查看现有输入图层以获取示例。但请务必阅读文档,因为它将回答您可能会遇到的问题。

答案 1 :(得分:1)

Dlib对此任务有一个惊人的功能:http://dlib.net/imaging.html#assign_image,但它会复制每个元素

以下是有关如何使用它的示例代码:

// mat should be greyscale image (8UC1)
void cv_to_dlib_float_matrix(const cv::Mat& mat, dlib::matrix<float>& res)
{
    cv::Mat tmp(mat.cols, mat.rows, CV_32FC1); 
    cv::normalize(mat, tmp, 0.0, 1.0, cv::NORM_MINMAX, CV_32FC1);
    dlib::assign_image(res, dlib::cv_image<float>(tmp));
}