ncnn加载模型获取模型输出结果打印输出Mat以及Mat的可视化

2023-12-22 16:08

本文主要是介绍ncnn加载模型获取模型输出结果打印输出Mat以及Mat的可视化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

加载模型获取模型的预测结果

我们先利用opencv来读取图片,然后再利用ncnnfrom_pixels_resize函数将opencv格式的图片转为ncnn格式的图片,用于网络的前向推理,from_pixels_resize函数还会对图片进行缩放,如果只需要转换图片可以使用from_pixels函数

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "net.h"int main()
{    //使用opencv以灰度图读取图片cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE);//获取图片的宽int w = img.cols;//获取图片的高int h = img.rows;//将OpenCV的图片转为ncnn格式的图片,并且将图片缩放到60×60之间ncnn::Mat in = ncnn::Mat::from_pixels_resize(img.data, ncnn::Mat::PIXEL_GRAY, w, h, 60, 60);float mean[1] = { 128.f };float norm[1] = { 1/128.f };//对图片进行归一化,将像素归一化到-1~1之间in.substract_mean_normalize(mean, norm);//定义模型的网络ncnn::Net net;//加载模型net.load_param("model.param");net.load_model("model.bin");ncnn::Extractor ex = net.create_extractor();ex.set_light_mode(true);//设置线程个数ex.set_num_threads(4);//将图片放入到网络中,进行前向推理ex.input("data", in);ncnn::Mat feat;//获取网络的输出结果ex.extract("output", feat);return 0;
}

输出Mat的内容

ncnn没有提供可以直接输出Mat数据的函数,所以想要输出Mat数据时,只能利用for循环进行遍历

void pretty_print(const ncnn::Mat& m)
{for (int q=0; q<m.c; q++){const float* ptr = m.channel(q);for (int y=0; y<m.h; y++){for (int x=0; x<m.w; x++){printf("%f ", ptr[x]);}ptr += m.w;printf("\n");}printf("------------------------\n");}
}

可视化Mat

void visualize(const char* title, const ncnn::Mat& m)
{std::vector<cv::Mat> normed_feats(m.c);for (int i=0; i<m.c; i++){cv::Mat tmp(m.h, m.w, CV_32FC1, (void*)(const float*)m.channel(i));cv::normalize(tmp, normed_feats[i], 0, 255, cv::NORM_MINMAX, CV_8U);cv::cvtColor(normed_feats[i], normed_feats[i], cv::COLOR_GRAY2BGR);// check NaNfor (int y=0; y<m.h; y++){const float* tp = tmp.ptr<float>(y);uchar* sp = normed_feats[i].ptr<uchar>(y);for (int x=0; x<m.w; x++){float v = tp[x];if (v != v){sp[0] = 0;sp[1] = 0;sp[2] = 255;}sp += 3;}}}int tw = m.w < 10 ? 32 : m.w < 20 ? 16 : m.w < 40 ? 8 : m.w < 80 ? 4 : m.w < 160 ? 2 : 1;int th = (m.c - 1) / tw + 1;cv::Mat show_map(m.h * th, m.w * tw, CV_8UC3);show_map = cv::Scalar(127);// tilefor (int i=0; i<m.c; i++){int ty = i / tw;int tx = i % tw;normed_feats[i].copyTo(show_map(cv::Rect(tx * m.w, ty * m.h, m.w, m.h)));}cv::resize(show_map, show_map, cv::Size(0,0), 2, 2, cv::INTER_NEAREST);cv::imshow(title, show_map);
}

参考链接:https://github.com/Tencent/ncnn/wiki

这篇关于ncnn加载模型获取模型输出结果打印输出Mat以及Mat的可视化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/524588

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

Spring Boot中获取IOC容器的多种方式

《SpringBoot中获取IOC容器的多种方式》本文主要介绍了SpringBoot中获取IOC容器的多种方式,包括直接注入、实现ApplicationContextAware接口、通过Spring... 目录1. 直接注入ApplicationContext2. 实现ApplicationContextA

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例