From 1606137df26ad2aa5a7bf76d0499d143332823df Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Mon, 11 Feb 2019 20:08:17 +0300 Subject: [PATCH] Read raw floats data from Caffe models --- modules/dnn/src/caffe/caffe_importer.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/modules/dnn/src/caffe/caffe_importer.cpp b/modules/dnn/src/caffe/caffe_importer.cpp index 3c3119bb79..34e1f62546 100644 --- a/modules/dnn/src/caffe/caffe_importer.cpp +++ b/modules/dnn/src/caffe/caffe_importer.cpp @@ -260,14 +260,23 @@ public: } else { - // Half precision floats. - CV_Assert(pbBlob.raw_data_type() == caffe::FLOAT16); - std::string raw_data = pbBlob.raw_data(); + CV_Assert(pbBlob.has_raw_data()); + const std::string& raw_data = pbBlob.raw_data(); + if (pbBlob.raw_data_type() == caffe::FLOAT16) + { + // Half precision floats. + CV_Assert(raw_data.size() / 2 == (int)dstBlob.total()); - CV_Assert(raw_data.size() / 2 == (int)dstBlob.total()); - - Mat halfs((int)shape.size(), &shape[0], CV_16SC1, (void*)raw_data.c_str()); - convertFp16(halfs, dstBlob); + Mat halfs((int)shape.size(), &shape[0], CV_16SC1, (void*)raw_data.c_str()); + convertFp16(halfs, dstBlob); + } + else if (pbBlob.raw_data_type() == caffe::FLOAT) + { + CV_Assert(raw_data.size() / 4 == (int)dstBlob.total()); + Mat((int)shape.size(), &shape[0], CV_32FC1, (void*)raw_data.c_str()).copyTo(dstBlob); + } + else + CV_Error(Error::StsNotImplemented, "Unexpected blob data type"); } }