关于vs配置yolov8s转tensorrt的过程和注意事项
配置的注意事项:
首先第一点,不要更新vs,否则会出现莫名其妙的bug
我用的cuda版本是11.8,cudnn版本是8.9.6,tenorrt版本是8.6 GA,opencv是4.9.0
"yolov8_onnx_tensorrt_哔哩哔哩_bilibili" 这是b站一位up🐖录的视频,我是按照他的文件配置的
一般来说,vs里面配置的是头文件和lib文件,path配置的是bin中的dll文件,而Windows查找库先在可执行文件同目录,其次是环境变量%PATH%
分析过程:
首先是用python将yolov8s.pt转换为yolov8s.onnx
from ultralytics import YOLO
model = YOLO("weights/yolov8s.pt")
success = model.export(format="onnx")
然后通过parser解析器将ONNX模型文件解析并转换为一个 nvinfer1::INetworkDefinition 对象(抽象的网络定义对象,包含了模型的结构和参数信息。用于在TensorRT中定义和构建网络模型,包括添加层、设置输入输出、配置参数等。)
nvinfer1::IBuilder* builder = nvinfer1::createInferBuilder(transLogger);
//创建一个构建器对象builder,用于构建网络。将日志信息记录到这个日志记录器中.
nvinfer1::INetworkDefinition* network = builder->createNetworkV2(flag);
//创建一个网络定义对象。这个方法接受一个标志值作为参数,用于指定网络定义的创建方式。在这里,flag指定了网络定义应该明确指定批处理大小。
nvonnxparser::IParser* parser = nvonnxparser::createParser(*network, transLogger);
//创建了一个ONNX解析器对象,解析后的ONNX模型会被转换为一个 nvinfer1::INetworkDefinition 对象
parser->parseFromFile(ONNX_file, static_cast<int32_t>(nvinfer1::ILogger::Severity::kWARNING));
//从指定的ONNX文件中解析模型,kWARNING表示只记录警告级别及以上的日志信息。
接着将 nvinfer1::INetworkDefinition 对象换成 nvinfer1::IHostMemory 对象(包含二进制数据的内存对象,通常用于存储序列化后的网络模型,可以被保存到文件中,或者在不同的环境中加载和使用,以便于模型的存储、传输和部署。)
nvinfer1::IHostMemory* serializeModel = builder->buildSerializedNetwork(*network, *config);
//将TensorRT网络和配置对象序列化为二进制数据,serializeModel用于存储序列化后的二进制数据。其中config可以是FP16,INT8等
最后将序列化后的二进制数据写入engine文件,即trt模型
std::ofstream engine(Engine_file, std::ios::binary); //创建一个输出文件流 engine,并打开名为 Engine_file 的文件,以二进制模式进行写操作。
engine.write(reinterpret_cast<const char*>(serializeModel->data()), serializeModel->size()); //将序列化后的二进制数据写入文件。

浙公网安备 33010602011771号