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

10 分钟学会:Java 调用 YOLO 模型全流程

很多刚接触计算机视觉的同学都有个误区:“YOLO只能用Python跑”,其实Java调用YOLO模型的流程远比想象中简单——不用复杂的工程化配置,不用懂底层原理,跟着这篇教程走,10分钟就能完成从模型转换到Java调用的全流程,新手也能一次跑通。

本文全程聚焦“最小可行方案”,剔除所有冗余的工业级配置,只保留核心步骤:模型转换(1分钟)→ 环境准备(2分钟)→ 代码编写(4分钟)→ 测试验证(1分钟)→ 避坑指南(2分钟),真正做到“10分钟上手”。

一、前置认知:Java调用YOLO的核心逻辑

先花1分钟搞懂核心原理,避免盲目敲代码:
YOLO官方提供的是Python版本的模型(.pt格式),Java无法直接识别,所以核心流程是:
YOLO .pt模型 → 转换为ONNX格式 → Java通过ONNX Runtime调用ONNX模型 → 解析检测结果
整个过程就3个核心角色:

  • ONNX模型:通用的模型格式,跨语言兼容;
  • ONNX Runtime Java:Java端的推理引擎,负责执行ONNX模型;
  • OpenCV Java:负责图片预处理(缩放、归一化)。

二、第一步:模型转换(1分钟)

这一步用Python完成(Python做模型转换效率最高,没必要用Java硬刚),新手直接复制命令即可:

1. 安装依赖

pipinstallultralytics

2. 转换YOLO模型为ONNX

新建convert_yolo2onnx.py文件,复制以下代码(以YOLOv8为例,新手用轻量化的yolov8n.pt即可):

# convert_yolo2onnx.pyfromultralyticsimportYOLO# 加载官方预训练的YOLOv8n模型(轻量化,适合新手测试)model=YOLO('yolov8n.pt')# 导出为ONNX格式(动态批次,新手不用改参数)model.export(format='onnx',dynamic=True,imgsz=640)

3. 执行转换

python convert_yolo2onnx.py

执行完成后,会在当前目录生成yolov8n.onnx文件——这就是Java能识别的模型文件,把它保存好(后续要放到Java项目里)。

三、第二步:Java环境准备(2分钟)

1. 新建Maven项目

打开IDEA/Eclipse,新建一个普通Maven项目,无需SpringBoot,纯Java项目即可(新手先跑通核心逻辑,再扩展框架)。

2. 配置pom.xml依赖

复制以下依赖到pom.xml,核心只需要3个:ONNX Runtime、OpenCV、SLF4J(日志,可选):

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>java-yolo-demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- ONNX Runtime Java(核心推理引擎) --><dependency><groupId>com.microsoft.onnxruntime</groupId><artifactId>onnxruntime</artifactId><version>1.15.1</version></dependency><!-- OpenCV Java(图片预处理) --><dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.7.0-0</version></dependency><!-- 日志(可选,方便看输出) --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>2.0.7</version></dependency></dependencies><build><plugins><!-- Java版本指定(新手用1.8即可) --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build></project>

刷新Maven依赖,等待下载完成(如果下载慢,可换阿里云镜像)。

3. 放置模型文件

在Java项目的src/main/resources目录下新建model文件夹,把第一步生成的yolov8n.onnx放进去。

四、第三步:核心代码编写(4分钟)

新建YoloJavaDemo.java文件,复制以下完整代码(注释写满,新手能看懂每一步):

importai.onnxruntime.*;importorg.opencv.core.*;importorg.opencv.imgcodecs.Imgcodecs;importorg.opencv.imgproc.Imgproc;importjava.nio.FloatBuffer;importjava.util.*;/** * Java调用YOLOv8核心代码 * 新手直接复制,只需修改图片路径即可运行 */publicclassYoloJavaDemo{// YOLO核心参数(新手不用改)privatestaticfinalintINPUT_SIZE=640;// 输入图片尺寸privatestaticfinalfloatCONF_THRESHOLD=0.5f;// 置信度阈值(只保留>50%的检测结果)privatestaticfinalfloatNMS_THRESHOLD=0.45f;// 非极大值抑制阈值// COCO类别(YOLOv8默认检测80类,新手不用改)privatestaticfinalList<String>CLASS_NAMES=Arrays.asList("person","bicycle","car","motorcycle","airplane","bus","train","truck","boat","traffic light","fire hydrant","stop sign","parking meter","bench","bird","cat","dog","horse","sheep","cow","elephant","bear","zebra","giraffe","backpack","handbag","umbrella","tie","suitcase","frisbee","skis","snowboard","sports ball","kite","baseball bat","baseball glove","skateboard","surfboard","tennis racket","bottle","wine glass","cup","fork","knife","spoon","bowl","banana","apple","sandwich","orange","broccoli","carrot","hot dog","pizza","donut","cake","chair","couch","potted plant","bed","dining table","toilet","tv","laptop","mouse","remote","keyboard","cell phone","microwave","oven","toaster","sink","refrigerator","book","clock","vase","scissors","teddy bear","hair drier","toothbrush");publicstaticvoidmain(String[]args){// 1. 初始化(加载OpenCV和ONNX模型)try{// 加载OpenCV原生库System.loadLibrary(Core.NATIVE_LIBRARY_NAME);// 初始化ONNX环境OrtEnvironmentenv=OrtEnvironment.getEnvironment();OrtSession.SessionOptionsoptions=newOrtSession.SessionOptions();// 加载模型(路径对应resources/model/yolov8n.onnx)StringmodelPath=YoloJavaDemo.class.getClassLoader().getResource("model/yolov8n.onnx").getPath();OrtSessionsession=env.createSession(modelPath,options);System.out.println("模型加载成功!");// 2. 加载测试图片(新手修改这里的图片路径!)StringimgPath="test.jpg";// 替换为你的测试图片路径(如D:/test.jpg)MatsrcMat=Imgcodecs.imread(imgPath);if(srcMat.empty()){System.out.println("图片加载失败,请检查路径!");return;}// 3. 图片预处理(YOLO要求的格式)MatresizedMat=newMat();// 缩放图片到640x640Imgproc.resize(srcMat,resizedMat,newSize(INPUT_SIZE,INPUT_SIZE));// 归一化:0-255 → 0-1resizedMat.convertTo(resizedMat,CvType.CV_32FC3,1.0/255.0);// 转置:HWC(高宽通道)→ CHW(通道高宽),YOLO要求的输入格式float[]inputData=transposeMat(resizedMat);// 4. 构造ONNX输入long[]inputShape={1,3,INPUT_SIZE,INPUT_SIZE};// batch=1, 3通道, 640x640OrtTensorinputTensor=OrtTensor.createTensor(env,FloatBuffer.wrap(inputData),inputShape);Map<String,OrtTensor>inputs=newHashMap<>();inputs.put("images",inputTensor);// 输入名称要和ONNX模型一致(YOLOv8默认是images)// 5. 执行推理longstartTime=System.currentTimeMillis();OrtSession.Resultresult=session.run(inputs);float[][]outputData=((float[][])result.get(0).getValue());longcostTime=System.currentTimeMillis()-startTime;System.out.println("推理完成,耗时:"+costTime+"ms");// 6. 解析检测结果List<DetectionResult>results=postProcess(outputData,srcMat.width(),srcMat.height());// 7. 打印结果(新手重点看这里!)System.out.println("检测结果:");for(DetectionResultdr:results){System.out.println("类别:"+dr.className+",置信度:"+String.format("%.2f",dr.confidence)+",位置:x="+dr.x+", y="+dr.y+", 宽="+dr.width+", 高="+dr.height);}// 8. 释放资源(避免内存泄漏)inputTensor.close();result.close();session.close();env.close();srcMat.release();resizedMat.release();}catch(Exceptione){e.printStackTrace();}}/** * 图片转置:HWC → CHW */privatestaticfloat[]transposeMat(Matmat){float[]chwData=newfloat[3*INPUT_SIZE*INPUT_SIZE];intidx=0;for(intc=0;c<3;c++){for(inth=0;h<INPUT_SIZE;h++){for(intw=0;w<INPUT_SIZE;w++){chwData[idx++]=(float)mat.get(h,w)[c];}}}returnchwData;}/** * 后处理:解析推理结果,过滤低置信度,NMS去重 */privatestaticList<DetectionResult>postProcess(float[][]output,intsrcWidth,intsrcHeight){List<DetectionResult>results=newArrayList<>();// YOLOv8输出格式:[8400, 84] → 8400个检测框,84=4个坐标+80个类别float[][]boxes=newfloat[output.length][4];float[][]scores=newfloat[output.length][CLASS_NAMES.size()];// 提取坐标和类别得分for(inti=0;i<output.length;i++){boxes[i][0]=output[i][0];// x1boxes[i][1]=output[i][1];// y1boxes[i][2]=output[i][2];// x2boxes[i][3]=output[i][3];// y2System.arraycopy(output[i],4,scores[i],0,CLASS_NAMES.size());}// NMS非极大值抑制(去掉重复的检测框)MatOfFloatconfidences=newMatOfFloat();MatOfIntindices=newMatOfInt();MatOfRect2dbboxes=newMatOfRect2d();for(intcls=0;cls<CLASS_NAMES.size();cls++){List<Float>confList=newArrayList<>();List<Rect2d>boxList=newArrayList<>();// 过滤低置信度的框for(inti=0;i<output.length;i++){floatscore=scores[i][cls];if(score>CONF_THRESHOLD){// 还原坐标到原始图片尺寸floatx1=boxes[i][0]/INPUT_SIZE*srcWidth;floaty1=boxes[i][1]/INPUT_SIZE*srcHeight;floatx2=boxes[i][2]/INPUT_SIZE*srcWidth;floaty2=boxes[i][3]/INPUT_SIZE*srcHeight;boxList.add(newRect2d(x1,y1,x2-x1,y2-y1));confList.add(score);}}// 执行NMSif(!boxList.isEmpty()){bboxes.fromList(boxList);confidences.fromList(confList);Imgproc.dnn.NMSBoxes(bboxes,confidences,CONF_THRESHOLD,NMS_THRESHOLD,indices);// 解析NMS结果int[]indicesArr=indices.toArray();for(intidx:indicesArr){Rect2dbox=boxList.get(idx);results.add(newDetectionResult(CLASS_NAMES.get(cls),confList.get(idx),box.x,box.y,box.width,box.height));}}}// 释放Mat资源confidences.release();indices.release();bboxes.release();returnresults;}/** * 检测结果实体类(新手不用改) */staticclassDetectionResult{StringclassName;// 类别名称floatconfidence;// 置信度doublex;// 左上角x坐标doubley;// 左上角y坐标doublewidth;// 宽度doubleheight;// 高度publicDetectionResult(StringclassName,floatconfidence,doublex,doubley,doublewidth,doubleheight){this.className=className;this.confidence=confidence;this.x=x;this.y=y;this.width=width;this.height=height;}}}

五、第四步:测试验证(1分钟)

1. 准备测试图片

找一张包含常见物体的图片(如有人、车、杯子的图片),重命名为test.jpg,放到项目根目录(或修改代码里的imgPath为绝对路径,如D:/test.jpg)。

2. 运行代码

直接运行YoloJavaDemomain方法,控制台会输出:

模型加载成功! 推理完成,耗时:35ms 检测结果: 类别:person,置信度:0.98,位置:x=120.5, y=80.2, 宽=60.3, 高=180.1 类别:cup,置信度:0.92,位置:x=300.1, y=200.8, 宽=15.2, 高=20.5

看到这个输出,说明Java调用YOLO模型成功了!

六、新手避坑指南(2分钟)

  1. 图片加载失败:检查图片路径是否正确,绝对路径要用/(如D:/test.jpg),不要用\
  2. 模型加载失败:确认yolov8n.onnx放在resources/model目录下,Maven项目要刷新资源;
  3. OpenCV库加载失败:如果报UnsatisfiedLinkError,手动下载对应系统的OpenCV库,放到项目根目录,或指定库路径:
    System.setProperty("java.library.path","你的OpenCV库路径");
  4. 推理结果为空:降低CONF_THRESHOLD(如改为0.3),可能是置信度阈值太高过滤了结果;
  5. 输入名称错误:如果报No such input: images,检查ONNX模型的输入名称(YOLOv8默认是images,YOLOv5是imagesinput)。

七、总结

关键点回顾

  1. Java调用YOLO的核心是先将.pt模型转为ONNX格式,再通过ONNX Runtime执行推理;
  2. 完整流程:模型转换 → 环境准备 → 图片预处理 → 模型推理 → 结果解析,新手只需按步骤复制代码、修改图片路径即可跑通;
  3. 新手避坑重点:路径正确、OpenCV库加载、置信度阈值调整。

这篇教程聚焦“最小可行方案”,10分钟就能跑通核心流程。如果想进一步扩展(如集成SpringBoot、做接口、工业级优化),可以参考我之前的文章,但新手先把这个基础流程跑通,再逐步进阶。

其实Java调用YOLO一点都不难,核心是找对方法,避开新手坑——希望这篇教程能帮你快速入门,不用再局限于Python调用YOLO!

http://www.jsqmd.com/news/378445/

相关文章:

  • .NET 中优雅处理 Server-Sent Events 请求取消
  • 分析可靠的全屋定制板材生产企业,云贵川哪家性价比高 - 工业品牌热点
  • 批发商服务能力如何评估?2026年外墙保温板批发商推荐与排名,应对物流与质量一致性痛点 - 品牌推荐
  • 西南地区杰家板材好吗,用户真实口碑大分享 - myqiye
  • 互联网大厂Java面试实录:微服务架构与AI技术场景深度解析
  • 2026年广州网络安全专利AI、环保技术专利AI布局、医疗器械专利AI品牌推荐 - mypinpai
  • 跨境电商、印刷快消、旅游、金融、互联网全行业图片素材网站推荐 - 品牌2026
  • 首信保险代理斩获普惠金融助力机构奖 科技赋能民生保障 - 包罗万闻
  • 【免费源码】WP 链接检测插件免费下载(弹窗版本)
  • 2026年环保设备靠谱公司排名,细聊官方纽英其设备口碑和公司情况 - 工业品网
  • 2026年2月外墙保温板批发商推荐:权威三维评测榜单揭晓 - 品牌推荐
  • 深聊郑州点泰景观设计,在行业知名度、实力以及性价比表现 - 工业设备
  • 聊聊口碑好的360航空软包汽车脚垫,售后完善渠道机构分析 - 工业品网
  • 2026年四川灭鼠厂家权威榜单及选型指南 覆盖家庭等全场景 适配各类鼠患治理需求 - 深度智识库
  • 说说时代蜂族车位代理销售,合作效果、前景及管理服务哪家好 - 工业推荐榜
  • 开源AI编码代理OpenCode的技术架构与特性
  • 分期乐闲置购物额度别浪费!可可收教你合规回收,解锁闲置价值 - 可可收
  • 设计师、美工、运营必备的十大正版素材网站推荐,2026年2月最新 - 品牌2026
  • 应用安全 --- 应知应会 之 函数分类
  • AI图片视频数据集训练素材供应商推荐,卓特视觉(Droitstock)赋能企业AI训练 - 品牌2026
  • 说说香蜜湖一号房产租赁,哪家品牌靠谱且性价比高? - 工业品牌热点
  • 2026年四川病媒生物检测哪家靠谱?专业可靠实力厂家全解析 多场景适配 - 深度智识库
  • 2026重庆会展策划公司排行榜:谁在引领行业新高度 - 深度智识库
  • 2026年外墙保温板批发商推荐:基于供应链调研的供应商能力深度解析 - 品牌推荐
  • 江西新华电脑学院线上报名入口在哪,职业素养培养怎样? - 工业推荐榜
  • 聊聊广州靠谱的专利申请服务公司,该怎么选择 - myqiye
  • Markdown学习笔记之表格
  • 谷人说谷物茶饮:靠谱加盟优选,以健康创新突围茶饮市场 - 品牌策略主理人
  • 2026年剖析便携式打印机精品定制,广州靠谱供应商怎么选择? - mypinpai
  • 解读成都服务优异电工证培训机构,成都筑信职业技能培训学校领衔 - 深度智识库