Environment
TensorRT Version : TensorRT-7.2.3.4
GPU Type :
Nvidia Driver Version :
CUDA Version :
CUDNN Version :
Operating System + Version : Windows10
Python Version (if applicable) : 3.7
TensorFlow Version (if applicable) : 2.3.1
PyTorch Version (if applicable) :
Baremetal or Container (if container which image + tag) :
I tried to do an inference with TensorRT. But I received alwayse the same output (1 0 0 in the for-loop). Although I set different images to the network. I followed the sample of SampleOnnxMNIST. I did a transformation from .h5 to .pb to .onnx.
The code:
samplesCommon::OnnxSampleParams mParams;
mParams.dataDirs.push_back(“path/to/model/folder/”);
mParams.onnxFileName = “model.onnx”;
mParams.inputTensorNames.push_back(“input”);
mParams.outputTensorNames.push_back(“output”);
mParams.int8 = false;
mParams.fp16 = false;
auto builder = std::unique_ptr<nvinfer1::IBuilder, samplesCommon::InferDeleter>(nvinfer1::createInferBuilder(sample::gLogger.getTRTLogger()));
if (!builder)
return 0;
const auto explicitBatch = 1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
auto network = std::unique_ptr<nvinfer1::INetworkDefinition, samplesCommon::InferDeleter>(builder->createNetworkV2(explicitBatch));
if (!network)
return 0;
auto config = std::unique_ptr<nvinfer1::IBuilderConfig, samplesCommon::InferDeleter>(builder->createBuilderConfig());
if (!config)
return 0;
auto parser = std::unique_ptr<nvonnxparser::IParser, samplesCommon::InferDeleter>(nvonnxparser::createParser(*network, sample::gLogger.getTRTLogger()));
if (!parser)
return 0;
auto parsed = parser->parseFromFile(locateFile(mParams.onnxFileName, mParams.dataDirs).c_str(), static_cast<int>(sample::gLogger.getReportableSeverity()));
if (!parsed)
return 0;
config->setMaxWorkspaceSize(16_MiB);
if (mParams.fp16)
config->setFlag(BuilderFlag::kFP16);
if (mParams.int8) {
config->setFlag(BuilderFlag::kINT8);
samplesCommon::setAllTensorScales(network.get(), 127.0f, 127.0f);
}
std::shared_ptr<nvinfer1::ICudaEngine> mEngine = std::shared_ptr<nvinfer1::ICudaEngine>(builder->buildEngineWithConfig(*network, *config), samplesCommon::InferDeleter());
if (!mEngine)
return 0;
nvinfer1::Dims mInputDims = network->getInput(0)->getDimensions();
nvinfer1::Dims mOutputDims = network->getOutput(0)->getDimensions();
samplesCommon::BufferManager buffers(mEngine);
auto context = std::unique_ptr<nvinfer1::IExecutionContext, samplesCommon::InferDeleter>(mEngine->createExecutionContext());
if (!context)
return 0;
string fileName = "image01.png";
unsigned char* hostDataBuffer = static_cast<unsigned char*>(buffers.getHostBuffer(mParams.inputTensorNames[0]));
cv::Mat frame = cv::imread(fileName);
auto input_width = mInputDims.d[2];
auto input_height = mInputDims.d[1];
Size size = Size(input_height, input_width);
cv::resize(frame, frame, size, 0, 0, INTER_NEAREST);
Scalar mean = Scalar(103.939, 116.779, 123.68);
Mat inputBlob;
cv::subtract(frame, mean, inputBlob);
hostDataBuffer = inputBlob.data;
// Memcpy from host input buffers to device input buffers
buffers.copyInputToDevice();
bool status = context->executeV2(buffers.getDeviceBindings().data());
if (!status)
return 0;
// Memcpy from device output buffers to host output buffers
buffers.copyOutputToHost();
const int outputSize = mOutputDims.d[1];
float* output = static_cast<float*>(buffers.getHostBuffer(mParams.outputTensorNames[0]));
for (int i = 0; i < outputSize; i++) {
cout << output[i] << std::endl;
}