当前位置: 首页 > article >正文

YOLOv11n模型用Ultralytics官方工具转ncnn后,C++推理代码怎么改?附完整修改版

YOLOv11n模型Ultralytics转ncnn后的C推理代码改造指南当你在移动端部署YOLOv11n模型时如果采用Ultralytics官方工具导出ncnn格式会遇到与ncnn官方示例代码不兼容的情况。这种差异主要源于模型输出结构的改变需要针对性调整C推理代码的逻辑。本文将详细解析转换后的模型特性并提供可直接集成到项目中的完整解决方案。1. 问题根源与现象分析使用yolo export modelyolo11n.pt formatncnn命令导出的模型其输出张量结构与ncnn官方转换工具生成的结果存在本质差异。主要表现在以下三个方面输出维度排列不同Ultralytics转换后的out0是[batch, 144, 8400]格式而ncnn官方示例代码预期的是[batch, 8400, 144]结构后处理需求变化转换工具已自动完成sigmoid和softmax运算无需在推理代码中重复处理数据解析逻辑重构原始示例中的网格遍历策略需要完全重写典型报错现象包括直接运行时数组越界崩溃检测框坐标解析异常置信度分数计算错误2. 核心代码改造方案2.1 输出数据结构适配原始ncnn示例中的generate_proposals函数需要彻底重构。关键修改点在于处理转置后的输出张量static void generate_proposals(const ncnn::Mat pred, float prob_threshold, std::vectorObject objects) { const int num_boxes pred.h; // 8400 const int num_features pred.w; // 144 for (int i 0; i num_boxes; i) { const float* ptr pred.row(i); // 解析边界框坐标 (已去除softmax处理) float dx0 ptr[0]; float dy0 ptr[1]; float dx1 ptr[2]; float dy1 ptr[3]; // 跳过4个坐标值找到类别概率起始位置 const float* scores ptr 4; // 找出最大概率类别 int label -1; float score -FLT_MAX; for (int c 0; c num_classes; c) { if (scores[c] score) { label c; score scores[c]; } } // 过滤低置信度检测结果 if (score prob_threshold) { Object obj; obj.rect.x dx0; obj.rect.y dy0; obj.rect.width dx1 - dx0; obj.rect.height dy1 - dy0; obj.label label; obj.prob score; // 注意这里score不需要sigmoid处理 objects.push_back(obj); } } }2.2 推理流程调整主检测函数需要简化预处理和后处理逻辑static int detect_yolo11(const cv::Mat bgr, std::vectorObject objects) { ncnn::Net yolo11; yolo11.opt.use_vulkan_compute true; // 加载模型注意使用转换后的param和bin文件 yolo11.load_param(yolo11n.ncnn.param); yolo11.load_model(yolo11n.ncnn.bin); const int target_size 640; const float prob_threshold 0.25f; const float nms_threshold 0.45f; // 图像预处理保持与训练时相同的归一化方式 ncnn::Mat in ncnn::Mat::from_pixels_resize( bgr.data, ncnn::Mat::PIXEL_BGR2RGB, bgr.cols, bgr.rows, target_size, target_size); const float norm_vals[3] {1/255.f, 1/255.f, 1/255.f}; in.substract_mean_normalize(0, norm_vals); // 推理执行 ncnn::Extractor ex yolo11.create_extractor(); ex.input(in0, in); ncnn::Mat out; ex.extract(out0, out); // 生成候选框使用改造后的函数 std::vectorObject proposals; generate_proposals(out, prob_threshold, proposals); // 非极大值抑制处理 qsort_descent_inplace(proposals); std::vectorint picked; nms_sorted_bboxes(proposals, picked, nms_threshold); // 输出最终结果 objects.resize(picked.size()); for (size_t i 0; i picked.size(); i) { objects[i] proposals[picked[i]]; } return 0; }3. 关键修改点详解3.1 输出张量解析改造Ultralytics转换后的模型输出是[1,144,8400]格式与传统YOLO输出有显著区别维度说明传统YOLOUltralytics转换后0Batch111特征长度84001442预测框数858400每个预测框的144维特征包含前4维边界框坐标x0,y0,x1,y1无需softmax处理随后80维类别概率无需sigmoid处理剩余60维通常为其他任务头输出目标检测可忽略3.2 预处理简化方案由于Ultralytics转换工具已处理了动态形状问题代码中可以移除复杂的padding逻辑// 替代原来的letterbox处理 ncnn::Mat in ncnn::Mat::from_pixels_resize( bgr.data, ncnn::Mat::PIXEL_BGR2RGB, img_w, img_h, target_size, target_size); // 归一化处理保持不变 const float norm_vals[3] {1/255.f, 1/255.f, 1/255.f}; in.substract_mean_normalize(0, norm_vals);4. 完整代码集成方案以下是适配Ultralytics转换模型的完整推理代码框架#include net.h #include opencv2/opencv.hpp #include vector struct Object { cv::Rect_float rect; int label; float prob; }; // ... 保留原有的intersection_area、qsort_descent_inplace、nms_sorted_bboxes函数 ... void generate_proposals(const ncnn::Mat pred, float prob_threshold, std::vectorObject objects) { // 实现见前文2.1节 } int detect_yolo11(const cv::Mat bgr, std::vectorObject objects) { // 实现见前文2.2节 } void draw_objects(const cv::Mat bgr, const std::vectorObject objects) { // 可视化代码保持不变 } int main(int argc, char** argv) { if (argc ! 2) return -1; cv::Mat image cv::imread(argv[1]); if (image.empty()) return -1; std::vectorObject objects; detect_yolo11(image, objects); draw_objects(image, objects); return 0; }实际部署时建议将模型推理部分封装为独立类便于多线程调用和资源管理。对于Android平台还需要注意Vulkan后端初始化模型文件打包到assets目录图像数据的内存对齐处理

相关文章:

YOLOv11n模型用Ultralytics官方工具转ncnn后,C++推理代码怎么改?附完整修改版

YOLOv11n模型Ultralytics转ncnn后的C推理代码改造指南 当你在移动端部署YOLOv11n模型时,如果采用Ultralytics官方工具导出ncnn格式,会遇到与ncnn官方示例代码不兼容的情况。这种差异主要源于模型输出结构的改变,需要针对性调整C推理代码的逻辑…...

三步掌握Automate Sketch:从入门到精通的高效实战指南

三步掌握Automate Sketch:从入门到精通的高效实战指南 【免费下载链接】Automate-Sketch Make your workflow more efficient. 项目地址: https://gitcode.com/gh_mirrors/au/Automate-Sketch 在现代UI/UX设计工作中,设计师常常面临图层管理繁琐、…...

FaceFusion实战:如何用AI换脸工具制作专属卡通头像?

FaceFusion实战:如何用AI换脸工具制作专属卡通头像? 1. 工具介绍与准备工作 FaceFusion是一款革命性的AI换脸工具,它让普通人也能轻松实现专业级的人脸替换效果。与传统的换脸软件不同,FaceFusion具备以下核心优势: …...

C#/.NET 8实战:利用CommunityToolkit.Mvvm的Messenger打造一个简易实时协作白板

C#/.NET 8实战:构建基于CommunityToolkit.Mvvm的实时协作白板系统 在当今分布式协作日益普及的背景下,实现多用户实时交互的白板工具成为许多应用场景的刚需。本文将带您从零开始,利用.NET 8和WPF框架,结合CommunityToolkit.Mvvm中…...

终端美化神器 Oh-My-Posh:终极跨平台提示符定制解决方案

终端美化神器 Oh-My-Posh:终极跨平台提示符定制解决方案 【免费下载链接】oh-my-posh JanDeDobbeleer/oh-my-posh: Oh My Posh 是一个跨平台的终端定制工具,用于增强 PowerShell、Zsh 和 Fish Shell 等终端的视觉效果,提供丰富的主题和样式来…...

避坑指南:Camunda中Execution Listeners和Task Listeners的6个常见误用

Camunda监听器实战避坑指南:6个高频误用场景解析 在Camunda流程引擎的实际开发中,Execution Listeners和Task Listeners是扩展业务流程能力的利器,但也是开发者最容易踩坑的重灾区。许多团队在初步掌握监听器基础用法后,往往会在复…...

从CAN到车载以太网:AUTOSAR网络管理的“跨界”挑战与配置实战

从CAN到车载以太网:AUTOSAR网络管理的异构协同实战 当智能座舱的HUD投影与自动驾驶域控制器的点云处理同时运行时,工程师发现CAN总线上的传统ECU仍在以500kbps的速率发送NM报文,而以太网交换机却已经因为SOME/IP服务发现协议的超时配置陷入了…...

APIPOST 8.x 脚本循环调用接口实战:从踩坑到完美解决OA流程压测问题

APIPOST 8.x 脚本循环调用接口实战:从踩坑到完美解决OA流程压测问题 最近在排查某OA系统偶发的流程异常时,需要模拟真实用户操作进行压力测试。原本考虑使用Jmeter,但环境配置较为复杂,于是尝试了国产工具APIPOST。没想到这次探索…...

Kindle电子书批量下载与DRM去除终极指南:打造你的个人数字图书馆

Kindle电子书批量下载与DRM去除终极指南:打造你的个人数字图书馆 【免费下载链接】Kindle_download_helper Download all your kindle books script. 项目地址: https://gitcode.com/GitHub_Trending/ki/Kindle_download_helper Kindle电子书下载助手是一款强…...

告别微软商店:Win10企业版ThinkPad用户管理电池的终极方案——离线部署Lenovo Vantage全记录

ThinkPad企业级管理:Win10离线部署Lenovo Vantage的技术实践 当企业IT部门选择Windows 10企业版作为标准镜像时,往往会面临一个现实挑战——微软应用商店的缺失使得UWP应用部署变得复杂。作为ThinkPad设备管理的核心工具,Lenovo Vantage的离线…...

Python大模型硬件配置“黑箱”首次公开:头部AIGC公司内部《GPU选型决策树V4.2》泄露版(含量化精度-硬件成本敏感度热力图)

第一章:Python大模型部署硬件要求部署大型语言模型(LLM)在Python生态中日益普及,但其对底层硬件资源的依赖远超传统应用。合理评估并配置硬件是保障推理低延迟、训练可收敛、服务高可用的前提。显存容量与模型规模匹配 主流开源大…...

从NSA到你的桌面:手把手教你安装配置开源逆向神器Ghidra(附JDK17避坑指南)

从NSA到你的桌面:手把手教你安装配置开源逆向神器Ghidra(附JDK17避坑指南) 在软件逆向工程领域,Ghidra的出现无疑是一场革命。这款由美国国家安全局研究局开发并开源的逆向工程框架,以其强大的功能和零成本的优势&…...

2026年3月大模型全景深度解析:国产登顶、百万上下文落地、Agent工业化,AI实用时代全面来临[特殊字符]

🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可须臾或…...

南北阁Nanbeige 4.1-3B多语言支持:技术文档翻译与本地化实践

南北阁Nanbeige 4.1-3B多语言支持:技术文档翻译与本地化实践 最近在折腾一些开源项目时,发现不少优秀的工具和框架,文档只有英文版。对于国内开发者来说,这多少是个门槛。虽然现在翻译工具不少,但技术文档的翻译是个精…...

PX4飞控开发实战:如何调试mc_pos_control模块提升多旋翼飞行稳定性

PX4飞控开发实战:如何调试mc_pos_control模块提升多旋翼飞行稳定性 当多旋翼无人机在悬停时出现高频震荡,或是响应指令时显得迟缓笨重,背后往往隐藏着位置控制参数的配置问题。PX4飞控中的mc_pos_control模块作为多旋翼位置控制的核心&#x…...

PyTorch模型量化超快

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 PyTorch模型量化:超快推理的实现路径与未来展望目录PyTorch模型量化:超快推理的实现路径与未来展望 引言…...

解锁官方macOS下载技能:gibMacOS工具实战指南

解锁官方macOS下载技能:gibMacOS工具实战指南 【免费下载链接】gibMacOS Py2/py3 script that can download macOS components direct from Apple 项目地址: https://gitcode.com/gh_mirrors/gi/gibMacOS 还在为无法获取官方macOS安装文件而困扰吗&#xff1…...

植物DNA甲基化检测全攻略:从WGBS到RRBS的实战选择指南

植物DNA甲基化检测技术实战指南:从样本处理到方案优化 在植物表观遗传学研究领域,DNA甲基化检测技术正经历着从实验室探索到农业应用的快速转化。随着高通量测序成本的持续下降和生物信息学工具的日益完善,研究人员现在能够以更高的分辨率和更…...

告别模糊!专业级多显示器显示优化工具全攻略

告别模糊!专业级多显示器显示优化工具全攻略 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 在多显示器办公环境中,你是否经常遇到主副屏幕显示不一致的问题?当4K显示器遇上1080P屏幕,文字…...

深入解析运动控制中的S型速度曲线:从理论到C++实践

1. 为什么需要S型速度曲线 我第一次接触S型速度曲线是在开发工业机械臂控制系统时。当时遇到一个棘手问题:当机械臂以恒定加速度启停时,末端执行器总是会出现明显抖动,导致定位精度下降。后来在导师建议下尝试改用S型速度规划,这个…...

AcousticSense AI应用场景:电台节目音乐分类自动化

AcousticSense AI应用场景:电台节目音乐分类自动化 1. 电台音乐分类的行业痛点 电台节目制作人每天面临一个看似简单却极其耗时的工作:对数以千计的音乐曲目进行流派分类。传统的人工分类方式存在三大痛点: 主观性强:不同音乐编…...

3D动作生成新范式:如何用DiffSynth Studio实现视频到骨架的高效转换

3D动作生成新范式:如何用DiffSynth Studio实现视频到骨架的高效转换 【免费下载链接】DiffSynth-Studio DiffSynth Studio 是一个扩散引擎。我们重组了包括 Text Encoder、UNet、VAE 等在内的架构,保持了与开源社区模型的兼容性,同时提高了计…...

TensorRT黑箱破解指南:从精度谜题到性能优化的技术侦探之旅

TensorRT黑箱破解指南:从精度谜题到性能优化的技术侦探之旅 【免费下载链接】TensorRT NVIDIA TensorRT™ 是一个用于在 NVIDIA GPU 上进行高性能深度学习推理的软件开发工具包(SDK)。此代码库包含了 TensorRT 的开源组件 项目地址: https:…...

【开题答辩全过程】以 基于springboot的校园二手交易平台系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...

LeetCode 热题 100 之 138. 随机链表的复制 148. 排序链表 23. 合并 K 个升序链表 146. LRU 缓存

138. 随机链表的复制 148. 排序链表 23. 合并 K 个升序链表 146. LRU 缓存 138. 随机链表的复制 /* // Definition for a Node. class Node {int val;Node next;Node random;public Node(int val) {this.val val;this.next null;this.random null;} } */class Solution {pub…...

蓝桥杯基础--时间复杂度

目录 一、 什么是时间复杂度? 大O表示法的两大核心原则: 二、 常见的时间复杂度全解析 1. O(1) - 常数复杂度 2. O(log N) - 对数复杂度 3. O(N) - 线性复杂度 4. O(N log N) - 线性对数复杂度 5. O(N^2) - 平方复杂度 6. O(2^N) 和 O(N!) - 指…...

Jetson Nano三合一串口方案对比:40pin/USB3.0/独立模块到底怎么选?

Jetson Nano三合一串口方案深度评测:硬件选型与实战指南 在嵌入式开发领域,Jetson Nano作为一款高性能边缘计算设备,其串口通信能力直接影响着与各类传感器、控制器(如STM32)的数据交互效率。面对40pin GPIO直连、USB3…...

告别手动刷新!利用Python+Selenium实现问卷星讲座秒抢的实战教程

PythonSelenium自动化实战:高效抢票系统开发指南 从零构建自动化抢票工具 每次看到心仪的讲座或活动开放报名,却总是因为手速不够快而错过?手动刷新页面不仅效率低下,还容易因网络延迟错失良机。本文将带你用Python和Selenium打造…...

Ubuntu-Hyprland高效部署指南:零基础上手Wayland窗口管理器

Ubuntu-Hyprland高效部署指南:零基础上手Wayland窗口管理器 【免费下载链接】Ubuntu-Hyprland Automated Hyprland installer for Ubuntu. NOTE: Repo Branches as per Ubuntu Versions 项目地址: https://gitcode.com/gh_mirrors/ubu/Ubuntu-Hyprland Ubunt…...

新手快速上手Python:Miniconda-Python3.10镜像部署全流程解析

新手快速上手Python:Miniconda-Python3.10镜像部署全流程解析 1. 为什么选择Miniconda-Python3.10 Python作为当下最流行的编程语言之一,以其简洁易读的语法和丰富的生态系统著称。但对于新手来说,环境配置往往是第一个拦路虎。Miniconda-P…...