从50ms到30ms:YOLOv10部署中图像预处理的性能优化实践 - 实践

news/2025/9/25 20:25:02/文章来源:https://www.cnblogs.com/ljbguanli/p/19111941

从50ms到30ms:YOLOv10部署中图像预处理的性能优化实践 - 实践

背景

承接《yolo v10 推理速度测试报告》,调研完推理速度后,我将报告、模型和代码交接给工程实施同事,让他们采用TensorRT方式部署。

结果实测反馈,接口响应时间为50ms,远大于报告中给出的20ms实测值。需要注意的是,报告中20ms为纯模型推理耗时,而工程部署的50ms包含完整业务链路(如数据读取、预处理、后处理等),两者指标范围不同,这也提示我们需关注推理外的性能瓶颈。

更关键的是,同事尝试通过减少日志打印优化接口速度——但性能优化的首要原则是“基于测量的针对性优化”,日志打印对接口耗时的影响通常在微秒级,盲目优化非核心路径只会浪费精力,显然不符合“先测量、再优化”的基本方案。

测量

所有的优化行为都应该基于准确的测量。为了细致分析整个业务链路的耗时分布,我的第一个想法是实现一个类似 Java 中 Google Guava Stopwatch 的轻量 Python 计时类,但实际使用时发现,部分函数逻辑嵌套较深,若要对每个关键节点做细致测量,需在代码中大量埋点,耗时且侵入性强。

于是我想起之前整理的《如何分析python程序cpu占用率问题》中提到的py-spy工具,它支持非侵入式生成函数火焰图,无需修改业务代码,命令如下:

py-spy record -o profile.svg -d 60 -p <pid>

实际使用过程中,遇到两个小问题:

  1. 采样率过高(-d 60)时,py-spy会直接崩溃。最终我将采样率降至 -d 50,并通过多跑 3-5 次测试来避免崩溃;
  2. 程序高速执行场景下,采样存在一定延后,可能导致短时高频函数的耗时被低估。针对这一点,我还没有再细研究…

运行完成后,定位到业务代码相关的火焰图片段,发现PIL/Image.pyconvert('RGB')函数耗时占预处理阶段的35%左右,是明显的性能瓶颈。

https://i-blog.csdnimg.cn/direct/a38a65e3a10e40219b1374af5c23f14c.png

优化

找到对应的代码位置后,我分析了原代码的性能问题,并结合AI多次验证优化方向,最终确定用 OpenCV + NumPy 组合替代 PIL 方案,优化前后代码对比如下:

优化前(PIL方案)

image_file = request.files.get('image')
image_data = image_file.read()
image_stream = io.BytesIO(image_data) # 第一次冗余拷贝:基于image_data创建内存流缓冲区
img = Image.open(image_stream).convert('RGB') # 第二次冗余拷贝:转换色彩模式时生成新图像对象

优化后(OpenCV方案)

image_file = request.files.get('image')
image_data = image_file.read()
img_np = np.frombuffer(image_data, dtype=np.uint8) # 零拷贝:直接映射image_data的内存地址,不额外开辟空间
img = cv2.imdecode(img_np, cv2.IMREAD_COLOR) # 复用内存:解码时直接使用img_np指向的原始数据
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 仅1次必要拷贝:因OpenCV默认BGR格式,需转RGB适配后续流程

核心优化点在于减少“不必要的内存数据搬运”:原PIL方案通过两次拷贝处理数据(内存流缓冲+色彩转换)
而优化后方案用np.frombuffer实现“零拷贝”内存映射,仅保留色彩空间转换这一步必要操作,大幅降低了内存开销和数据搬运耗时。

结果

优化后实测,仅这一处改动就减少了20ms耗时,接口响应速度从50ms优化到30ms。

由于时间限制,我暂未继续深挖后续优化点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

申请域名流程后怎样做网站装潢设计软件免费

转自&#xff1a;http://www.ruanyifeng.com/blog/2012/09/linus_torvalds.html作者&#xff1a; 阮一峰日期&#xff1a; 2012年9月 3日除了程序员&#xff0c;大概很少人知道Linux操作系统。它的发明者Linus Torvalds&#xff0c;知道的人就更少了。他本人也很低调&#xff0…

大兴做网站公司wordpress首页布局修改

来源&#xff1a;新华社第17届亚洲-太平洋通讯社组织&#xff08;亚通组织&#xff09;全体大会8日在韩国首尔闭幕。大会颁发了亚通组织卓越通讯社品质奖&#xff0c;中国新华通讯社与越南通讯社分别获奖。这是亚通组织主席、阿塞拜疆国家新闻社社长阿斯兰阿斯兰诺夫&#xff0…

苏联的经典数学教材

苏联的经典数学教材苏联的数学教材以其体系严谨、逻辑缜密、内容深刻而享誉世界,形成了独具特色的“苏联学派”风格。这些教材通常不满足于简单地呈现知识,而是致力于培养学生严格的数学思维和独立的解题能力。其典型…

java课基础问题整理与解答

java课基础问题整理与解答常量与变量定义示例 public class cyj { // 1. 定义全局常量,全局变量在项目中通用 public static final int MAX_VALUE = 512; // 2. 定义局部常量,局部变量在本类中使用 private static f…

redis实现分布式锁1

在集群下的并发问题:业务流程:具体实现: ILock点击查看代码package com.hmdp.utils;public interface ILock {// 获取锁boolean tryLock(long timeoutSec);// 释放锁void unlock(); }SimpleRedisLock点击查看代码pa…

网页设计基础知识总结如何优化网站推广

原文地址&#xff1a;http://www.cnblogs.com/yinzixin/archive/2012/11/30/entity-framework-dynamic-query.html Dynamic Query是一个支持动态Entity Framework查询的库。它的设计初衷是为了减少在管理系统中大量出现的对一个数据集进行查找、排序、分页的这类场景的开发工作…

对软件工程的理解:从 “写代码” 到 “系统工程” 的认知跃迁

对软件工程的理解:从 “写代码” 到 “系统工程” 的认知跃迁在接触《软件工程》课程前,我对软件开发的认知停留在“用代码实现功能”的单一维度,认为只要熟练掌握 Python(我最常用的开发语言),能写出可运行的程…

深入解析:Python9-逻辑回归-决策树

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:(13)GPS/无GPS转换

完整教程:(13)GPS/无GPS转换pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

石家庄网站开发设计asp源码打开网站

生日是一个人在一年中比较特殊的日子之一&#xff0c;人们通常希望能够在这一天得到亲朋好友的祝福和庆祝。然而&#xff0c;随着人们生活节奏的加快&#xff0c;很多人表示自己很容易忘记他人的生日&#xff0c;导致不能够及时送出祝福和礼物。如果经常忘记亲朋好友的生日&…

网站建设主要包括用jquery做的书籍网站

机器学习编译MLC 1. 引言2. 机器学习编译--概述2.1 什么是机器学习编译 1. 引言 陈天奇目前任教于CMU&#xff0c;研究方向为机器学习系统。他是TVM、MXNET、XGBoost的主要作者。2022年夏天&#xff0c;陈天奇在B站开设了《机器学习编译》的课程。   《机器学习编译》课程共分…

在百度做推广需要网站吗质量最好的购物平台

C 语言 break和continue语句 C 语言 break break语句在遇到循环时将立即结束循环。其语法为&#xff1a; break; break语句几乎总是与if…else循环内的语句一起使用。 示例1&#xff1a;break语句 //程序计算最多10个数字的总和 //如果输入负数&#xff0c;则循环终止 includ…

Transformer自回归关键技术:掩码注意力原理与PyTorch完整实现

掩码注意力(Causal Attention)是生成式模型的核心技术,它传统自注意力机制有根本的不同,掩码注意力限制模型只能关注当前位置之前的tokens,确保了自回归生成的因果性。 自注意力的掩码 自注意力机制在Transformer…

深入解析:SQL 字符串函数高频考点:LIKE 和 SUBSTRING 的区别

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第四篇

今天是9月25号,今天又不发工资,烦死了,不写了。

六安市裕安区建设局网站北京建设信源资讯网站官网

一、粒子 Unity中的粒子组件叫做Particle System。 粒子系统顾名思义&#xff0c;与“微粒”有关。粒子系统会生成和发射很多粒子&#xff0c;通过控制粒子的生成数量、大小、角度、速度、贴图和颜色等众多属性&#xff0c;可以实现或真实或炫酷的各种效果。其中&#xff0c;…

PyTorch图神经网络(六)

PyTorch图神经网络(六) ​ 第十章讲的是使用图神经网络来预测链接,这里直接跳过传统方法。 1.VGAE ​ VGAE是通过编码器-解码器的形式来对链接进行预测。通过VGAE对节点的特征进行编码,然后通过GCN层来聚合相邻节点…

Etcd详解:Kubernetes的大脑与记忆库 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

数智化术中导航:Holoscan + IGX的“边缘实时低时延”管线工艺分析(上)

数智化术中导航:Holoscan + IGX的“边缘实时低时延”管线工艺分析(上)2025-09-25 19:56 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: a…

Qwen多模态系列模型笔记—Qwen-VL

Qwen-VL论文笔记 摘要 在这项工作中,我们介绍Qwen-VL系列,一组旨在感知和理解文本与图像的大规模视觉语言模型。从Qwen-LM这个基础大语言模型出发,我们通过如下四条精心设计,赋予了其视觉能力: (1)视觉编码器;…