【问题标题】:How to read "mean_file_proto" into OpenCV Mat in order to subtract image from mean to use in Caffe Model?如何将“mean_file_proto”读入 OpenCV Mat 以从平均值中减去图像以在 Caffe 模型中使用?
【发布时间】:2017-07-03 12:38:26
【问题描述】:

我使用的是 OpenCV 3.2。

我下载了一个包含平均文件 mean.binaryproto 的 Caffe 模型。我想从我的输入图像中减去平均值。 如何将mean_file_proto 读入 OpenCV Mat 以从均值中减去图像以在 Caffe 模型中使用?

编辑

我可以只使用 OpenCV 而不使用 Caffe 吗?我在 Windows 10 64 位的 Visual Studio 2015 中使用 OpenCV 3.2。我从网络摄像头得到一张图像,然后我想减去平均值,然后使用OpenCV::dnn 得到结果。

【问题讨论】:

    标签: c++ computer-vision deep-learning caffe opencv3.0


    【解决方案1】:

    平均文件是平面的,可能是 1 或 3 个通道。比例为 [0, 255]。

    caffe::BlobProto mean_proto;
    caffe::ReadProtoFromBinaryFile( filename, &mean_proto ); // check return code
    caffe::Blob< float > mean_blob;
    mean_blob.FromProto( mean_proto );
    float *data = mean_blob.mutable_cpu_data();
    

    您现在可以为每个频道创建CV_32FC1 类型的cv::Mat

    cv::Mat channel( mean_blob.height(), mean_blob.width(), CV_32FC1, data );
    data += mean_blob.height() * mean_blob.width();
    

    最后,用这些通道填充一个向量,并使用cv::merge() 将它们组合成一个cv::Mat,您可以从包含输入图像的另一个cv::Mat 中减去它。如果您的图像已经标准化 [0, 1),您还需要重新调整均值。

    【讨论】:

    • 谢谢。我可以只使用 OpenCV 而不使用 Caffe 吗?我在 Windows 10 64 位的 Visual Studio 2015 中使用 OpenCV 3.2。我从网络摄像头获取图像,我想减去平均值,然后使用 OpenCV::dnn 得到结果。提前致谢
    • 嗯,ReadProtoFromBinaryFile() 基本上是 Google 的 Protobuf 库的包装器。见github.com/BVLC/caffe/blob/master/src/caffe/util/io.cpp。我对这个库没有直接经验,但它似乎涉及一个解析器生成器,它提供了数据格式的描述。如果您不想与 Caffe 链接,那么您似乎必须在 github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto 上运行 protobuf 的 protoc 工具,才能生成 caffe::ReadProtoFromBinaryFile() 中使用的一些函数。见github.com/BVLC/caffe/issues/22
    • @video-analysis-deep-learning 您还可以利用 Caffe 的 Python 语言绑定,并使用它编写一个转换工具来从这些文件中提取平均图像。
    猜你喜欢
    • 2015-06-26
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2017-05-04
    • 2011-04-09
    • 2016-01-08
    相关资源
    最近更新 更多