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

dlib-19.1: Initialize dlib::matrix from image (e.g. dlib::cv_image) for DNN training

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

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

我很确定我在这里遗漏了一些东西,将不胜感激任何指点。

注意:我要编译的唯一变体是使用 dlib::matrix 向量(大小在编译时固定)和带有无符号长标签的向量调用 dlib::dnn_trainer::train()不编译),尽管 train() 在这两种类型上都是模板化的。有什么指点吗?

您不必在编译时固定 dlib::matrix 的大小。只需调用 set_size() 即可。另见 http://dlib.net/faq.html#HowdoIsetthesizeofamatrixatruntime.

此外,如果您想使用 dlib::matrix 以外的其他内容作为输入,您也可以这样做。您只需要定义自己的输入层。您必须实现的接口已在此处完整记录:http://dlib.net/dlib/dnn/input_abstract.h.html#EXAMPLE_INPUT_LAYER。您还可以查看现有的输入层以获取示例。但请务必阅读文档,因为它会回答您可能遇到的问题。

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));
}