MNN框架学习(四):tensorflow图像分类模型部署

2023-12-23 10:48

本文主要是介绍MNN框架学习(四):tensorflow图像分类模型部署,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.模型转换

先下载tensorflow的模型,下载地址为:

https://github.com/tensorflow/models/tree/master/research/slim

然后,使用编译好的MNN工具转换模型:

./MNNConvert -f TF --modelFile mobilenet_v1_1.0_224_frozen.pb --MNNModel mobilenet.mnn --bizCode MNN

2、模型部署

主要分为两个步骤:

第一步,初始化步骤,包括读取模型创建解释器,配置调度参数、配置后端参数和创建会话

int Classifier::Init(const char* root_path) {std::cout << "start Init." << std::endl;std::string model_file = std::string(root_path) + "/mobilenet.mnn";// 创建解释器classifier_interpreter_ = std::shared_ptr<MNN::Interpreter>(MNN::Interpreter::createFromFile(model_file.c_str()));if (!classifier_interpreter_ || LoadLabels(root_path) != 0) {std::cout << "load model failed." << std::endl;return 10000;}    // 配置调度MNN::ScheduleConfig schedule_config;schedule_config.type = MNN_FORWARD_CPU;schedule_config.numThread = 1;// 配置后端MNN::BackendConfig backend_config;backend_config.precision = MNN::BackendConfig::Precision_Normal;schedule_config.backendConfig = &backend_config;// 创建会话classifier_sess_ = classifier_interpreter_->createSession(schedule_config);input_tensor_ = classifier_interpreter_->getSessionInput(classifier_sess_, nullptr);classifier_interpreter_->resizeTensor(input_tensor_, {1, 3, inputSize_.height, inputSize_.width});classifier_interpreter_->resizeSession(classifier_sess_);std::cout << "End Init." << std::endl; initialized_ = true;return 0;
}

第二步:数据读入、模型推理和后处理输出

int Classifier::Classify(const cv::Mat& img_src, std::vector<ImageInfo>* images) {std::cout << "start classify." << std::endl;images->clear();if (!initialized_) {std::cout << "model uninitialized." << std::endl;return 10000;}if (img_src.empty()) {std::cout << "input empty." << std::endl;return 10001;}cv::Mat img_resized;cv::resize(img_src.clone(), img_resized, inputSize_);std::shared_ptr<MNN::CV::ImageProcess> pretreat(MNN::CV::ImageProcess::create(MNN::CV::BGR, MNN::CV::RGB, meanVals, 3, normVals, 3));pretreat->convert((uint8_t*)img_resized.data, inputSize_.width, inputSize_.height, img_resized.step[0], input_tensor_);// forwardclassifier_interpreter_->runSession(classifier_sess_);// get output// mobilenet: "classifierV1/Predictions/Reshape_1"MNN::Tensor* output_score = classifier_interpreter_->getSessionOutput(classifier_sess_, nullptr);// copy to hostMNN::Tensor score_host(output_score, output_score->getDimensionType());output_score->copyToHostTensor(&score_host);auto score_ptr = score_host.host<float>();std::vector<std::pair<float, int>> scores;for (int i = 0; i < 1000; ++i) {float score = score_ptr[i];scores.push_back(std::make_pair(score, i));}std::partial_sort(scores.begin(), scores.begin() + topk_, scores.end(), std::greater< std::pair<float, int> >());for (int i = 0; i < topk_; ++i) {ImageInfo image_info;image_info.label_ = labels_[scores[i].second];image_info.score_ = scores[i].first;images->push_back(image_info);}std::cout << "end classify." << std::endl;return 0;
}

具体代码已经上传到github:https://github.com/MirrorYuChen/mnn_example/tree/master/src/classifier

大家觉得有用就给个star,不许白嫖哦~

参考资料:

[1] https://github.com/alibaba/MNN

[2] https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB/tree/master/MNN

 

这篇关于MNN框架学习(四):tensorflow图像分类模型部署的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Ubuntu 22.04 服务器安装部署(nginx+postgresql)

《Ubuntu22.04服务器安装部署(nginx+postgresql)》Ubuntu22.04LTS是迄今为止最好的Ubuntu版本之一,很多linux的应用服务器都是选择的这个版本... 目录是什么让 Ubuntu 22.04 LTS 变得安全?更新了安全包linux 内核改进一、部署环境二、安装系统

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

JAVA集成本地部署的DeepSeek的图文教程

《JAVA集成本地部署的DeepSeek的图文教程》本文主要介绍了JAVA集成本地部署的DeepSeek的图文教程,包含配置环境变量及下载DeepSeek-R1模型并启动,具有一定的参考价值,感兴趣的... 目录一、下载部署DeepSeek1.下载ollama2.下载DeepSeek-R1模型并启动 二、J