#include #include #include #include "CommonUtils.h" std::vector substractMeanNormalize(cv::Mat &src, const float *meanVals, const float *normVals) { auto inputTensorSize = src.cols * src.rows * src.channels(); std::vector inputTensorValues(inputTensorSize); size_t numChannels = src.channels(); size_t imageSize = src.cols * src.rows; for (size_t pid = 0; pid < imageSize; pid++) { for (size_t ch = 0; ch < numChannels; ++ch) { float data = (float) (src.data[pid * numChannels + ch] * normVals[ch] - meanVals[ch] * normVals[ch]); inputTensorValues[ch * imageSize + pid] = data; } } return inputTensorValues; } std::vector getInputNames(Ort::Session *session) { Ort::AllocatorWithDefaultOptions allocator; const size_t numInputNodes = session->GetInputCount(); std::vector inputNamesPtr; inputNamesPtr.reserve(numInputNodes); std::vector input_node_dims; // iterate over all input nodes for (size_t i = 0; i < numInputNodes; i++) { auto inputName = session->GetInputNameAllocated(i, allocator); inputNamesPtr.push_back(std::move(inputName)); /*printf("inputName[%zu] = %s\n", i, inputName.get()); // print input node types auto typeInfo = session->GetInputTypeInfo(i); auto tensorInfo = typeInfo.GetTensorTypeAndShapeInfo(); ONNXTensorElementDataType type = tensorInfo.GetElementType(); printf("inputType[%zu] = %u\n", i, type); // print input shapes/dims input_node_dims = tensorInfo.GetShape(); printf("Input num_dims = %zu\n", input_node_dims.size()); for (size_t j = 0; j < input_node_dims.size(); j++) { printf("Input dim[%zu] = %llu\n",j, input_node_dims[j]); }*/ } return inputNamesPtr; } std::vector getInputDim(Ort::Session *session) { std::vector input_node_dims; auto typeInfo = session->GetInputTypeInfo(0); auto tensorInfo = typeInfo.GetTensorTypeAndShapeInfo(); input_node_dims = tensorInfo.GetShape(); return input_node_dims; } std::vector getOutputNames(Ort::Session *session) { Ort::AllocatorWithDefaultOptions allocator; const size_t numOutputNodes = session->GetOutputCount(); std::vector outputNamesPtr; outputNamesPtr.reserve(numOutputNodes); std::vector output_node_dims; for (size_t i = 0; i < numOutputNodes; i++) { auto outputName = session->GetOutputNameAllocated(i, allocator); outputNamesPtr.push_back(std::move(outputName)); /*printf("outputName[%zu] = %s\n", i, outputName.get()); // print input node types auto type_info = session->GetOutputTypeInfo(i); auto tensor_info = type_info.GetTensorTypeAndShapeInfo(); ONNXTensorElementDataType type = tensor_info.GetElementType(); printf("outputType[%zu] = %u\n", i, type); // print input shapes/dims output_node_dims = tensor_info.GetShape(); printf("output num_dims = %zu\n", output_node_dims.size()); for (size_t j = 0; j < output_node_dims.size(); j++) { printf("output dim[%zu] = %llu\n",j, output_node_dims[j]); }*/ } return outputNamesPtr; } std::string getSrcImgFilePath(const char *path, const char *imgName) { std::string filePath; filePath.append(path).append(imgName); return filePath; }