ncnn模型推理全过程

ncnn推理最基础教程

  • ncnn介绍
  • 模型推理(三板斧)
    • 1.初始化网络以及预处理
    • 2.送入数据前向传播
    • 3.推理结束获取输出数据

ncnn介绍

ncnn是腾讯优图实验室nihui大佬的主要作品,支持x86、arm、mips等架构。以及windows、linux、android、ios这些主流系统,相比于其他推理引擎具来说ncnn的代码可读性更好,使用更为简单,社区活跃度高,网上的教程更为丰富,最终要的是QQ群内活跃,有问题可以@nihui姐姐出来帮你解答问题。
项目地址:https://github.com/Tencent/ncnn

模型推理(三板斧)

1.初始化网络以及预处理

读取模型初始化ncnn的Net类,后续都要用它
读取图片对图片做预处理,和训练时的预处理保持一致
上代码:

	//初始化网络
	ncnn::Net net;
	net.load_param("model-sim.param");
	net.load_model("model-sim.bin");
	//读取图片以及预处理
	cv::Mat img = cv::imread("xxx.jpg");//读图片
	cv::resize(img,img,cv::Size(input_w,input_h));//resize到目标尺寸
	ncnn::Mat in = ncnn::Mat::from_pixels(img.data, ncnn::Mat::PIXEL_RGB, img.cols, img.rows);//转换opencv的Mat到ncnn的Mat
	const float mean_vals[3] = { 127.5f, 127.5f, 127.5f };
	const float norm_vals[3] = { 1.0/127.5f, 1.0/127.5f, 1.0/127.5f };
	in.substract_mean_normalize(mean_vals, norm_vals);//归一化,减均值乘方差的倒数

2.送入数据前向传播

上边的ncnn::Mat in 这个in就是我们要送进去的ncnn格式的数据

	ncnn::Mat out;
	ncnn::Extractor ex = net.create_extractor();
    ex.input("input", in);
	ex.extract("output", out);

3.推理结束获取输出数据

emmmm… 奈何ncnn的前向传播和获取输出结果都在一起,上边ex.extract(“output”, out)结束之后,out就是我们获取到的输出数据了,接下来只需要对它做相应的后处理就可以得到推理结果啦!
假设是一个2分类的模型


float *floatArray=(float *)out.data;//把ncnn的数据放到一个float指针用来后续的操作
float cls1 = floatArray[0];
float cls2 = floatArray[1];
if(cls1 > cls2 )
{
	std::cout<<"就是第1类"<<std::endl;
}
else
{
	std::cout<<"就是第2类"<<std::endl;
}

至此ncnn的最基础版推理流程就结束了,祝各位长生不老永远写不出bug!

你可能感兴趣的:(opencv,人工智能,计算机视觉)