在Java中使用YOLO模型的几种方式详解

 更新时间:2025年06月26日 09:47:21   作者:LeonDL168  
Yolo是一种基于深度学习的目标检测算法,它可以在一张图像中同时检测出多个目标,并给出它们的位置和类别,相比于传统的目标检测算法,Yolo算法具有检测速度快、精度高等优点,本文给大家介绍了在Java中使用YOLO模型的几种方式,需要的朋友可以参考下

在这里插入图片描述

在Java中使用YOLO(You Only Look Once)目标检测模型,主要有以下几种方式,各有其特点和适用场景:

1. 使用Deeplearning4j(DL4J)

特点:纯Java深度学习框架,支持直接加载Darknet(YOLO原始框架)模型。

步骤

  • 转换模型:将YOLO的.cfg.weights文件转换为DL4J支持的格式(如.zip)。
  • 依赖添加
<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>deeplearning4j-core</artifactId>
    <version>1.0.0-beta7</version>
</dependency>
  • Java代码示例
// 加载模型
ComputationGraph model = ModelSerializer.restoreComputationGraph("path/to/model.zip");

// 图像预处理
INDArray image = ImagePreProcessingScaler.scaleImageToTensor("path/to/image.jpg", 416, 416);

// 模型预测
INDArray output = model.outputSingle(image);

// 后处理(解析边界框、置信度等)
List<Detection> detections = parseYOLOOutput(output);

优缺点

  • 优点:纯Java实现,无需外部依赖,适合集成到Java项目中。
  • 缺点:性能可能不如原生框架,模型转换过程较复杂。

2. 通过OpenCV调用YOLO

特点:利用OpenCV的DNN模块直接加载预训练的YOLO模型。

步骤

  • 依赖添加
<dependency>
    <groupId>org.openpnp</groupId>
    <artifactId>opencv</artifactId>
    <version>4.5.5-1</version>
</dependency>
  • Java代码示例
// 加载OpenCV库
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

// 加载YOLO模型
Net net = Dnn.readNetFromDarknet("yolov5.cfg", "yolov5.weights");
net.setPreferableBackend(Dnn.DNN_BACKEND_OPENCV);
net.setPreferableTarget(Dnn.DNN_TARGET_CPU);

// 读取图像并预处理
Mat image = Imgcodecs.imread("path/to/image.jpg");
Mat blob = Dnn.blobFromImage(image, 1/255.0, new Size(416, 416), 
                            new Scalar(0,0,0), true, false);

// 前向传播
net.setInput(blob);
List<Mat> outputs = new ArrayList<>();
net.forward(outputs, getOutputsNames(net));

// 后处理
postProcess(image, outputs);

优缺点

  • 优点:OpenCV提供高效的图像处理能力,支持GPU加速(需配置CUDA)。
  • 缺点:需安装OpenCV原生库,依赖管理较复杂。

3. 使用TensorFlow/ONNX部署YOLO

特点:将YOLO转换为TensorFlow或ONNX格式,通过Java API调用。

步骤

  • 转换模型:将YOLO模型转换为TensorFlow SavedModel或ONNX格式。
  • 依赖添加(以ONNX Runtime为例)
<dependency>
    <groupId>ai.onnxruntime</groupId>
    <artifactId>onnxruntime</artifactId>
    <version>1.13.1</version>
</dependency>
  • Java代码示例
// 加载ONNX模型
OrtEnvironment env = OrtEnvironment.getEnvironment();
OrtSession session = env.createSession("yolov5.onnx", new OrtSession.SessionOptions());

// 图像预处理
float[][][][] input = preprocessImage("path/to/image.jpg");

// 模型推理
Map<String, OnnxTensor> inputs = new HashMap<>();
inputs.put("images", OnnxTensor.createTensor(env, input));
OrtSession.Result results = session.run(inputs);

// 后处理
processResults(results);

优缺点

  • 优点:TensorFlow/ONNX生态成熟,支持跨平台部署,可利用TensorRT加速。
  • 缺点:模型转换需额外工具(如ultralytics库),需了解不同框架的API。

4. 使用TensorRT Java API(高性能场景)

特点:针对NVIDIA GPU进行深度优化,适合高性能部署。

步骤

  • 转换模型:将YOLO转换为TensorRT引擎(.engine)。
  • 依赖添加
<dependency>
    <groupId>com.nvidia.developer</groupId>
    <artifactId>tensorrt</artifactId>
    <version>8.5.3.1</version>
</dependency>
  • Java代码示例
// 加载TensorRT引擎
Logger logger = new Logger();
Runtime runtime = Runtime.createRuntime(logger);
ICudaEngine engine = runtime.deserializeCudaEngine(ByteBuffer.wrap(Files.readAllBytes(Paths.get("yolov5.engine"))));

// 创建执行上下文并推理
IExecutionContext context = engine.createExecutionContext();
// 执行推理和后处理...

优缺点

  • 优点:极致的GPU性能,适合实时视频流处理。
  • 缺点:仅支持NVIDIA GPU,部署环境要求高,开发复杂度大。

5. 通过REST API调用Python服务

特点:将YOLO模型封装为Python REST服务,Java通过HTTP调用。

步骤

  • Python服务端(Flask/FastAPI)
from flask import Flask, request, jsonify
import cv2
import torch

app = Flask(__name__)
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')

@app.route('/detect', methods=['POST'])
def detect():
    file = request.files['image']
    img = cv2.imdecode(np.frombuffer(file.read(), np.uint8), cv2.IMREAD_COLOR)
    results = model(img)
    return jsonify(results.pandas().xyxy[0].to_dict())
  • Java客户端
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("http://localhost:5000/detect"))
    .POST(MultipartBodyPublisher.of("image", Path.of("path/to/image.jpg")))
    .build();

HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
// 解析JSON结果

优缺点

  • 优点:避免Java直接处理复杂的深度学习依赖,分工清晰。
  • 缺点:网络通信开销,依赖Python服务稳定性。

选择建议

  • 初学者/轻量级应用:优先考虑OpenCV或REST API方式。
  • 企业级Java项目:使用DL4J或ONNX Runtime,减少外部依赖。
  • 高性能场景:TensorRT(GPU)或OpenCV(支持CUDA)。

根据具体需求权衡开发复杂度、性能和部署环境,选择最适合的方案。

以上就是在Java中使用YOLO模型的几种方式详解的详细内容,更多关于Java使用YOLO模型的资料请关注脚本之家其它相关文章!

相关文章

  • Java 实现 ReAct Agent工具调用与推理循环的过程

    Java 实现 ReAct Agent工具调用与推理循环的过程

    文章介绍了Agent的概念,与普通LLM的区别,并详细讲解了ReAct模式,包括定义工具、ReAct Prompt模板、构建推理循环和工具执行逻辑,还对比了j-langchain和LangChain Python的特点,强调了j-langchain的透明度和可调试性
    2026-04-04
  • Java并发编程示例(二):获取和设置线程信息

    Java并发编程示例(二):获取和设置线程信息

    这篇文章主要介绍了Java并发编程示例(二):获取和设置线程信息,本文是系列文章的第二篇,本文着重讲解Thread类的几个重要属性,需要的朋友可以参考下
    2014-12-12
  • jar包在windows后台运行,通过.bat文件实现

    jar包在windows后台运行,通过.bat文件实现

    文章主要讲解了在Windows后台运行JAR包的方法,通过创建启动.bat和停止.bat文件,使用javaw方式运行JAR包,可以在关闭cmd界面后仍然保持程序运行,提供了启动.bat和停止.bat的具体内容
    2026-04-04
  • Retrofit+RxJava实现带进度条的文件下载

    Retrofit+RxJava实现带进度条的文件下载

    这篇文章主要为大家详细介绍了Retrofit+RxJava实现带进度条的文件下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Java通过exchange协议发送邮件

    Java通过exchange协议发送邮件

    这篇文章主要为大家详细介绍了Java通过exchange协议发送邮件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Java排序算法中的冒泡排序算法实现

    Java排序算法中的冒泡排序算法实现

    这篇文章主要介绍了Java排序算法中的冒泡排序算法实现,冒泡排序只会操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足就让它俩互换,需要的朋友可以参考下
    2023-12-12
  • SpringBoot3 框架快速搭建与项目工程详解

    SpringBoot3 框架快速搭建与项目工程详解

    本文将从项目搭建、核心配置、分层开发、统一返回与异常处理等维度,详细讲解SpringBoot3项目的构建与工程设计,帮助开发者快速上手,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • IDEA2024下安装kubernetes插件配置进行使用的方法

    IDEA2024下安装kubernetes插件配置进行使用的方法

    IDEA中默认已安装Kubernetes插件,若未发现,可在市场下载,安装后,需准备config文件和kubectl.exe,进行路径配置,可在Workloads-prod下查看和下载目标容器日志,本文介绍IDEA2024下安装kubernetes插件并配置进行使用,感兴趣的朋友一起看看吧
    2024-11-11
  • SpringMVC中处理静态资源的过程详解

    SpringMVC中处理静态资源的过程详解

    本文给大家介绍SpringMVC中处理静态资源的过程,结合示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • 一文系统梳理Java中字符串比较的高频误区

    一文系统梳理Java中字符串比较的高频误区

    本文围绕 Java 字符串比较中的高频误区展开,系统梳理 ==、equals()、字符串常量池、new String()、编译期与运行期拼接、final 常量折叠以及 intern() 的核心规则,希望帮助 Java 初学者真正理解 String 比较背后的引用关系与常见踩坑点
    2026-05-05

最新评论