2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品
2024年12月,中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛(简称2024 CCF BDCI)。本届比赛的算能赛道吸引了1748名选手报名,经过激烈角逐,北京航空航天大学的“常务副SOTA”团队脱颖而出,荣获大赛最佳算法能力奖。
本届CCF BDCI大赛中,算能赛道推出了“基于TPU平台的OCR模型性能优化”的赛题,旨在探索如何通过高效的TPU硬件平台— Duo系列开发板,以及先进的算法优化技术,实现OCR模型在精度、速度和资源消耗等方面的全面优化,进而精确识别目标文本。
针对该赛题,“常务副SOTA”团队选择了YOLOv8关键点模型和PPOCRv2-Rec作为基础模型,因其在速度和精度上的优越表现。团队通过通道剪枝、算子融合和词表剪裁等技术,显著减少了计算量和推理时间。在模型转换中,使用TPU-MLIR工具确保高效运行并保持精度。同时,优化前后处理环节,如使用RVV加速图像处理,进一步提升性能。最终,检测模型和识别模型的推理速度分别提升了近4.9倍和3.5倍,单图推理时间缩短至700ms以内。
以下为“常务副SOTA”团队的研究技术报告,供开发者们参考与学习!
团队简介
我们团队由四位深度学习技术爱好者组成,队名为“常务副SOTA”,希望通过比赛来促进队员的成长,也希望提出的方案能为实际应用添砖加瓦。
摘要
随着深度学习的快速发展,OCR(Optical Character Recognition,光学字符识别)技术已广泛应用于文本识别、自动化办公、信息提取等多个领域。然而,由于OCR任务对计算资源的需求较高,如何在低功耗设备上实现高效的OCR模型成为了一个重要挑战。本文基于TPU平台MilkV-Duo部署,针对OCR模型的性能进行优化,涉及模型选择、优化、转换及前后处理等方面。通过一系列的优化手段,包括通道剪枝、模型量化、算子融合、前处理加速等,成功提升了模型的推理速度和精度,最终实现了在端侧设备上的高效运行。
关键词
OCR,TPU-MLIR,MilkV-Duo 部署,量化
1.比赛分析
本次比赛的目标是将OCR模型优化并部署到TPU平台上,达到高效运行的要求。OCR任务通常包括图像输入、前处理、检测、矫正、分类和识别等步骤。在比赛中,参赛队伍需要对OCR模型进行优化,减少模型的计算量和存储需求,同时提高推理速度和准确率。
比赛提供了一个基线模型,该模型的OCR流程如下:
- 图像输入:读取输入图像并进行预处理。
- 检测前处理:对图像进行一些基本的预处理,例如灰度化、二值化等。
- 检测模型:通过模型输出二值图,进一步进行目标区域的识别。
- 连通域算法:寻找图像中的目标区域并提取最小外接旋转矩形。
- 仿射变换:将图像旋转拉正为矩形。
- 分类前处理:对图像进行分类处理,输出旋转角度。
- 识别前处理:进一步对图像进行旋转,确保识别模型的准确性。
- 识别模型:最后通过识别模型输出识别结果。
比赛的要求是要在TPU平台上实现高效的推理,因此需要优化各个环节,特别是模型的计算量和推理速度。
2.模型选择
为了在TPU平台上实现高效的OCR模型,我们首先从多个候选模型中进行选择。考虑到OCR任务的特点,如需要获取目标的不规则四边形输出,最终我们在PPOCR系列,YOLO目标检测系列,以及YOLO关键点检测系列模型中进行选型。
通过简单的速度实验对比,我们发现PPOCRv4-Det检测模型存在参数量大,模型后处理复杂,且推理速度较慢等明显问题,640*640的输入下端到端需要1080ms才能完成推理,相比之下,YOLOv8检测模型端到端只需要820ms,YOLOv8关键点模型端到端只需要840ms,总的来说使用检测和关键点模型在推理速度上更加有优势。
在选择识别模型时,我们还同时还考虑了精度与速度的平衡,比如PPOCRv4-Rec虽然在精度上有一定提升,但引入Transformer结构后,推理速度较慢,因此我们选择了更早版本,且没有使用Transformer结构的PPOCRv2-Rec作为识别模型。
除此之外,我们考虑到资源占用问题,由于赛题要求在端侧设备上运行,尽量减少OCR任务中的pipeline模型个数,最终我们没有使用方向分类模型,这可以降低资源Milkv-Duo的资源占用。
最终,我们选择使用YOLOv8关键点模型和PPOCRv2-Rec识别模型最为我们团队的OCR任务基座模型,然后在这基础上最更多的优化工作。
3.模型优化
在模型选择之后,我们分别对关键点模型和识别模型进行了多方面的优化,以提高其在TPU平台上的运行效率。具体优化策略如下:
1. 通道剪枝:通过通道剪枝技术,我们减少了YOLOv8n-pose模型的通道为原来的一半,减少了计算量,从而加速了模型的推理速度。我们通过重新训练的方法让通道剪枝能够在不显著降低精度的情况下,减小模型的计算量。
2. 增加特征尺度:在模型的训练过程中,增加了对特征尺度P2(下图黄色部分)的融合,使得模型能够在多个尺度下进行特征提取,从而提高模型对多尺度目标的适应性,进而提升了识别精度。
图1:增加特征尺度
3. 模型算子融合:我们通过算子融合,将多个操作合并为一个操作,如连续的卷积或反卷积和批归一化层、连续的卷积或反卷积和线性变化层等合并为一个算子,还通过将多个复杂琐碎的算子如被拆散的层归一化算子融合为单独的层归一化算子降低了多个算子的计算和访存,通过这一方案,我们成功减少了计算图的复杂性,减小了模型的计算开销。
4. 模型的算子移除:我们通过将一些复杂的后处理算子,如和置信度计算的sigmoid激活以及和提取分类标签的softmax算子从模型中移除,通过和int8输出的反量化融合来减少计算的开销。
5. 词表剪裁:对模型的词表进行了剪裁,将原始的6625个类别减少至3952个,减少了40%的词表大小,缩短了匹配时间。
6. 关键点模型的后处理减枝:我们通过将YOLOv8-pose模型后处理完整裁剪,通过提前使用置信度阈值过滤不必要的计算来提升模型的端到端速度。
通过上述模型层面的优化,我们的方案在保证精度的前提下减少了模型尺寸,减少了模型算子数量,并且避免了大量的冗余计算,更加适合在TPU平台高效运行。
4.模型转换
在模型优化完成后,我们使用TPU-MLIR工具对模型进行转换,以便能够在TPU平台上高效运行。模型转换主要包括以下两个方面:
1. 检测模型转换:将检测模型从onnx转换为mlir格式,最后转换为cvimodel格式。这一过程中,优化了检测模型的输入尺寸,将输入尺寸从640*640调整为320*320,以减少图像前处理的耗时和推理的计算量。我们尝试将检测模型以INT8精度转换,在Milkv-Duo上的精度保持很好,最终我们采用了INT8模型部署,并且将前处理融合到模型道中,以加速端到端的速度。
2. 识别模型转换:将识别模型从onnx转换为mlir格式,最后转换为cvimodel格式。识别模型的转换过程中,由于原始输入尺寸为32x640,转换时遇到了一些问题,最终通过调整为32x320的输入尺寸,解决了转换失败的问题。我们尝试过INT8精度转换,但是在Milkv-Duo上的精度较差,最终我们选择使用BF16精度部署,并且将前处理融合到模型道中,以加速端到端的速度。
5.前后处理优化
在前后处理阶段,我采用了一些优化策略,以进一步提升模型的运行效率。具体优化手段包括:
1. 前处理优化:使用RVV(RISC-V Vector Extension)实现图像resize操作,将原本120ms的图像resize时间减少至90ms,提升了33.33%的速度。
2. 后处理优化:通过使用int8查表实现sigmoid过滤阈值,减少了后处理的计算量,将后处理的时间从20ms减少至18ms,提升了11.11%的速度。
3. anchor生成优化:通过将anchor生成和softmax计算通过int16进行优化,并结合反量化操作,使得后处理速度提升了66.66%(从10ms降至6ms)。
4. OpenCV优化:使用平头哥的OpenCV替代了opencv-mobile,提升了OpenCV算子的执行速度,进而加速了整体模型的运行。
6.实验记录
经过上述优化后,我们对模型进行了全面的实验验证。实验结果如下:
首先是检测模型的实验情况:
模型 | 端到端耗时(ms) | 备注 |
Base | 1080ms | 640x640 |
Base | 650ms | 320x320 |
Pose | 472ms | 320x320 |
Pose | 440ms | +后处理裁剪 |
Pose | 310ms | +int8 融合前处理 |
Pose | 294ms | +算子融合 |
Pose | 260ms | +rvv reize + 库优化 |
Pose | 242ms | +sigmod/softmax优化 |
Pose | 220ms | +阈值 (conf0.3 iou0.7) |
然后是识别模型的实验情况:
模型 | 端到端耗时(ms) | 备注 |
ppocrv2 | 560ms | 32x640 |
ppocrv2 | 380ms | 32x320 |
ppocrv2 | 220ms | +int8 融合前处理 |
ppocrv2 | 209ms | +裁剪softmax |
ppocrv2 | 188ms | +算子融合 |
ppocrv2 | 154ms | +裁剪词表 |
ppocrv2 | 140ms | +rvv reize + 库优化 |
最终,我们优化后的检测模型相比基线版本提升了接近4.9倍,我们优化后的识别模型相比基线版本提升了接近3.5倍。
在单图推理的情况下(包括一次检测和三次识别),优化后的模型能够在700ms以内完成,远低于基线模型的运行时间。这一结果表明,通过上述优化手段,模型在TPU平台上的运行效率得到了显著提升。
致谢
感谢CCF协会、DF平台和SOPHGO公司提供的宝贵机会;感谢主办方免费提供的milkv duo开发板,以及主办方针对开发板板特性和模型部署问题的答疑;感谢平头哥和nihui老师开源OpenCV-THead和OpenCV-Mobile;感谢百度PaddlePaddle团队开源PPOCR工具;感谢Ultralytics对YOLO模型的开源;感谢一起参加此次比赛的友军的分享和讨论。
参考
[1] Ultralytic, YOLOv8,https://github.com/ultralytics/ultralytics
[2] nihui,OpenCV-Mobile,https://github.com/nihui/opencv-mobile
[3] 平头哥团队,OpenCV-Mobile,https://www.xrvm.cn/community/
download?id=4112956065753141248
相关文章:

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品
2024年12月,中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛(简称2024 CCF BDCI)。本届比赛的算能赛道吸引了1748名选手报名,经过激烈角逐,北京航空航天大学的“常务副SOTA”团队脱颖而出…...

FPGA的IP核接口引脚含义-快解
疑问 手册繁琐,怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌,手册确实比较详细但繁琐,如何快速知晓该部分信息,涛tao道长给你们说,简单得很,一般新入门的道友有所不知,往往后面…...

数据库高安全—审计追踪:传统审计统一审计
书接上文数据库高安全—角色权限:权限管理&权限检查,从权限管理和权限检查方面解读了高斯数据库的角色权限,本篇将从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读。 4 审计追踪 4.1 传统审计 审计内容的记录方式通…...

机器学习 - 需要了解的条件概率、高斯分布、似然函数
似然函数是连接数据与参数的桥梁,通过“数据反推参数”的逆向思维,成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”,这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…...

Spring Boot Web 入门
目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块,它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南,涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …...

神经网络|(八)概率论基础知识-二项分布及python仿真
【1】引言 前序已经学习了古典概型、条件概率、全概率公式和贝叶斯公式,它们作为基础,解释了事件发生及其概率的对应关系,相关文章链接为: 神经网络|(四)概率论基础知识-古典概型-CSDN博客 神经网络|(五)概率论基础知识-条件概…...
【面试场景】MySQL分布式主键选取
文章目录 一. MySQL的自增主键二. UUID三. 雪花ID(推荐) 我的博客地址 一. MySQL的自增主键 适合单表的情况, 在分布式分库分表下可能会有一些问题 主键冲突问题 在分布式系统中,多个数据库节点独立生成自增主键,很容易出现重复的主键值。例如ÿ…...
执行git stash drop stash@{x} 时出现error: unknown switch `e‘ 的解决方式
原因: 在 PowerShell 或某些 Shell 中,{} 是特殊符号,stash{0} 会被解析成 stash 0,而 后的字符可能被误认为选项(如 -e),使 Git 收到意外的 -e 参数,导致报错 unknown switch ‘e’。 解决方…...

链表和 list
一、单链表的模拟实现 1.实现方式 链表的实现方式分为动态实现和静态实现两种。 动态实现是通过 new 申请结点,然后通过 delete 释放结点的形式构造链表。这种实现方式最能体 现链表的特性; 静态实现是利用两个数组配合来模拟链表。一个表示数据域&am…...
windows 蓝牙驱动开发-传输总线驱动程序常见问题
以下是驱动程序开发人员在开发总线驱动程序以支持蓝牙功能时可能会遇到的一些常见问题和方案。 我的串行总线驱动程序遇到了一些错误。 它意味着什么? 代码 10-49:设备管理器生成的错误代码。 代码 51:当串行总线驱动程序具有相关的控制器…...

Qt修仙之路2-1 炼丹初成
widget.cpp #include "widget.h" #include<QDebug> //实现槽函数 void Widget::login1() {QString userusername_input->text();QString passpassword_input->text();//如果不勾选无法登入if(!check->isChecked()){qDebug()<<"xxx"&…...

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue宠物预约上门服务预约平台
开题报告 本研究论文旨在构建并阐述一个基于 SpringBoot 和 Vue 技术栈开发的宠物上门服务预约平台的设计与实现。该平台集成了丰富的功能模块,为用户提供一体化的便捷服务体验。首先,用户能够通过注册并登录系统,享受个性化的服务流程。在平…...
无线AP之详解(Detailed Explanation of Wireless AP)
无线AP是什么? 市场上的AP基本上分为两大类:单纯型AP和扩展型AP。扩展型AP除了基本的AP功能之外,还可能带有若干以太网交换口、路由、NAT、DHCP、打印服务器等功能。 无线AP也就是一个无线交换机 无线路由器就是一个带路由功能的无线AP&am…...
Spring Boot Actuator与JMX集成实战
在微服务架构中,监控和管理应用的运行状态是至关重要的。Spring Boot Actuator 提供了一种便捷的方式来监控和管理 Spring Boot 应用,而 JMX(Java Management Extensions)则是一种用于管理 Java 应用的标准技术。本文将通过一个实…...

mac环境下,ollama+deepseek+cherry studio+chatbox本地部署
春节期间,deepseek迅速火爆全网,然后回来上班,我就浅浅的学习一下,然后这里总结一下,我学习中,总结的一些知识点吧,分享给大家。具体的深度安装部署,这里不做赘述,因为网…...

camera光心检测算法
1.概要 光心检测算法,基于opencv c实现,便于模组厂快速集成到软件工具中,适用于camera模组厂算法评估组装制程镜头与sensor的偏心程度,便于工程师了解制程的问题找出改善方向。 2.技术介绍 下图为camera模组厂抓取的bayer-raw经过…...
【MySQL】向后兼容设计规范(无回滚场景)
MySQL 向后兼容设计规范(无回滚场景) 在 不支持数据库回滚 且需保证 长期向后兼容性 的系统中,需通过 架构设计 和 流程管控 规避风险。以下是关键设计规范: 一、变更流程规范 变更分类分级 变更类型风险评估等级审批流程测试要求…...

还搞不透stm32单片机启动过程?一篇文章几百字让你彻底看懂!
1.stm32启动 1.1 msp和pc的初始值,第一步: 2.boot的值就被锁定了 可以根据实际绑定的值变动, 这里补充一点boot1和0的原理: 1.2来点刺激的: 这里我插入一个链接: 【明解STM32】一文搞明白STM32芯片存储…...

无界构建微前端?NO!NO!NO!多系统融合思路!
文章目录 微前端理解1、微前端概念2、微前端特性3、微前端方案a、iframeb、qiankun --> 使用比较复杂 --> 自己写对vite的插件c、micro-app --> 京东开发 --> 对vite支持更拉跨d、EMP 方案--> 必须使用 webpack5 --> 很多人感觉不是微前端 --> 去中心化方…...

DeepSeek辅助段落扩写的能力怎么样?
DeepSeek-R1在学术写作的诸多细节层面展现出了显著的应用价值。接下来我们将通过一系列具体案例,深入探讨该工具如何在扩写、翻译、发表以及内容改进等关键环节为学术写作提供有力支持。在提问环节,DeepSeek-R1能够高效地简化提示词,并精准地…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...
java+webstock
maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...

LINUX编译vlc
下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总(最简化)_底部的附件列表中】: ffmpeg - lzip…...

vue3 手动封装城市三级联动
要做的功能 示意图是这样的,因为后端给的数据结构 不足以使用ant-design组件 的联动查询组件 所以只能自己分装 组件 当然 这个数据后端给的不一样的情况下 可能组件内对应的 逻辑方式就不一样 毕竟是 三个 数组 省份 城市 区域 我直接粘贴组件代码了 <temp…...