大家好,我是威哥,在工业上位机开发领域摸爬滚打了十年。前两年做产线智能检测项目时,最头疼的就是目标检测模块的部署:用Python写YOLO确实快,但放到Windows工控机上,CPU推理慢得像蜗牛,GPU加速又要装一堆CUDA依赖,客户现场环境复杂,经常出问题。后来被逼无奈,转用Java+ONNX Runtime这套方案,没想到效果出奇的好——不仅推理速度提上去了,部署也超简单,客户现场只要有JDK就能跑。今天就把这套经过实战验证的方案分享给大家,从环境搭建到模型推理,再到性能优化,一步一步讲透。项目背景与痛点先说说为什么要做这个。去年我接了个汽车零部件产线的螺丝缺陷检测项目,要求实时检测传送带上的螺丝,识别滑牙、缺牙等缺陷,检测速度要达到30帧/秒,准确率95%以上。一开始我用Python+YOLOv8写了原型,在自己的开发机上(RTX 3060)跑得挺顺,一到客户现场的工控机(i7-10700,无GPU)就傻了——每帧推理要200ms,连10帧都达不到,完全满足不了实时性要求。而且客户现场的工控机不能随便装软件,Python环境、CUDA依赖这些部署起来太麻烦,客户IT部门天天找我麻烦。那时候我就想,要是能用Java实现YOLO推理就好了——工业界的上位机基本都是用Java或C#写的,JDK环境肯定有,部署起来零成本。说干就干,我开始研究Java调用YOLO的方案,试了JavaCV+Darknet,也试了ONNX Runtime,最后选了ONNX Runtime——轻量、高效、跨平台,完美契合工业场景的需求。技术选型选对技术栈,项目就成功了一半。我给大家梳理一下这套方案的核心技术:Java语言:不用多说,工业界标配,跨平台,生态成熟,和现有上位机系统集成方便。ONNX Runtime:微软开源的推理引擎,支持CPU/GPU加速,Java API封装得很好,调用简单,性能比原生Darknet还强。YOLOv8/YOLOv11:目前最流行的目标检测模型,精度高,速度快,导出ONNX格式超方便。JavaCV:用于视频流采集和图像处理,封装了FFmpeg和OpenCV,读取RTSP流、USB摄像头都不在话下。为什么选ONNX Runtime而不是JavaCV+Darknet?主要有三个原因:性能更好:ONNX Runtime有各种优化(比如算子融合、内存优化),CPU推理速度比Darknet快30%以上。部署更简单:Darknet要编译本地库,Windows/Linux/macOS都要单独编译,麻烦得很;ONNX Runtime直接加Maven依赖就行,跨平台无缝切换。模型支持更好:YOLOv8、v11这些新模型导出ONNX就能用,Darknet还要转权重,容易出问题。系统架构给大家画一下这套系统的架构图,一目了然:视频流采集层RTSP/USB摄像头帧预处理层Resize/归一化/CHW转换推理层ONNX Runtime + YOLOv8后处理层NMS/坐标映射展示层JavaFX画框展示模型文件yolov8s.onnx整个流程分为五层:视频流采集层:用JavaCV读取RTSP流或USB摄像头,获取视频帧。帧预处理层:将视频帧resize到模型输入尺寸(比如640x640),做归一化,把HWC格式转成CHW格式(PyTorch训练的模型都是CHW输入)。推理层:用ONNX Runtime加载YOLOv8的ONNX模型,执行推理,得到输出Tensor。后处理层:解析输出Tensor,得到检测框、置信度、类别ID,应用NMS去除重复框,把坐标映射回原图尺寸。展示层:用JavaFX在原图上画检测框和标签,实时展示结果。环境准备先把环境搭起来,我用的是JDK 11,Maven项目,大家可以参考一下。首先是Maven依赖,把这些加到pom.xml里:dependencies!-- ONNX Runtime --dependencygroupIdcom.microsoft.onnxruntime/groupIdartifactIdonnxruntime/artifactIdversion1.18.0/version/dependency!-- JavaCV --dependencygroupIdorg.bytedeco/groupIdartifactIdjavacv-platform/artifactIdversion1.5.10/version/dependency!-- JavaFX (用于展示) --dependencygroupIdorg.openjfx/groupIdartifactIdjavafx-controls/artifactIdversion17.0.2/version/dependencydependencygroupIdorg.openjfx/groupIdartifactIdjavafx-graphics/artifactIdversion17.0.2/version/dependency/dependencies这里要注意ONNX Runtime的版本,1.18.0是目前比较稳定的版本,JavaCV用1.5.10,支持最新的FFmpeg和OpenCV。然后是模型准备,大家可以用YOLOv8s(小模型,速度快),先在PyTorch里训练好,然后导出ONNX格式:fromultralyticsimportYOLO# 加载模型model=YOLO("yolov8s.pt")# 导出ONNX,设置input shape为(1, 3, 640, 640)model.export(format="onnx",imgsz=640,batch=1)导出后会得到yolov8s.onnx文件,把它放到项目的resources目录下。核心实现步骤环境搭好,模型准备好,现在开始写代码。我把核心步骤拆成了7个部分,大家跟着一步一步来。1. 加载ONNX模型首先用ONNX Runtime加载模型,创建InferenceSession:importai.