在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 超详细讲解设计模式之中的建造者模式

    Java 超详细讲解设计模式之中的建造者模式

    建造者模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。本文将通过示例讲解建造者模式,需要的可以参考一下
    2022-03-03
  • 使用Spring Boot轻松实现流式AI输出的步骤

    使用Spring Boot轻松实现流式AI输出的步骤

    本文介绍了如何使用Spring Boot和WebFlux实现流式AI输出,通过非阻塞I/O、反应式编程和函数式路由等技术,优化了AI应用的响应速度,提升了用户体验,感兴趣的朋友一起看看吧
    2025-02-02
  • Java静态代码块加载驱动代码实例

    Java静态代码块加载驱动代码实例

    这篇文章主要介绍了Java静态代码块加载驱动代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot零基础入门之基本操作与概念

    SpringBoot零基础入门之基本操作与概念

    这篇文章主要介绍了SpringBoot的概念、创建和运行,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Spring AOP的使用详解

    Spring AOP的使用详解

    这篇文章主要介绍了Spring AOP的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • idea项目debug模式无法启动的解决

    idea项目debug模式无法启动的解决

    这篇文章主要介绍了idea项目debug模式无法启动的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringMVC文件上传中要解决的问题大汇总

    SpringMVC文件上传中要解决的问题大汇总

    这篇文章主要介绍了SpringMVC文件上传中要解决的问题,主要有中文文件名编码问题,文件位置存储问题以及文件名冲突问题等等,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 深入理解JVM之类加载机制详解

    深入理解JVM之类加载机制详解

    这篇文章主要介绍了深入理解JVM之类加载机制,结合实例形式详细分析了类加载机制原理、过程及相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • SkyWalking自定义链路追踪实现步骤

    SkyWalking自定义链路追踪实现步骤

    本文详细介绍了如何使用SkyWalking进行自定义链路追踪的步骤,包括POM文件依赖和逻辑业务代码的编写,文章最后推荐了脚本之家作为进一步学习的资源
    2024-02-02
  • IntelliJ IDEA 安装教程2019.09.23(最新版)

    IntelliJ IDEA 安装教程2019.09.23(最新版)

    本文通过图文并茂的形式给大家介绍了IntelliJ IDEA 安装教程2019.09.23最新版,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10

最新评论