java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java使用YOLO模型

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

作者:LeonDL168

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

在这里插入图片描述

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

1. 使用Deeplearning4j(DL4J)

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

步骤

<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>deeplearning4j-core</artifactId>
    <version>1.0.0-beta7</version>
</dependency>
// 加载模型
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);

优缺点

2. 通过OpenCV调用YOLO

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

步骤

<dependency>
    <groupId>org.openpnp</groupId>
    <artifactId>opencv</artifactId>
    <version>4.5.5-1</version>
</dependency>
// 加载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);

优缺点

3. 使用TensorFlow/ONNX部署YOLO

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

步骤

<dependency>
    <groupId>ai.onnxruntime</groupId>
    <artifactId>onnxruntime</artifactId>
    <version>1.13.1</version>
</dependency>
// 加载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);

优缺点

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

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

步骤

<dependency>
    <groupId>com.nvidia.developer</groupId>
    <artifactId>tensorrt</artifactId>
    <version>8.5.3.1</version>
</dependency>
// 加载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();
// 执行推理和后处理...

优缺点

5. 通过REST API调用Python服务

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

步骤

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())
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中使用YOLO模型的几种方式详解的详细内容,更多关于Java使用YOLO模型的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文