From a7b3d2581fe22f2afb9a87782eb1ca1215b5b606 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Mon, 17 Sep 2018 12:31:09 +0300 Subject: [PATCH 1/2] Replace CV_USRTYPE1 for int64 to CV_32SC2 in Torch importer --- modules/dnn/src/torch/torch_importer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/dnn/src/torch/torch_importer.cpp b/modules/dnn/src/torch/torch_importer.cpp index 2338c73d96..47aa1cc822 100644 --- a/modules/dnn/src/torch/torch_importer.cpp +++ b/modules/dnn/src/torch/torch_importer.cpp @@ -214,8 +214,8 @@ struct TorchImporter return CV_16S; else if (typeStr == "Int") return CV_32S; - else if (typeStr == "Long") //Carefully! CV_64S type coded as CV_USRTYPE1 - return CV_USRTYPE1; + else if (typeStr == "Long") //Carefully! CV_64S type coded as CV_32SC2 + return CV_32SC2; else CV_Error(Error::StsNotImplemented, "Unknown type \"" + typeStr + "\" of torch class \"" + str + "\""); } @@ -236,7 +236,7 @@ struct TorchImporter void readTorchStorage(int index, int type = -1) { long size = readLong(); - Mat storageMat(1, size, (type != CV_USRTYPE1) ? type : CV_64F); //handle LongStorage as CV_64F Mat + Mat storageMat(1, size, (type != CV_32SC2) ? type : CV_64F); //handle LongStorage as CV_64F Mat switch (type) { @@ -257,7 +257,7 @@ struct TorchImporter case CV_32S: THFile_readIntRaw(file, (int*)storageMat.data, size); break; - case CV_USRTYPE1: + case CV_32SC2: { double *buf = storageMat.ptr(); THFile_readLongRaw(file, (int64*)buf, size); From 7d7552637351f8da6d73d68798b04d57709511dd Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Mon, 17 Sep 2018 17:28:26 +0300 Subject: [PATCH 2/2] Use TorchType enum --- modules/dnn/src/torch/torch_importer.cpp | 56 ++++++++++++++++-------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/modules/dnn/src/torch/torch_importer.cpp b/modules/dnn/src/torch/torch_importer.cpp index 47aa1cc822..cbcc83bf6c 100644 --- a/modules/dnn/src/torch/torch_importer.cpp +++ b/modules/dnn/src/torch/torch_importer.cpp @@ -74,6 +74,18 @@ enum LuaType LEGACY_TYPE_RECUR_FUNCTION = 7 }; +// We use OpenCV's types to manage CV_ELEM_SIZE. +enum TorchType +{ + TYPE_DOUBLE = CV_64F, + TYPE_FLOAT = CV_32F, + TYPE_BYTE = CV_8U, + TYPE_CHAR = CV_8S, + TYPE_SHORT = CV_16S, + TYPE_INT = CV_32S, + TYPE_LONG = CV_32SC2 +}; + template static String toString(const T &v) { @@ -203,19 +215,19 @@ struct TorchImporter String typeStr = str.substr(strlen(prefix), str.length() - strlen(prefix) - strlen(suffix)); if (typeStr == "Double") - return CV_64F; + return TYPE_DOUBLE; else if (typeStr == "Float" || typeStr == "Cuda") - return CV_32F; + return TYPE_FLOAT; else if (typeStr == "Byte") - return CV_8U; + return TYPE_BYTE; else if (typeStr == "Char") - return CV_8S; + return TYPE_CHAR; else if (typeStr == "Short") - return CV_16S; + return TYPE_SHORT; else if (typeStr == "Int") - return CV_32S; - else if (typeStr == "Long") //Carefully! CV_64S type coded as CV_32SC2 - return CV_32SC2; + return TYPE_INT; + else if (typeStr == "Long") + return TYPE_LONG; else CV_Error(Error::StsNotImplemented, "Unknown type \"" + typeStr + "\" of torch class \"" + str + "\""); } @@ -236,36 +248,44 @@ struct TorchImporter void readTorchStorage(int index, int type = -1) { long size = readLong(); - Mat storageMat(1, size, (type != CV_32SC2) ? type : CV_64F); //handle LongStorage as CV_64F Mat + Mat storageMat; switch (type) { - case CV_32F: + case TYPE_FLOAT: + storageMat.create(1, size, CV_32F); THFile_readFloatRaw(file, (float*)storageMat.data, size); break; - case CV_64F: + case TYPE_DOUBLE: + storageMat.create(1, size, CV_64F); THFile_readDoubleRaw(file, (double*)storageMat.data, size); break; - case CV_8S: - case CV_8U: + case TYPE_CHAR: + storageMat.create(1, size, CV_8S); THFile_readByteRaw(file, (uchar*)storageMat.data, size); break; - case CV_16S: - case CV_16U: + case TYPE_BYTE: + storageMat.create(1, size, CV_8U); + THFile_readByteRaw(file, (uchar*)storageMat.data, size); + break; + case TYPE_SHORT: + storageMat.create(1, size, CV_16S); THFile_readShortRaw(file, (short*)storageMat.data, size); break; - case CV_32S: + case TYPE_INT: + storageMat.create(1, size, CV_32S); THFile_readIntRaw(file, (int*)storageMat.data, size); break; - case CV_32SC2: + case TYPE_LONG: { + storageMat.create(1, size, CV_64F); //handle LongStorage as CV_64F Mat double *buf = storageMat.ptr(); THFile_readLongRaw(file, (int64*)buf, size); for (size_t i = (size_t)size; i-- > 0; ) buf[i] = ((int64*)buf)[i]; - } break; + } default: CV_Error(Error::StsInternal, ""); break;