一、配置简介
windows10 + GTX 1050Ti 4GB显存
cuda 11.5
onnxruntime-gpu 1.11.1
visual studio 2019
.onnx模型,input为float32的{1,3,400,424};output为int64的{1,1,400,424}
二、流程梳理
1.python下生成pytorch的模型.pth,并基于.pth模型进行推理
2.python下依据模型推理实现从.pth转向.onnx
3.python下基于.onnx进行推理,与1中的结果进行比较
4.基于已知的输入输出,在C++下部署.onnx模型,进行推理,与3中的结果进行比较
三、代码(仅列出C++下的部署程序示例)
class ModelInfo {
public:
ModelInfo() {};
~ModelInfo() {};
public:
size_t num_input_nodes; //输入节点的数量
std::vector<const char*> input_node_names; //输入节点的名称
std::vector<std::vector<int64_t>> input_node_dims; //输入节点的维度
std::vector<ONNXTensorElementDataType> input_types; //输入节点的类型
std::vector<OrtValue*> input_tensors; //输入节点的tensor
size_t num_output_nodes; //输出节点的数量
std::vector<const char*> output_node_names; //输出节点的名称
std::vector<std::vector<int64_t>> output_node_dims; //输出节点的维度
std::vector<ONNXTensorElementDataType> output_types; //输出节点的类型
std::vector<OrtValue*> output_tensors; //输出节点的tensor
public:
inline void InitialInput() {
this->input_node_names.resize(this->num_input_nodes);
this->input_node_dims.resize(this->num_input_nodes);
this->input_types.resize(this->num_input_nodes);
this->input_tensors.resize(this->num_input_nodes);
}
inline void InitialOutput() {
this->output_node_names.resize(this->num_output_nodes);
this->output_node_dims.resize(this->num_output_nodes);
this->output_types.resize(this->num_output_nodes);
this->output_tensors.resize(this->num_output_nodes);
}
};
bool CheckStatus(const OrtApi* g_ort, OrtStatus* status) {
if (status != nullptr) {
const c