MNN学习笔记(五):caffe物体检测模型部署

2023-12-23 10:48

本文主要是介绍MNN学习笔记(五):caffe物体检测模型部署,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.模型转换

首先下载caffe模型,下载地址为:

https://github.com/C-Aniruddh/realtime_object_recognition

然后将caffe模型转换成mnn模型:

./MNNConvert -f CAFFE --modelFile MobileNetSSD_deploy.caffemodel --prototxt MobileNetSSD_deploy.prototxt --MNNModel mobilenetssd.mnn --bizCode MNN

2.模型部署

首先,进行初始化:模型载入并创建解释器,设置调度参数,设置后端参数,创建会话和图像处理参数配置

int MobilenetSSD::Init(const char * root_path) {std::cout << "start Init." << std::endl;std::string model_file = std::string(root_path) + "/mobilenetssd.mnn";mobilenetssd_interpreter_ = std::unique_ptr<MNN::Interpreter>(MNN::Interpreter::createFromFile(model_file.c_str()));if (nullptr == mobilenetssd_interpreter_) {std::cout << "load model failed." << std::endl;return 10000;}MNN::ScheduleConfig schedule_config;schedule_config.type = MNN_FORWARD_CPU;schedule_config.numThread = 4;MNN::BackendConfig backend_config;backend_config.precision = MNN::BackendConfig::Precision_High;backend_config.power = MNN::BackendConfig::Power_High;schedule_config.backendConfig = &backend_config;mobilenetssd_sess_ = mobilenetssd_interpreter_->createSession(schedule_config);// image processerMNN::CV::Matrix trans;trans.setScale(1.0f, 1.0f);MNN::CV::ImageProcess::Config img_config;img_config.filterType = MNN::CV::BICUBIC;::memcpy(img_config.mean, meanVals_, sizeof(meanVals_));::memcpy(img_config.normal, normVals_, sizeof(normVals_));img_config.sourceFormat = MNN::CV::RGBA;img_config.destFormat = MNN::CV::RGB;pretreat_data_ = std::shared_ptr<MNN::CV::ImageProcess>(MNN::CV::ImageProcess::create(img_config));pretreat_data_->setMatrix(trans);std::string input_name = "data";input_tensor_ = mobilenetssd_interpreter_->getSessionInput(mobilenetssd_sess_, input_name.c_str());mobilenetssd_interpreter_->resizeTensor(input_tensor_, dims_);mobilenetssd_interpreter_->resizeSession(mobilenetssd_sess_);initialized_ = true;std::cout << "end Init." << std::endl;return 0;
}

然后,进行数据读入、模型推理和输出结果后处理

这里数据读入参考了资料[3],这里详细介绍了如何使用opencv读入数据,当然不止这一种,还有很多种读取方式

int MobilenetSSD::Detect(const cv::Mat & img_src, std::vector<ObjectInfo>* objects) {std::cout << "start detect." << std::endl;if (!initialized_) {std::cout << "model uninitialized." << std::endl;return 10000;}if (img_src.empty()) {std::cout << "input empty." << std::endl;return 10001;}int width = img_src.cols;int height = img_src.rows;// preprocesscv::Mat img_resized;cv::resize(img_src, img_resized, inputSize_);uint8_t* data_ptr = GetImage(img_resized);pretreat_data_->convert(data_ptr, inputSize_.width, inputSize_.height, 0, input_tensor_);mobilenetssd_interpreter_->runSession(mobilenetssd_sess_);std::string output_name = "detection_out";MNN::Tensor* output_tensor = mobilenetssd_interpreter_->getSessionOutput(mobilenetssd_sess_, output_name.c_str());// copy to hostMNN::Tensor output_host(output_tensor, output_tensor->getDimensionType());output_tensor->copyToHostTensor(&output_host);auto output_ptr = output_host.host<float>();for (int i = 0; i < output_host.height(); ++i) {int index = i * output_host.width();ObjectInfo object;object.name_ = class_names[int(output_ptr[index + 0])];object.score_ = output_ptr[index + 1];object.location_.x = output_ptr[index + 2] * width;object.location_.y = output_ptr[index + 3] * height;object.location_.width = output_ptr[index + 4] * width - object.location_.x;object.location_.height = output_ptr[index + 5] * height - object.location_.y;objects->push_back(object);}std::cout << "end detect." << std::endl;return 0;
}

具体代码已经上传到github:

https://github.com/MirrorYuChen/mnn_example/tree/master/src/object/mobilenetssd

觉得有用的点个star,不许白嫖哈~

参考资料:

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

[2] https://github.com/lqian/light-LPR

[3] https://blog.csdn.net/abcd740181246/article/details/90143848

这篇关于MNN学习笔记(五):caffe物体检测模型部署的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

如何在Ubuntu 24.04上部署Zabbix 7.0对服务器进行监控

《如何在Ubuntu24.04上部署Zabbix7.0对服务器进行监控》在Ubuntu24.04上部署Zabbix7.0监控阿里云ECS服务器,需配置MariaDB数据库、开放10050/1005... 目录软硬件信息部署步骤步骤 1:安装并配置mariadb步骤 2:安装Zabbix 7.0 Server

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可