【TensorRT】win10安装tensorRT8.0.3.4+cudnn8.2.1+cuda10.2+利用opencv自己导入图像进行推理

cuda和cudnn的安装可以参考我的另一篇博文:

【软件安装】win10装anaconda3-4.2.0、python3.5、opencv3.0和tensorflow1.2(gpu)_LeonJin的博客-CSDN博客

cuda10.2需要把所有的补丁装好,参考:Error Code 2: Internal Error (Assertion cublasStatus == CUBLAS_STATUS_SUCCES_Thanks for all things-CSDN博客

等cuda、cudnn都下载好,并把环境配置好了之后,才可以执行下面的步骤,

因为tensorRT就是cuda的基础上封装了一层,可以用来做模型加载和推理。

 tensorRT的中文介绍文档:

使用 TensorRT 加速深度学习推理 - NVIDIA 开发者博客

tensorRT的英文介绍文档:https://developer.nvidia.com/blog/speeding-up-deep-learning-inference-using-tensorrt/

tensorRT下载:

https://developer.nvidia.com/nvidia-tensorrt-8x-download

下载之后的文件目录结构如下:

 

其中,data文件夹里面有一些预先准备好的数据和模型,比如mnist

这里面有一些onnx模型或者caffe模型等。

提示:

如果你下载的tensorrt是其他版本的,比如TensorRT-7.2.3.4,那么data/mnist里面就没有下载好的pgm文件,你需要运行download_pgms.py(从网络上下载这些pmg文件)

 samples文件夹里面有一些官方准备好的测试实例(*.sln),可以直接用VS打开

提示:

用VS打开某个sln之后,可能需要设置好Windows SDK 版本,才能够顺利编译

VS更新后报错 error MSB8036: 找不到 Windows SDK 版本10_明年十八岁-CSDN博客_msb8036怎么解决

比如,打开sample_onnx_mnist.sln

 提示:

我们其实不需要对项目的属性进行任何设置

只要能把cuda和cudnn安装好,然后把cudnn的include、lib、bin文件夹里面的文件拷贝到cuda安装路径下的同名文件夹中即可。

 

 编译好了之后可以在bin文件夹中找到 sample_onnx_mnist.exe

现在我们可以开始来使用这个测试实例:

“win+r”输入cmd,

输入下面的命令行: 

cd /d C:\Project\TensorRT-8.0.3.4\bin

sample_onnx_mnist.exe --datadir C:\Project\TensorRT-8.0.3.4\data\mnist

 正常的话你能看到这部分内容:

这里输入是数字1的图像,是随机从data/mnist文件夹中读取出来的,然后调用了mnist.onnx进行模型推理,得到以下结果。

到这里就TensorRT的mnist测试实例就是跑完了。

后续再继续把TensorRT的代码结构了解清楚,我们可以用它来做点其他更高级的事情,

比如,跑一个大型的分割模型(比如,mask-rcnn),

比如,进行多线程推理(C/C++ TensorRT引擎多线程推理多个rtsp流并显示或保存_highoooo的博客-CSDN博客_多线程推理

在SampleOnnxMNIST这个实例中,我简单的利用opencv自己导入图像进行推理,

#include<opencv2/opencv.hpp>

bool SampleOnnxMNIST::processInput(const samplesCommon::BufferManager& buffers)
{
#if 0
	const int inputH = mInputDims.d[2];
	const int inputW = mInputDims.d[3];
	std::cout << "[jhq] inputH: " << inputH << std::endl;
	std::cout << "[jhq] inputW: " << inputW << std::endl;
	// Read a random digit file
	srand(unsigned(time(nullptr)));
	std::vector<uint8_t> fileData(inputH * inputW);
	mNumber = rand() % 10;
	readPGMFile(locateFile(std::to_string(mNumber) + ".pgm", mParams.dataDirs), fileData.data(), inputH, inputW);

	// Print an ascii representation
	sample::gLogInfo << "Input:" << std::endl;
    for (int i = 0; i < inputH * inputW; i++)
    {
        sample::gLogInfo << (" .:-=+*#%@"[fileData[i] / 26]) << (((i + 1) % inputW) ? "" : "\n");
    }
    sample::gLogInfo << std::endl;

    float* hostDataBuffer = static_cast<float*>(buffers.getHostBuffer(mParams.inputTensorNames[0]));
    for (int i = 0; i < inputH * inputW; i++)
    {
        hostDataBuffer[i] = 1.0 - float(fileData[i] / 255.0);
    }

    return true;
#else
	
    const int inputH = mInputDims.d[2];
    const int inputW = mInputDims.d[3];
	std::cout << "[jhq] inputH: " << inputH << std::endl;
	std::cout << "[jhq] inputW: " << inputW << std::endl;

    std::string mFilename = "test.png";
    std::cout << "[jhq] mFilename: " << mFilename << std::endl;

	cv::Mat srcIm = cv::imread(mFilename, 0);
	cv::resize(srcIm, srcIm, cv::Size(inputW, inputH));
	//cv::imshow("srcIm",srcIm);
	//cv::waitKey(0);

	// Print an ascii representation
	sample::gLogInfo << "Input:" << std::endl;
	for (int i = 0; i < inputH * inputW; i++)
	{
		sample::gLogInfo << (" .:-=+*#%@"[srcIm.data[i] / 26]) << (((i + 1) % inputW) ? "" : "\n");
	}
	sample::gLogInfo << std::endl;


	float* hostDataBuffer = static_cast<float*>(buffers.getHostBuffer(mParams.inputTensorNames[0]));
	for (int i = 0; i < inputH * inputW; i++)
	{
		hostDataBuffer[i] = 1 - float(srcIm.data[i]) / 255.0;
	}

	return true;
#endif
}

 提示:

在SampleOnnxMNIST.cpp文件中找到SampleOnnxMNIST::processInput这个函数并替换,

这里我主要是读取了”test.png“图像(如下),进行resize和归一化,然后放到hostdatabuffer里面。

test.png

推理结果:

 

可以看到模型给出了预测结果,感觉泛化能力还是可以的~

后续再继续把TensorRT的代码结构了解清楚,我们可以用它来做点其他更高级的事情,

比如,跑一个大型的分割模型(比如,mask-rcnn),

比如,进行多线程推理(C/C++ TensorRT引擎多线程推理多个rtsp流并显示或保存_highoooo的博客-CSDN博客_多线程推理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值