在Java中使用YOLO模型的幾種方式詳解

在Java中使用YOLO(You Only Look Once)目標(biāo)檢測模型,主要有以下幾種方式,各有其特點和適用場景:
1. 使用Deeplearning4j(DL4J)
特點:純Java深度學(xué)習(xí)框架,支持直接加載Darknet(YOLO原始框架)模型。
步驟:
- 轉(zhuǎn)換模型:將YOLO的
.cfg和.weights文件轉(zhuǎn)換為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");
// 圖像預(yù)處理
INDArray image = ImagePreProcessingScaler.scaleImageToTensor("path/to/image.jpg", 416, 416);
// 模型預(yù)測
INDArray output = model.outputSingle(image);
// 后處理(解析邊界框、置信度等)
List<Detection> detections = parseYOLOOutput(output);
優(yōu)缺點:
- 優(yōu)點:純Java實現(xiàn),無需外部依賴,適合集成到Java項目中。
- 缺點:性能可能不如原生框架,模型轉(zhuǎn)換過程較復(fù)雜。
2. 通過OpenCV調(diào)用YOLO
特點:利用OpenCV的DNN模塊直接加載預(yù)訓(xùn)練的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);
// 讀取圖像并預(yù)處理
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);
優(yōu)缺點:
- 優(yōu)點:OpenCV提供高效的圖像處理能力,支持GPU加速(需配置CUDA)。
- 缺點:需安裝OpenCV原生庫,依賴管理較復(fù)雜。
3. 使用TensorFlow/ONNX部署YOLO
特點:將YOLO轉(zhuǎn)換為TensorFlow或ONNX格式,通過Java API調(diào)用。
步驟:
- 轉(zhuǎn)換模型:將YOLO模型轉(zhuǎn)換為TensorFlow SavedModel或ONNX格式。
- 依賴添加(以O(shè)NNX 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());
// 圖像預(yù)處理
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);
優(yōu)缺點:
- 優(yōu)點:TensorFlow/ONNX生態(tài)成熟,支持跨平臺部署,可利用TensorRT加速。
- 缺點:模型轉(zhuǎn)換需額外工具(如
ultralytics庫),需了解不同框架的API。
4. 使用TensorRT Java API(高性能場景)
特點:針對NVIDIA GPU進(jìn)行深度優(yōu)化,適合高性能部署。
步驟:
- 轉(zhuǎn)換模型:將YOLO轉(zhuǎn)換為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"))));
// 創(chuàng)建執(zhí)行上下文并推理
IExecutionContext context = engine.createExecutionContext();
// 執(zhí)行推理和后處理...
優(yōu)缺點:
- 優(yōu)點:極致的GPU性能,適合實時視頻流處理。
- 缺點:僅支持NVIDIA GPU,部署環(huán)境要求高,開發(fā)復(fù)雜度大。
5. 通過REST API調(diào)用Python服務(wù)
特點:將YOLO模型封裝為Python REST服務(wù),Java通過HTTP調(diào)用。
步驟:
- Python服務(wù)端(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結(jié)果
優(yōu)缺點:
- 優(yōu)點:避免Java直接處理復(fù)雜的深度學(xué)習(xí)依賴,分工清晰。
- 缺點:網(wǎng)絡(luò)通信開銷,依賴Python服務(wù)穩(wěn)定性。
選擇建議
- 初學(xué)者/輕量級應(yīng)用:優(yōu)先考慮OpenCV或REST API方式。
- 企業(yè)級Java項目:使用DL4J或ONNX Runtime,減少外部依賴。
- 高性能場景:TensorRT(GPU)或OpenCV(支持CUDA)。
根據(jù)具體需求權(quán)衡開發(fā)復(fù)雜度、性能和部署環(huán)境,選擇最適合的方案。
以上就是在Java中使用YOLO模型的幾種方式詳解的詳細(xì)內(nèi)容,更多關(guān)于Java使用YOLO模型的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java?超詳細(xì)講解設(shè)計模式之中的建造者模式
建造者模式,是一種對象構(gòu)建模式 它可以將復(fù)雜對象的建造過程抽象出來,使這個抽象過程的不同實現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對象。本文將通過示例講解建造者模式,需要的可以參考一下2022-03-03
使用Spring Boot輕松實現(xiàn)流式AI輸出的步驟
本文介紹了如何使用Spring Boot和WebFlux實現(xiàn)流式AI輸出,通過非阻塞I/O、反應(yīng)式編程和函數(shù)式路由等技術(shù),優(yōu)化了AI應(yīng)用的響應(yīng)速度,提升了用戶體驗,感興趣的朋友一起看看吧2025-02-02
IntelliJ IDEA 安裝教程2019.09.23(最新版)
本文通過圖文并茂的形式給大家介紹了IntelliJ IDEA 安裝教程2019.09.23最新版,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-10-10

