基于YOLO与SpringBoot的条形码检测系统实战指南
2026/9/8 17:17:58 网站建设 项目流程

每次一提条形码检测,很多人第一反应就是拿ZXing、OpenCV那条路走下去。但真放到工业现场、仓储物流或者门店结算这种场景里,传统方案往往会被复杂背景、倾斜畸变、光照不均按在地上摩擦。我这两年用YOLO系列重新做了整套条形码检测系统,配合SpringBoot做后端服务、Vue做前端交互,再把千问和DeepSeek接进来做智能分析,效果远比想象中稳。这篇文章就把整个系统的技术选型、数据集处理、模型训练、后端集成、前端联调和部署优化完整拆开讲一遍,适合正在做检测类项目、想从传统CV切到深度学习的同学参考。

1. 技术选型与整体架构设计

1.1 这个系统到底解决什么问题

先聊清楚需求边界。传统条形码识别通常分两步走:先用图像处理算法定位条码区域,再交给ZXing或类似的解码库去解析内容。问题在于,第一步在复杂场景下特别容易翻车。我之前在工厂产线上遇到过一码多扫的场景:传送带上的包装盒反光严重,条码部分被遮挡,背景里还有大量噪声纹理,ZXing的取景框根本锁不住目标,识别率只能到六成左右。

换成深度学习方案之后,整个思路就变了。我们用YOLO系列模型直接端到端检测出条形码在图像中的位置,输出一个带角度的矩形框,再把裁剪区域交给解码库做内容解析。这样做有三个好处:一是定位准确率大幅提升,复杂背景下也能把人眼都看不清的条码框出来;二是检测速度快,单张图像在GPU上推理耗时能控制在几十毫秒级别;三是模型可泛化能力强,换了新场景只需要补充标注数据微调,不用像传统方案那样反复调参。

所以这个系统的核心定位是:面向真实场景的条形码自动定位与识别平台,解决传统方案在复杂背景下鲁棒性不足的问题,同时通过前后端分离架构把检测能力以Web服务的形式开放出去,后续扩展扫码枪接入、批量巡检、数据统计分析都非常方便。

1.2 技术栈选型的核心逻辑

这个项目我特意把技术栈选成了YOLO+SpringBoot+前后端分离,同时接入千问和DeepSeek。很多人会问,为什么不在Java里直接调OpenCV,或者干脆用Python写后端?这背后是有明确考虑的。

先说检测模型侧。YOLO系列从v8一路更新到v12,每一代都在精度和速度之间做权衡。v8是当前生态最成熟的版本,文档多、社区活跃、部署资料齐全;v10引入了无NMS的Dual Assignment机制,推理时少一步后处理,速度更快;v11在v8基础上优化了C3K2模块,参数量和计算量更均衡;v12则在特征提取能力上做了增强,小目标检测效果更好。实际项目中,我建议把这些版本都试一遍,用同一份数据集评估mAP和FPS,再根据你的硬件条件选型。

再说后端框架。SpringBoot的好处是生态成熟、稳定性高,适合做企业级应用。检测模型训练是在Python生态里完成的,但模型部署和业务系统对接我选择放到Java侧,这样整个系统的权限控制、数据持久化、任务调度、API网关都可以统一在Spring生态里完成。前后端分离则是现代Web应用的标配,Vue负责交互界面,SpringBoot只提供REST API,两边独立开发、独立部署,后期加功能互不影响。

接入千问和DeepSeek是为了做智能分析层。检测模型能告诉你条码在哪里、内容是什么,但如果用户想进一步了解这个条码对应的商品类别、同类产品对比、历史扫码趋势分析,就需要大语言模型出场了。我这里的做法是:检测结果出来之后,把条码内容、图像描述和用户问题一起发给大模型API,让它生成结构化分析结论,前端再以对话或报表形式展示。这个设计让系统不只是一个“识别工具”,而是升级成了“智能分析平台”。

1.3 系统整体架构

先把整体架构铺开,后面的章节再逐个拆细节。整个系统分为五层:

第一层是前端展示层,用Vue3+Element Plus构建,负责图片上传、实时检测预览、历史记录管理、数据分析报表展示。第二层是后端服务层,SpringBoot提供REST API,包含用户认证、检测任务调度、结果存储、条码解码、智能分析调用等功能。第三层是模型推理层,负责加载训练好的YOLO模型,对输入图片执行目标检测。这一层我倾向于通过Python推理服务或ONNX Runtime来承载,具体方案后面会详细对比。第四层是大模型分析层,封装了千问和DeepSeek的API调用逻辑,负责把检测结果转化为可读的自然语言分析。第五层是数据层,用MySQL存储检测历史、用户信息和分析记录,Redis做缓存和任务队列。

需要强调的一点是,这个架构里的模型推理层是独立部署的,没有直接嵌在SpringBoot进程里。原因后面章节会展开讲,这里先记住一句话:模型推理的算力需求和业务服务的资源需求是不同的,拆开才能各自独立伸缩。

2. YOLO条形码检测:数据处理、训练与模型优化

2.1 条形码检测的难点到底在哪儿

条形码这个目标在目标检测里算是个异类,它有几个天然坑,直接决定了模型的训练策略。

坑一是长宽比极端。常见的EAN-13条码,长度可能是宽度的三四倍,检测框的长宽比非常大。YOLO默认的锚框设置是针对通用目标设计的,如果直接拿默认配置去训练,条形码这类细长目标会出现定位偏移的问题。解决办法是训练前用k-means算法在自建数据集上重新聚类锚框,让锚框尺度和目标形状对齐。v8之后的版本已经改成自适应锚框,但数据分布特殊时还是要手动复核一下。

坑二是目标偏小。在仓库全景图里,一个条码可能只占画面的1%不到。小目标检测对输入分辨率很敏感,我强烈建议训练和推理时把输入尺寸从默认的640提升到960甚至1280。代价是推理速度变慢,但对条码这种需要高精度定位的场景来说,这个代价是值得的。

坑三是形变和透视畸变。条码贴在不规则表面上时会出现拉伸、旋转、曲面变形,这对解码层面的影响比检测层面大得多。检测层面只需要框出大致区域,但解码阶段如果拿到的是一个严重畸变的区域,ZXing大概率识别失败。所以我在解码前加了一个矫正步骤,根据检测框的旋转角度做仿射变换,把条码区域拉正再送进解码器,识别成功率能提升两到三成。

2.2 数据集准备:手工标注不够快就用合成数据

数据集是检测模型的命根子。我一开始走了弯路,手工标注了三千张图片,累到怀疑人生,后来发现工业场景下最合适的做法是手工标注加合成数据混合。因为条码的生成规律是明确的:条码本身是一系列固定宽度的黑白条纹,完全可以程序化生成。我用脚本随机生成了两万张合成条码图片,叠加各种背景纹理、光照变化、透视畸变和模糊效果,然后以真实标注数据为基准做交叉验证,模型在小目标场景下的召回率有明显提升。

如果项目预算允许,还是建议从公开数据集起步,比如Roboflow上有很多条码检测的公开项目。拿公开数据做预训练,再用自己的业务数据微调,能省下大量标注成本。标注时统一用矩形框还是旋转框,这个要提前想清楚。标准YOLO用的是轴对齐矩形框,但如果你的场景里条码旋转角度很大,矩形框会把大量背景区域包进来,影响解码效果。我自己的做法是用轴对齐矩形框训练YOLO,但在后处理阶段用OpenCV的minAreaRect找出条码的最小外接旋转矩形,把角度信息传给矫正模块,兼顾训练便利性和解码精度。

数据增强这块也要用心配置。条码检测最常见的数据增强是mosaic拼接、随机透视变换、HSV色域扰动和多尺度训练。其中透视变换对条码这种规则图案的泛化能力提升非常关键,因为真实场景中条码经常是歪斜的,训练数据里如果全是正视角图片,模型就学不到旋转鲁棒性。

2.3 不同YOLO版本的训练配置对比

同一个数据集我分别用YOLOv8、v10、v11、v12跑过对比实验,这里把关键差异分享出来。

YOLOv8是最稳妥的选择。训练命令简单,参数调优资料丰富,部署生态最完善。如果你的硬件只有一张消费级显卡,比如RTX 3060或者AMD RX 580这种级别,v8的nano/small版本能在保底精度的情况下跑出让你满意的速度。

YOLOv10的核心卖点是免NMS。v8在推理时需要做非极大值抑制去掉重复框,v10通过双重标签分配在训练阶段就让每个目标只对应一个预测框,推理时省掉了NMS这一步。实测下来FPS提升约15%,对实时性要求高的产线场景很友好。

YOLOv11的改进集中在C3K2模块和多尺度特征融合上,参数量比v8同尺寸版本略少,但mAP有微弱提升。我个人用下来的感觉是v11在中等尺度目标上的表现更均衡,训练收敛速度也快一些。

YOLOv12是序列化的当前版本,引入了注意力机制相关的新设计,小目标检测精度有明显改善。代价是GPU显存占用上升,训练时需要注意batch size别开太大。

训练参数方面,我固定用adamW优化器、初始学习率0.001、cosine学习率衰减,epoch设为200。条码数据集规模不大,200个epoch完全够了,再多就会过拟合。batch size取决于显存,我建议16起步。上面提到的这些参数在不同显卡上效果会有差异,我整理了一张参考表:

模型版本输入尺寸锚框策略推理后处理适用场景
YOLOv8640/960自适应优化需要NMS通用场景,生态最成熟
YOLOv10640/960双重分配训练免NMS对速度要求高的实时场景
YOLOv11640/960自适应优化需要NMS精度与速度均衡
YOLOv12960/1280自适应优化需要NMS小目标为主的高精度场景

2.4 评估、调参与模型导出

训练完之后千万别只盯着mAP。对于条码检测项目,我更看重的是极端情况下的评估:小目标样本的AP值、逆光条件下的召回率。我建议做一个单独的小测试集,专门放平时训练集里少见的困难样本,比如反光强烈、严重模糊、重叠遮挡的条码图片。模型在标准测试集上mAP可能很漂亮,但困难样本的表现才是上线后的真实水平。

调参阶段有个小技巧:如果发现检测框抖动剧烈,优先把置信度阈值调高,比如从0.25调到0.4;如果发现漏检率偏高,则降低IoU阈值。还有个容易踩的坑是类别数,条码检测本质上是单类别任务,但如果你同时想检测QR码和DataMatrix码,记得在数据集里分好类再训练,不要硬塞进一个类别里。

训练完成后的导出环节最容易被忽略。YOLO训练出来的权重是PyTorch格式,如果要部署到Java服务里,一般有三种选择:直接导出为ONNX、转成TensorRT引擎、或者保持PyTorch权重用TorchServe承载。我个人最推荐导出ONNX,因为ONNX是跨语言跨框架的中立格式,Java侧可以用ONNX Runtime直接加载推理,不用额外起Python进程。导出命令很简单,在YOLO的CLI工具里用export方法指定format=onnx即可,注意带上opset参数,太低的版本会缺算子支持。

3. SpringBoot后端设计与模型服务集成

3.1 后端整体分层设计

SpringBoot在这里承担的是业务系统核心的角色,不只是做接口转发。我按照标准的四层结构来组织代码:Controller层负责HTTP接口和参数校验;Service层负责核心业务逻辑,包括检测任务的调度、结果状态管理、与模型推理服务的通信;Repository层负责数据库操作;Config层管理全局配置,包括模型服务地址、大模型API密钥、文件存储路径等。

这里要特别注意一个设计原则:模型推理的耗时通常比普通数据库操作长几个数量级,所以一定不能把推理过程阻塞在HTTP请求线程池里。我的做法是引入异步任务机制,检测请求进来先返回一个taskId,后台线程池执行推理,推理完成后再通过WebSocket推送给前端。这样即使用户上传的是视频流或者大批量图片,前端也不会出现长时间白屏等待。

异步任务的后端实现并不复杂,SpringBoot里用@Async注解配合自定义线程池就能搞定。线程池的核心线程数我设置为CPU核心数的一半,最大线程数设置为CPU核心数的两倍,队列容量根据峰值流量调整。这里有个经验值:单张图片的推理耗时如果是200ms,一台8核8G的服务器可以稳定支撑每秒5个并发检测任务,再高就需要上消息队列削峰。

3.2 模型推理的三种集成方案对比

在Java生态里集成YOLO检测模型,我亲测过三条路,各有优劣。这里把我的踩坑经验完整写出来。

方案一:Python推理服务加HTTP调用。把YOLO封装成一个Python Flask或FastAPI应用,SpringBoot通过HTTP接口上传图片、获取结果。这个方案的优点是实现最快,Python侧可以直接复用YOLO的原生推理代码,不需要做任何模型转换。缺点是多了一个网络通信环节,单次检测的延迟会增加几十毫秒,而且Python服务的进程管理和SpringBoot侧不同,部署时要额外用systemd或Docker管理它。适合模型还在频繁迭代的初期阶段。

方案二:ONNX Runtime Java API加载ONNX模型。这是我现在线上用的方案,把训练好的模型导出为ONNX格式,放到SpringBoot的资源目录下,运行时用ONNX Runtime加载并执行推理。好处是整个系统只有一个Java进程,部署和运维成本低,推理速度快;坏处是预处理和后处理代码需要自己写,包括图像缩放、归一化、置信度过滤和NMS,这部分代码量不小,但写完一次后面就省心了。

方案三:TorchServe承载模型。TorchServe是PyTorch官方的模型服务框架,原生支持YOLO这类PyTorch模型,SpringBoot作为客户端调用它的REST API。这个方案适合大型项目,模型版本管理、A/B测试、多模型并行都很方便。缺点是架构重,引入的组件多,团队不大或者只是单机部署的话会有点杀鸡用牛刀。

如果你用的是低配显卡,比如AMD RX 580,CUDA这块会很头疼。YOLO训练阶段主要是在PyTorch里跑,AMD的ROCm支持有限,很多版本根本装不上。我的建议是:训练阶段用CPU或者云端的GPU实例,部署阶段用ONNX Runtime的CPU执行提供推理能力。条码检测这个任务本身模型不大,CPU推理单张图片大概500ms到800ms,完全在可接受范围内。

3.3 集成千问和DeepSeek的智能分析层

智能分析层是这个系统差异化价值最高的地方。简单说,就是让大模型理解检测结果,并且能跟用户对话。我用千问和DeepSeek做了双模型接入,主要考虑是不同任务的侧重点不同。

千问在中文理解和结构化分析上表现稳定,比如用户上传一张带有多个条码的商品图片,千问可以根据条码编号和图片内容自动推断商品类别,生成一句“共检测到3个条码,其中2个属于饮料类,1个属于零食类”这样的结论。DeepSeek在代码解释、数据推理和复杂逻辑上更强,适合做条码对应的生产批次追溯、异常检测、趋势分析这类需要多步推理的任务。

接入方式用官方OpenAI兼容接口。在SpringBoot里封装一个LlmClient,接口支持千问和DeepSeek两套API配置,通过配置文件切换。请求时把系统提示词和检测结果一起发给模型,系统提示词里明确角色设定和输出格式要求,比如要求模型必须返回JSON结构化的分析结果。这里有个要点:大模型的输出一定要做格式校验,模型偶尔会输出不完整或者格式跑偏的内容,解析失败时要做好降级,直接给用户返回检测结果而不是报错。

前端跟大模型的交互我用的是SSE或WebSocket。检测完成后,系统自动把结果推给前端并触发智能分析请求,分析结论逐字显示在对话气泡里,体感非常流畅。用户还可以追加提问,比如“这批条码对应的商品过期了吗”,后端收到问题后会重新组织上下文,连同检测结果一起发给大模型。

4. 前端交互界面与前后端联调

4.1 Vue3+Element Plus搭建交互界面

前端我选的是Vue3加Vite加Element Plus这套组合,交互主体的核心体验集中在三个页面:检测工作台、历史记录和分析报告。检测工作台负责图片上传、实时结果可视化;历史记录展示每次检测的图片、条码内容、耗时和状态;分析报告是由大模型生成的深度解读,展示在独立面板里。

图片上传组件我用的是Element Plus的el-upload,前端拿到上传完成的图片会先生成缩略图,然后立即调用检测接口。后端返回检测结果后,前端在图片上用Canvas叠加绘制检测框,框的颜色根据置信度动态变化,绿色表示高置信度,红色表示低置信度。绘制检测框这块建议直接用Canvas原生API,不要引额外的图像标注库,代码量不大但可控性强。

再提一个体验细节:条码内容通常是一串数字,前端解析出来后需要手动做一次可视化映射,比如从数据库或第三方API查出这个条码对应的商品名称、规格、价格,在检测框旁边展示一个信息浮层。这一步能极大提升系统的可用性,对仓储管理人员来说,看到的不是一串数字而是具体商品信息,工作效率完全不一样。

4.2 检测任务的状态管理与结果推流

实际开发中,前端的检测任务状态管理要比想象中复杂。我接手这个项目的第一个版本是用同步HTTP请求实现检测功能,每调一次接口浏览器要等两三秒,体验很差。后来改成了异步任务加WebSocket推送的架构,整个交互变成了这样:前端上传图片后立即进入“检测中”状态,后端返回taskId后,前端建立WebSocket连接并订阅这个taskId的结果通道。推理完成后,后端将结果推送到WebSocket通道,前端收到消息后自动切换状态并渲染结果。

这种异步架构的另一个好处是支持批量检测。用户一次性上传几十张图片,后端按队列依次处理,每处理完一张就推送一张的结果,前端可以做成流水线式的显示效果,用户能实时看到检测进度。

WebSocket的鉴权这里要提醒一下:不要在连接建立后再鉴权,而是应该在建立连接的HTTP握手阶段完成鉴权。我用的是在URL上附带一次性token的方式,token由后端在创建检测任务时生成,30秒内有效,过期需重新获取。这样即使鉴权逻辑有bug,攻击者也没办法随意订阅别人的检测结果。

4.3 前后端分离部署的关键配置

前后端分离看是两个项目,部署时的坑其实不少。前端构建出来的静态文件用nginx托管,nginx把以/api开头的请求反向代理到SpringBoot服务地址。这里有两个关键配置:一是静态资源缓存策略,index.html设置no-cache,构建出的带hash的JS和CSS文件设置一年缓存;二是代理超时时间,默认的60秒不够用,检测接口虽然在异步架构下不会长时间阻塞,但文件上传接口在大图场景下需要更长超时,建议设置到300秒。

跨域配置这边也要说清楚。开发环境下Vite代理转发到SpringBoot,生产环境下nginx代理转发,两层代理都只需要配置一次,关键是要统一前端调用路径的前缀。我用的是/api/v1作为所有接口的公共前缀,这样不管在哪层代理,规则都是同一个。

SpringBoot侧对应的配置是设置上下文根和CORS策略,如果你走的是nginx代理路径,SpringBoot侧可以不开启CORS,因为同源请求由nginx转发的时候已经不存在跨域问题了。我的建议是CORS在SpringBoot侧统一开启但严格限制来源,开发和生产环境分别维护一个allowlist,方便本地调试也防止恶意站点偷偷调用你的接口。

5. 系统部署、性能优化与常见问题

5.1 生产环境的部署方案

整条部署链路我用的是Docker Compose编排。模型推理、后端服务、前端静态文件、MySQL、Redis分成五个服务容器,通过docker-compose.yml统一管理。这里的核心是资源隔离,模型推理是CPU密集型,后端服务是IO密集型,混在一起跑会互相影响,Docker编排后可以用cpuset命令把推理容器限制在指定CPU核心上运行。

MySQL这里有个业务细节:检测结果表的数据增长很快,每天上万次的检测会产生大量记录,单表很容易到几百万行。我的方案是每个月自动建一张分表,以月份作为表名后缀,查询时通过中间件路由到对应的表。SpringBoot侧用定时任务在每个月的第一天自动执行建表SQL,省去了手动维护的麻烦。

Redis在这个系统里承担两个角色:一是检测任务的中间状态缓存,taskId对应的状态从PENDING到RUNNING再到COMPLETED都记录在Redis里,前端轮询状态时直接读Redis而不是查MySQL;二是大模型调用的上下文缓存,把常用条码的分析结果缓存一小时,减少重复调用大模型API的费用。

5.2 推理性能优化实践

性能优化这块我踩了不少坑,总结成几条硬经验。

第一,图片上传后不要直接丢给模型推理,先做预处理。步骤是:检查图片尺寸,超过模型输入尺寸的倍数就先做等比缩小;检查格式,统一转成RGB三通道;最后做归一化。这里有个容易忽略的点是图像方向,手机拍的图片容易带EXIF旋转信息,不处理的话模型看到的可能是倒着的图,检测结果自然对不上。

第二,SpringBoot加载ONNX模型时要用单例模式,整个应用生命周期内只初始化一次推理会话。ONNX Runtime的会话创建非常耗费资源,如果在每个请求里都初始化,性能直接崩掉。

第三,NMS后处理可以用Java自带的并行流来优化。单张图片可能有上千个候选框,串行过滤会浪费时间。把候选框按类别分组,然后分组并行执行NMS,能压缩三分之一的后处理耗时。

第四,如果机器上有可用的NVIDIA GPU,ONNX Runtime可以启用CUDA执行提供程序。配置方法是在创建会话时用OrtSession.SessionOptions配置CUDA,推理速度能提升5到10倍。但这里要特别注意CUDA版本和ONNX Runtime版本的匹配问题,我遇到过好多次因为驱动版本不匹配导致启动直接报错的情况,排错成本很高,所以生产环境建议先用CPU跑通整条链路,再考虑GPU加速。

5.3 常见问题排查实录

把我在项目里遇到的典型问题和排查思路整理成表格,方便大家对照排查。

问题现象可能原因排查思路与解决办法
检测框偏移严重锚框尺寸不匹配用k-means重新聚类锚框并训练
小条码漏检率高输入分辨率过低推理时输入尺寸升级到960或1280
推理速度很慢用了CPU执行提供程序有GPU就开启CUDA加速,没有就考虑模型轻量化
条码区域正了但解码失败图像畸变压缩了条码间距增加超分辨率预处理或换解码库
Java侧加载ONNX报错算子版本不兼容导出模型时指定更高的opset版本
WebSocket连接频繁断开代理超时或鉴权过期配置心跳机制,延长代理空闲超时
大模型返回格式混乱提示词约束力不够在提示词中明确JSON格式,并写解析容错逻辑
图片上传经常失败SpringBoot默认文件大小限制修改spring.servlet.multipart.max-file-size配置
检测结果和图片对不上异步任务乱序返回在结果中附带taskId和原图ID,前端做匹配过滤
内存占用持续增长ONNX Runtime没有释放检查是否每次请求都创建了新会话,改为单例复用

每个问题背后基本都有对应的架构或配置层面的原因,排查时不要只盯表面现象。比如WebSocket频繁断开,看起来是网络问题,实际可能是nginx的proxy_read_timeout默认60秒太短了,改成300秒就稳定了。

拉一个排查顺序的原则:先看配置再改代码,先看日志再猜原因。我一般会让前端把请求的完整链路日志带上,包含上传耗时、推理耗时和后处理耗时三段数据,这样就能快速定位瓶颈到底在哪一层,不用瞎猜。

5.4 上线前的功能自检清单

在正式交付之前,我习惯按下面的清单过一遍核心功能是否正常。

第一,检测链路完整性:上传一张标准条码图,确认前端能正常显示检测框,后端能正确解析条码内容,数据库能正确落库。

第二,异常处理与降级:故意上传一张模糊图片、一张包含多个条码的图片、一张没有条码的图片,确认系统不会崩溃,而是给出合理的提示或空结果。

第三,批量任务压力测试:准备50张测试图片批量上传,观察后端线程池是否稳定,内存是否在合理范围内,是否有任务丢失。

第四,并发场景模拟:用JMeter模拟10个用户同时发起检测请求,确认WebSocket连接数正常,接口响应时间没有明显恶化。

第五,大模型超时降级:把大模型API的响应时间调大模拟超时,确认前端会展示检测结果而非报错,系统不会因为这个环节卡死。

以上清单里的每一条我都实际在项目里踩过对应的问题,建议不要跳,特别是第二条,剪掉能省掉上线后大量的客诉。

写在最后

这套系统从初期搭建到上线稳定运行,我用了一年多的时间持续迭代。最大的体会是,基于YOLO和SpringBoot的组合去做检测类业务系统,技术栈非常成熟,出问题的概率极低。真正拉开差距的是工程层面的细节:异步任务架构设计是否合理、模型推理和业务服务的部署是否彻底隔离、大模型调用的容错是否做足。这些在技术文档里找不到现成答案,都是在实战中一步步趟出来的。

如果你正打算做类似的项目,我建议第一步先把数据集做好,这一步决定了模型的天花板;第二步用Python快速验证检测效果,不要一上来就跳进Java工程里写代码;第三步再考虑SpringBoot集成和前端交互。按这个顺序推进,踩坑的密度会小很多。最后再分享一个小技巧,模型导出为ONNX之后,先用Python配合onnxruntime重新推理一遍确认结果一致,再切换到Java侧,能帮你筛选掉一批框架绑定特有的bug。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询