首先从一个例子看起,在example文件夹下有检测和分类的例子,但是又封装了几层接口,这里我把主要的流程代码提出来了,这是可以单独load模型跑起来的代码,如下:
//创建模型
TNN_NS::TNN tnn;
//创建模型配置
TNN_NS::ModelConfig model_config;
//load模型文件
auto proto_tnn = fdLoadFile(model_param);
auto model_tnn = fdLoadFile(model);
//模型配置
model_config.model_type = TNN_NS::MODEL_TYPE_TNN;
model_config.params = {proto_tnn, model_tnn};
//配置初始化
tnn.Init(model_config);
//创建网络配置
TNN_NS::NetworkConfig config;
config.device_type = TNN_NS::DEVICE_ARM;
TNN_NS::Status error;
//设置输入归一化参数
TNN_NS::MatConvertParam input_cvt_param;
input_cvt_param.scale = {1.0 / (255 * 0.229), 1.0 / (255 * 0.224), 1.0 / (255 * 0.225), 0.0};
input_cvt_param.bias = {-0.485 / 0.229, -0.456 / 0.224, -0.406 / 0.225, 0.0};
//创建实例instance
auto net_instance = tnn.CreateInst(config, error);
//设置实例的输入
auto status = net_instance->SetInputMat(input_mat, input_cvt_param);
RETURN_ON_NEQ(status, TNN_NS::TNN_OK);
//实例前向推理
status = net_instance->ForwardAsync(nullptr);
RETURN_ON_NEQ(status, TNN_NS::TNN_OK);
//声明Mat存放输出
std::shared_ptr<TNN_NS::Mat> output_mat = nullptr;
//取到输出
status = net_instance->GetOutputMat(output_mat);
RETURN_ON_NEQ(status, TNN_NS::TNN_OK);
带注册器的模板工厂模式
在看源码之前先大致了解一下C++最常用的设计模式——工厂模式,而且是带注册器的模板工厂模式https://www.cnblogs.com/xiaolincoding/p/11524401.html
。