【问题标题】:How to convert opencv mat grayscale image to pytorch tensor?如何将opencv mat灰度图像转换为pytorch张量?
【发布时间】:2021-04-05 00:58:47
【问题描述】:

我想将 cv::Mat 类转换为 torch::Tensor 类,并将它们放入 libtorch 的 CNN 模块中进行预测。我应该如何将 Mat 类转换为 Tensor 类?我的 CNN 模块是使用 mnist 训练集生成的 pt 文件。这个mnist训练集的训练图像是单通道灰度图像。如果我要测试,它应该加载一个灰度图,所以我想将单通道灰度图转换为张量。我使用的语言是c++。

【问题讨论】:

    标签: c++ opencv pytorch


    【解决方案1】:

    想法是将内存从 cv::Mat 对象复制到 torch::Tensor 对象:

        cv::Mat img =cv::imread("path/to/file.png");
        cv::cvtColor(img,img,cv::COLOR_BGR2GRAY);
        torch::Tensor tensor = torch::empty({img.cols,img.rows},torch::TensorOptions().dtype(torch::kUInt8));
        memcpy(tensor.data<void>(),img.data,img.rows*img.cols);
    

    【讨论】:

    • 非常感谢,但我遇到了另一个问题。我的预测函数可以预测 256 张张量图片,但无法预测一张张量图片。
    • 我不是torch专家,我只是展示了将数据从一个对象复制到另一个对象的方法。数据类型或维度顺序可能存在一些错误。看看一些代码会很有帮助。
    【解决方案2】:

    感谢您的帮助。最后,我找到了解决方案。之前,我对张量类了解不多。一个张量有四个元素,分别是图片的个数、高度、宽度和字节深度。

      std::string p1 = "D:";
      std::string p2;
      std::cin >> p2;
      std::string p3 = ".png";
      std::string path = p1 + p2 + p3;
      cv::Mat image = cv::imread(path,cv::IMREAD_GRAYSCALE);
      torch::Tensor img_tensor = torch::from_blob(image.data, { 1, image.rows, image.cols, 1 }, torch::kByte);
      img_tensor = img_tensor.permute({ 0, 3, 1, 2 });
      img_tensor = img_tensor.toType(torch::kFloat);
      img_tensor = img_tensor.div(255);
      auto a = net->predict(img_tensor);
      std::cout << a.argmax() << std::endl;
    

    【讨论】:

      【解决方案3】:

      我使用这种组合将 openCV 图像转换为 libtorch 的张量。 我使用 libtorch-cxx11-abi-shared-with-deps-1.10.0+cu102 和 C++ STANDARD 14。

      cv::Mat image = cv::imread("test.jpeg")// Any image to load...
      cv::Mat input; // Conversion of image in to color format or any format [1].
      cv::cvtColor(image, input,  cv::COLOR_RGBGRAY); 
      //cv::cvtColor(image, input, cv::COLOR_BGR2RGB);    //or for color  
                                     
      std::cout << "Check image dimentions" <<std::endl;  // Check conversion
      std::cout << "pixel dim x: "<<input.rows<< std::endl;
      std::cout << "pixel dim x: "<<input.cols<< std::endl;
      //Image to tensor conversion.
      torch::Tensor tensor_image = torch::from_blob(input.data, {1, input.rows, input.cols, 3}, torch::kByte);
      //Permute data structure to Tensor format.
      tensor_image = tensor_image.permute({0, 3, 1, 2});
      tensor_image = tensor_image.toType(torch::kFloat);
      tensor_image = tensor_image.div(255);
      //load to CUDA device if need...
      tensor_image = tensor_image.to(torch::kCUDA);
      std::cout<<"Img to Tensor converted!"<<std::endl;
      

      [1]https://docs.opencv.org/3.4/d8/d01/group__imgproc__color__conversions.html

      【讨论】:

        猜你喜欢
        • 2018-04-27
        • 2021-09-17
        • 2015-11-19
        • 2012-05-07
        • 2021-06-29
        • 1970-01-01
        • 2020-06-13
        • 2015-10-07
        • 2012-01-17
        相关资源
        最近更新 更多