编写ncnn的C++步骤,基本分为五步:
1.定义模型:
ncnn:: Net net;
2.load模型:
#由其他框架例如pytorch,tensorflow转化为ncnn的模型,包括两个文件.param和.bin
net.load_param("model.param");
net.load_model("model.bin");
3.定义输入数据:
cv::Mat bgr=cv::imread("path to image");
const int target_size = 300;//图像resize的大小
ncnn::Mat in=ncnn::Mat::from_pixels_resize(bgr.data,ncnn::Mat::PIXEL_BGR2RGB,bgr.cols,bgr.rows,target_size,target_size);
//归一化
const float mean_vals[3] = {123.675f, 116.28f, 103.53f};
const float norm_vals[3] = {1.0f, 1.0f, 1.0f};
in.substract_mean_normalize(mean_vals,norm_vals);
4.定义输出:
ncnn::Extractor ex=net.creator_extractor();
ex.set_num_threads(num_thread);//设置多线程
ex.input("input",in);
ncnn::Mat out;
ex.output("output",out);
5.后处理:
std::vector<float> cls_scores;
// manually call softmax on the fc output
// convert result into probability
// skip if your model already has softmax operation
{
ncnn::Layer* softmax = ncnn::create_layer("Softmax");
ncnn::ParamDict pd;
softmax->load_param(pd);
softmax->forward_inplace(out, shufflenetv2.opt);
delete softmax;
}
out = out.reshape(out.w * out.h * out.c);
cls_scores.resize(out.w);
for (int j = 0; j < out.w; j++)
{
cls_scores[j] = out[j];
}