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

在Java中使用YOLO(You Only Look Once)目標(biāo)檢測(cè)模型,主要有以下幾種方式,各有其特點(diǎn)和適用場(chǎng)景:
1. 使用Deeplearning4j(DL4J)
特點(diǎn):純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ù)測(cè)
INDArray output = model.outputSingle(image);
// 后處理(解析邊界框、置信度等)
List<Detection> detections = parseYOLOOutput(output);
優(yōu)缺點(diǎn):
- 優(yōu)點(diǎn):純Java實(shí)現(xiàn),無(wú)需外部依賴,適合集成到Java項(xiàng)目中。
- 缺點(diǎn):性能可能不如原生框架,模型轉(zhuǎn)換過(guò)程較復(fù)雜。
2. 通過(guò)OpenCV調(diào)用YOLO
特點(diǎn):利用OpenCV的DNN模塊直接加載預(yù)訓(xùn)練的YOLO模型。
步驟:
- 依賴添加:
<dependency>
<groupId>org.openpnp</groupId>
<artifactId>opencv</artifactId>
<version>4.5.5-1</version>
</dependency>
- Java代碼示例:
// 加載OpenCV庫(kù)
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)缺點(diǎn):
- 優(yōu)點(diǎn):OpenCV提供高效的圖像處理能力,支持GPU加速(需配置CUDA)。
- 缺點(diǎn):需安裝OpenCV原生庫(kù),依賴管理較復(fù)雜。
3. 使用TensorFlow/ONNX部署YOLO
特點(diǎn):將YOLO轉(zhuǎn)換為TensorFlow或ONNX格式,通過(guò)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)缺點(diǎn):
- 優(yōu)點(diǎn):TensorFlow/ONNX生態(tài)成熟,支持跨平臺(tái)部署,可利用TensorRT加速。
- 缺點(diǎn):模型轉(zhuǎn)換需額外工具(如
ultralytics庫(kù)),需了解不同框架的API。
4. 使用TensorRT Java API(高性能場(chǎng)景)
特點(diǎn):針對(duì)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)缺點(diǎn):
- 優(yōu)點(diǎn):極致的GPU性能,適合實(shí)時(shí)視頻流處理。
- 缺點(diǎn):僅支持NVIDIA GPU,部署環(huán)境要求高,開發(fā)復(fù)雜度大。
5. 通過(guò)REST API調(diào)用Python服務(wù)
特點(diǎn):將YOLO模型封裝為Python REST服務(wù),Java通過(guò)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)缺點(diǎn):
- 優(yōu)點(diǎn):避免Java直接處理復(fù)雜的深度學(xué)習(xí)依賴,分工清晰。
- 缺點(diǎn):網(wǎng)絡(luò)通信開銷,依賴Python服務(wù)穩(wěn)定性。
選擇建議
- 初學(xué)者/輕量級(jí)應(yīng)用:優(yōu)先考慮OpenCV或REST API方式。
- 企業(yè)級(jí)Java項(xiàng)目:使用DL4J或ONNX Runtime,減少外部依賴。
- 高性能場(chǎng)景:TensorRT(GPU)或OpenCV(支持CUDA)。
根據(jù)具體需求權(quán)衡開發(fā)復(fù)雜度、性能和部署環(huán)境,選擇最適合的方案。
以上就是在Java中使用YOLO模型的幾種方式詳解的詳細(xì)內(nèi)容,更多關(guān)于Java使用YOLO模型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java 實(shí)現(xiàn) ReAct Agent工具調(diào)用與推理循環(huán)的過(guò)程
文章介紹了Agent的概念,與普通LLM的區(qū)別,并詳細(xì)講解了ReAct模式,包括定義工具、ReAct Prompt模板、構(gòu)建推理循環(huán)和工具執(zhí)行邏輯,還對(duì)比了j-langchain和LangChain Python的特點(diǎn),強(qiáng)調(diào)了j-langchain的透明度和可調(diào)試性2026-04-04
Java并發(fā)編程示例(二):獲取和設(shè)置線程信息
這篇文章主要介紹了Java并發(fā)編程示例(二):獲取和設(shè)置線程信息,本文是系列文章的第二篇,本文著重講解Thread類的幾個(gè)重要屬性,需要的朋友可以參考下2014-12-12
jar包在windows后臺(tái)運(yùn)行,通過(guò).bat文件實(shí)現(xiàn)
文章主要講解了在Windows后臺(tái)運(yùn)行JAR包的方法,通過(guò)創(chuàng)建啟動(dòng).bat和停止.bat文件,使用javaw方式運(yùn)行JAR包,可以在關(guān)閉cmd界面后仍然保持程序運(yùn)行,提供了啟動(dòng).bat和停止.bat的具體內(nèi)容2026-04-04
Retrofit+RxJava實(shí)現(xiàn)帶進(jìn)度條的文件下載
這篇文章主要為大家詳細(xì)介紹了Retrofit+RxJava實(shí)現(xiàn)帶進(jìn)度條的文件下載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
Java通過(guò)exchange協(xié)議發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了Java通過(guò)exchange協(xié)議發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
SpringBoot3?框架快速搭建與項(xiàng)目工程詳解
本文將從項(xiàng)目搭建、核心配置、分層開發(fā)、統(tǒng)一返回與異常處理等維度,詳細(xì)講解SpringBoot3項(xiàng)目的構(gòu)建與工程設(shè)計(jì),幫助開發(fā)者快速上手,感興趣的朋友跟隨小編一起看看吧2026-02-02
IDEA2024下安裝kubernetes插件配置進(jìn)行使用的方法
IDEA中默認(rèn)已安裝Kubernetes插件,若未發(fā)現(xiàn),可在市場(chǎng)下載,安裝后,需準(zhǔn)備config文件和kubectl.exe,進(jìn)行路徑配置,可在Workloads-prod下查看和下載目標(biāo)容器日志,本文介紹IDEA2024下安裝kubernetes插件并配置進(jìn)行使用,感興趣的朋友一起看看吧2024-11-11
SpringMVC中處理靜態(tài)資源的過(guò)程詳解
本文給大家介紹SpringMVC中處理靜態(tài)資源的過(guò)程,結(jié)合示例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11
一文系統(tǒng)梳理Java中字符串比較的高頻誤區(qū)
本文圍繞?Java?字符串比較中的高頻誤區(qū)展開,系統(tǒng)梳理?==、equals()、字符串常量池、new?String()、編譯期與運(yùn)行期拼接、final?常量折疊以及?intern()?的核心規(guī)則,希望幫助?Java?初學(xué)者真正理解?String?比較背后的引用關(guān)系與常見踩坑點(diǎn)2026-05-05

