# jpy-ml **Repository Path**: daixingdeng_admin/jpy-ml ## Basic Information - **Project Name**: jpy-ml - **Description**: 生产级 Java AI/ML 框架 — 6 行 Java 代码实现检测、分割、跟踪、分类 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: https://i.m78cloud.cn/projects/9f489027-70f6-4f38-94f0-b56706951239/ - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2026-05-06 - **Last Updated**: 2026-05-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # jpy-ml

生产级 Java AI/ML 框架 — 6 行 Java 代码实现检测、分割、跟踪、分类

![index.png](docs%2Findex.png)

English · 快速开始 · API 文档 · 路线图

--- **一个依赖。一行加载。一行推理。** jpy-ml 将完整的 Python ML 生态直接嵌入 JVM — YOLO、SAM、MediaPipe、OpenCV — 全部封装为简洁、类型安全的 Java API,零 Python 配置。 ```java // 就这么简单。自动下载模型,运行推理,返回类型化结果。 try (Model model = Model.preset("yolov8n")) { DetectionResult result = model.predict("photo.jpg"); System.out.println(result.toJson()); // {"task":"detect","count":6,"boxes":[...]} } ``` 无需安装 Python。无需手动下载模型。无需配置文件。无需 `Map` 强转。 **Java 里直接跑生产级 ML。** ### 和传统方案的区别 | 传统 Java ML 方案 | jpy-ml | |---|---| | 通过 REST 调用 Python 服务 | ML **进程内运行**(JNI)— 零网络延迟 | | 手动安装 Python + pip + torch | **自动下载** Python、所有依赖、模型权重 | | 解析无类型的 JSON 结果 | **强类型**结果:`DetectionResult`、`PoseResult`... | | 部署两个服务(Java + Python API) | **单 JVM 进程** — 运维更简单,成本更低 | | 只能用 ONNX Runtime(仅 CPU) | **完整 PyTorch** — CPU、Apple MPS、NVIDIA CUDA、多卡 | | 只能推理 | **推理 + 训练 + 验证 + 导出** — 全生命周期 | ### 内置引擎 - **YOLO** — YOLOv8 / YOLO11 / YOLO26 / RT-DETR:检测、分割、分类、姿态、旋转框 - **SAM 2** — 交互式分割(点/框提示)+ 视频目标跟踪 - **SAM 3** — 自然语言概念级分割("找到所有车辆") - **MediaPipe** — 手部追踪(21 关键点)、面部网格(478 关键点)、姿态估计(33 关键点) - **OpenCV** — 图像处理:模糊、边缘检测、轮廓、形态学、色彩转换 - **ONNX Runtime** — CPU/GPU 推理(导出模型) - **完整流水线** — 自定义数据训练、验证、导出为 ONNX/TensorRT/CoreML --- ## 特性 ### 核心框架 - **嵌入式 Python 运行时** — 通过 Jep(JNI)将完整 CPython 嵌入 JVM,自动管理生命周期 - **零配置环境** — 生产模式自动下载 Python,开发模式使用本地 venv - **线程安全引擎** — 单例 PythonEngine + ReadWriteLock,支持并发调用 - **类型安全 API** — 强类型配置、结果、回调 —— 用户代码无需 `Map` 强转 - **透明 Python 桥接** — 需要时可通过 `PythonEngine` 直接调用任意 Python/NumPy - **SLF4J 日志** — 集成 Logback 日志框架 - **异常层次** — `JpyMlException` 基类 + 类型化异常 ### 计算机视觉(Ultralytics YOLO) - **统一 Model API** — 单一 `Model` 类支持所有架构和任务 - **6 个模型家族** — YOLOv8、YOLO11、YOLO26、RT-DETR、SAM,以及 ONNX Runtime 推理 - **5 种任务类型** — 检测、分割、分类、姿态估计、旋转框(OBB) - **完整生命周期** — 推理、训练、验证、导出(ONNX/TensorRT/CoreML/TFLite/...) - **丰富结果类型** — BoundingBox、Mask、Keypoint、RotatedBoundingBox,带过滤/查询辅助方法 - **设备抽象** — CPU / MPS(Apple Silicon)/ CUDA GPU / 多 GPU,通过 `Device` 类统一管理 - **Epoch 回调** — 实时训练进度,逐 epoch 的 loss/fitness 指标 - **逐类验证** — mAP50、mAP50-95、precision、recall 按类别细分 - **图像标注** — 通过 PIL 绘制推理结果,支持所有任务类型 - **零拷贝桥接** — `TensorBufferPool` + `RawDetectionResult` 高性能推理 - **GPU 内存管理** — `warmup()`、`unload()`、`reload(device)` API - **直接图像输入** — `predict(byte[])`、`predict(BufferedImage)`,无需临时文件 - **异步 API** — `predictAsync()` 返回 `CompletableFuture` - **结果序列化** — `toJson()`、`toMap()`,所有结果类型,无外部依赖 - **模型中心** — `Model.preset("yolov8n")` 自动下载并缓存模型 - **Java 可视化** — `ImageVisualizer` 纯 Java2D 绘制框/mask/关键点 ### SAM 2 — 交互式分割 - **点/框提示** — 通过点击或绘制边界框分割对象 - **多提示组合** — 组合正向和负向提示 - **视频跟踪** — 利用时序记忆在视频帧间跟踪目标 - **SAM2Model** — 专用 SAM 2 推理模型类 - **SAM2Result** — 带 mask 和置信度的类型化结果 - **SAM2VideoTracker** — 视频目标跟踪,支持逐帧提示 ### SAM 3 — 概念级分割 - **文本提示** — 使用自然语言分割目标("person"、"red car") - **图像样本** — 使用参考图像区域查找相似目标 - **SAM3Model** — 专用 SAM 3 推理模型类 - **SAM3Result** — 带 mask、置信度和类别的类型化结果 - **CLIP 集成** — 使用 CLIP 实现文本到 mask 的语义理解 ### OpenCV 集成 - **OpenCVEngine** — OpenCV 操作的 Java API - **图像 I/O** — imread、imwrite,支持格式检测 - **颜色转换** — BGR2GRAY、BGR2RGB 等 - **滤波** — 高斯模糊、Canny 边缘检测、阈值处理 - **轮廓** — 查找和分析轮廓 - **形态学** — 膨胀、腐蚀、开运算、闭运算 ### MediaPipe 集成 - **MediaPipeEngine** — MediaPipe 任务的 Java API - **手部追踪** — 检测手部 21 个关键点 - **面部网格** — 检测面部 478 个关键点 - **姿态估计** — 检测身体 33 个关键点 --- ## Maven ```xml io.github.javpower jpy-ml 1.1.0 ``` --- ## 环境要求 | 组件 | 版本 | 备注 | |------|------|------| | JDK | Temurin 17 | 通过 sdkman,**不要用 GraalVM**(JNI 崩溃) | | Python | 3.13 (venv) | 项目本地 `.venv/` | | Jep (pip + Maven) | 4.3.1 | Java-Python JNI 桥接,Maven groupId: `org.ninia` | | Ultralytics | 8.4.45 | YOLOv8, YOLO11, YOLO26, RT-DETR, SAM | | OpenCV | 4.6.0+ | 图像处理(可选) | | MediaPipe | 0.10.0+ | 手部/面部/姿态检测(可选) | | PyTorch | 2.11.0 | CPU-only macOS ARM64 | | OS | macOS ARM64 (Apple Silicon) | | ### 依赖管理 **两种初始化模式:** | 模式 | 方法 | 自动安装 | 使用场景 | |------|------|----------|----------| | **自动下载** | `PythonRuntime.init()` | ✅ 是 | 生产环境,零配置 | | **本地venv** | `PythonRuntime.init(pythonPath, jepLibPath)` | ❌ 否 | 开发环境,已有Python | **自动下载模式** (`PythonRuntime.init()`): - 自动下载 python-build-standalone - 自动安装 `requirements.txt` 中的所有依赖 **本地venv模式** (`PythonRuntime.init(pythonPath, jepLibPath)`): - 使用现有Python环境 - 需手动安装依赖: ```bash .venv/bin/pip install -r src/main/resources/requirements.txt ``` --- ## 快速开始 ### 1. 切换 JDK 17 ```bash sdk install java 17.0.19-tem # 首次安装 sdk use java 17.0.19-tem java -version # 确认: openjdk 17.0.19 Temurin ``` ### 2. 创建 Python 虚拟环境 ```bash /opt/homebrew/bin/python3.13 -m venv .venv ``` ### 3. 安装 Python 依赖 ```bash # 基础依赖(必须) .venv/bin/pip install jep numpy ultralytics # 可选:OpenCV 图像处理 .venv/bin/pip install opencv-python # 可选:MediaPipe 手部/面部/姿态检测 .venv/bin/pip install mediapipe # 或一次性安装所有依赖 .venv/bin/pip install -r src/main/resources/requirements.txt ``` ### 4. 构建与测试 ```bash mvn clean test # 预期: Tests run: 72, Failures: 0, Errors: 0, Skipped: 6 ``` --- ## API 用法 ### 模型加载 — 指定任务类型和设备 ```java // 自动检测任务类型 try (Model model = new Model("yolov8n.pt")) { ... } // 显式指定任务类型(适用于自定义命名的模型) try (Model model = new Model("my_model.pt", TaskType.DETECT)) { ... } // 指定设备 ModelConfig config = new ModelConfig() .device(Device.cpu()); // CPU .device(Device.mps()); // Apple Silicon GPU .device(Device.gpu(0)); // GPU 0 .device(Device.cuda(0)); // CUDA:0 ``` ### 目标检测 ```java try (Model model = new Model("yolov8n.pt")) { DetectionResult result = model.predict("photo.jpg"); for (ClassPrediction pred : result.getBoxes()) { System.out.println(pred); // person 92.3% BoundingBox[x1=100.5, y1=50.2, x2=300.1, y2=400.8] } // 过滤结果 List persons = result.filterByClass("person"); List confident = result.filterByConfidence(0.8f); } ``` ### 实例分割 ```java try (Model model = new Model("yolov8n-seg.pt")) { SegmentationResult result = model.predict("photo.jpg"); for (int i = 0; i < result.getBoxes().size(); i++) { ClassPrediction pred = result.getBoxes().get(i); Mask mask = result.getMasks().get(i); System.out.println(pred.className() + " 掩码点数: " + mask.getPointCount()); } } ``` ### 图像分类 ```java try (Model model = new Model("yolov8n-cls.pt")) { ClassificationResult result = model.predict("photo.jpg"); System.out.println("预测: " + result.getTop1ClassName()); System.out.println("置信度: " + result.getTop1Confidence()); } ``` ### 姿态估计 ```java try (Model model = new Model("yolov8n-pose.pt")) { PoseResult result = model.predict("photo.jpg"); for (int i = 0; i < result.personCount(); i++) { KeypointCollection kpts = result.getKeypoints().get(i); Keypoint nose = kpts.getNose(); System.out.printf("人物 %d: 鼻子=(%.1f, %.1f)%n", i, nose.x(), nose.y()); } } ``` ### 旋转框检测 (OBB) ```java try (Model model = new Model("yolov8n-obb.pt")) { OBBResult result = model.predict("satellite_image.jpg"); for (OBBPrediction pred : result.getPredictions()) { RotatedBoundingBox box = pred.box(); System.out.printf("%s %.1f%% 角度=%.1f°%n", pred.className(), pred.confidence() * 100, box.angleDegrees()); } } ``` ### 推理配置 ```java ModelConfig config = new ModelConfig() .confidence(0.5f) // 置信度阈值 .iouThreshold(0.7f) // NMS IoU 阈值 .imageSize(640) // 输入图像尺寸 .maxDetections(100) // 最大检测数 .device(Device.gpu(0)) // 设备选择 .augment(true) // 测试时增强 .filterClasses(0, 2, 5) // 只检测指定类别 .half(true) // FP16 推理(GPU) .verbose(false) // 静默模式 .save(true) // 保存结果 .embed(0, 1, 2); // 提取特征嵌入 InferenceResult result = model.predict("photo.jpg", config); ``` ### ONNX 推理 ```java // 加载 ONNX 模型(推荐显式指定任务类型) try (Model model = new Model("yolov8n.onnx", TaskType.DETECT)) { DetectionResult result = model.predict("photo.jpg"); } // 导出为 ONNX ExportResult exported = model.export(ExportFormat.ONNX); ``` ### 模型训练 ```java TrainingConfig config = new TrainingConfig() .dataConfig("coco128.yaml") .epochs(50) .batchSize(16) .device(Device.gpu(0)) .optimizer(OptimizerType.ADAMW) .learningRate(0.001f) .augmentation(new AugmentationConfig() .mosaic(true) .fliplr(0.5f) .hsvH(0.015f)); // 带 epoch 回调 TrainingResult result = model.train(config, (epoch, log) -> { System.out.println("Epoch " + epoch + ": " + log); }); // 查看 epoch 级别指标 for (EpochMetric m : result.getEpochMetrics()) { System.out.printf("Epoch %d: box_loss=%.4f cls_loss=%.4f%n", m.epoch(), m.boxLoss(), m.clsLoss()); } ``` ### 模型验证 ```java ValidationResult val = model.validate("coco128.yaml"); System.out.printf("mAP50=%.3f, mAP50-95=%.3f, P=%.3f, R=%.3f%n", val.getMAP50(), val.getMAP5095(), val.getPrecision(), val.getRecall()); // 每个类别的指标 for (PerClassMetric pc : val.getPerClassMetrics()) { System.out.println(pc); // "person (id=0): mAP50-95=0.7234" } ``` ### 批量推理 ```java try (Model model = new Model("yolov8n.pt")) { List images = List.of("photo1.jpg", "photo2.jpg", "photo3.jpg"); List results = model.predict(images); for (int i = 0; i < results.size(); i++) { System.out.println("图像 " + i + ": " + results.get(i).count() + " 个目标"); } } ``` ### 视频流式推理 ```java try (Model model = new Model("yolov8n.pt")) { // 视频文件 — 逐帧分块流式处理 model.predictVideo("video.mp4", frame -> { System.out.println("帧: " + frame.count() + " 个目标"); }); // 摄像头 — 实时推理(阻塞当前线程) // 在另一个线程调用 stopStream() 停止 new Thread(() -> { Thread.sleep(10000); model.stopStream(); // 10 秒后停止 }).start(); model.predictStream(0, frame -> { // 0 = 默认摄像头 if (frame instanceof DetectionResult dr) { System.out.println("摄像头: " + dr.getBoxes().size() + " 个目标"); } }); } ``` --- ## 架构 ``` ┌──────────────────────────────────────────┐ │ 用户 Java 代码 │ │ Model m = new Model("yolov8n.pt"); │ │ DetectionResult r = m.predict(img); │ ├──────────────────────────────────────────┤ │ Model / ModelConfig / Result 类型 │ │ (58 个 Java 源文件) │ ├──────────────────────────────────────────┤ │ PythonEngine (单例, ReadWriteLock) │ │ SharedInterpreter + sys.path 过滤 │ ├──────────────────────────────────────────┤ │ Jep 4.3.1 (JNI 桥接) │ │ libjep.jnilib 来自 pip install jep │ ├──────────────────────────────────────────┤ │ Python 辅助脚本 (12 个 .py 文件) │ │ jpy_load_model / jpy_extract_result / │ │ jpy_train / jpy_export / jpy_validate / │ │ jpy_sam2 / jpy_sam3 / jpy_opencv / │ │ jpy_mediapipe / jpy_streaming / ... │ ├──────────────────────────────────────────┤ │ CPython 3.13 (.venv) │ │ Ultralytics 8.4.45 + PyTorch 2.11 │ └──────────────────────────────────────────┘ ``` --- ## 测试覆盖 全部 106 个测试通过(0 跳过): | 测试套件 | 数量 | 说明 | |---------|------|------| | QuickVerifyTest | 10 | 基础 Python 桥接(eval、put/get、numpy、列表、字典) | | PythonEngineTest | 11 | 引擎特性(多线程、回调、模块) | | PythonRuntimeTest | 3 | 平台检测 | | ModelIntegrationTest | 18 | 完整 YOLO 集成(推理 + 批量 + 视频 + 训练 + 导出) | | SAMIntegrationTest | 9 | SAM 2/3 集成(点/框/视频/文本/样本) | | NewFeaturesTest | 17 | 序列化、byte[]输入、异步、模型中心、可视化 | | TensorBufferPoolTest | 6 | 零拷贝缓冲池 | | BoundingBoxTest | 10 | BoundingBox 记录类 | | KeypointTest | 5 | Keypoint 记录类 | | InferenceSpeedTest | 5 | InferenceSpeed 记录类 | | MediaPipeEngineTest | 4 | 手部/面部/姿态检测 | | OpenCVEngineTest | 8 | 图像处理操作 | 覆盖范围: - 5 种任务类型:检测、分割、分类、姿态、OBB - PyTorch 和 ONNX 模型推理 - YOLOv8 和 YOLO26 模型 - SAM 2 交互式分割 + 视频跟踪 - SAM 3 文本提示 + 图像样本分割 - MediaPipe 手部(21 关键点)、面部(478 关键点)、姿态(33 关键点) - OpenCV 图像处理(颜色转换、滤波、边缘检测、轮廓、形态学) - 训练(含 epoch 回调和指标) - 验证(含每类别 mAP) - ONNX 导出 - 训练后加载模型推理 --- ## 关键设计 1. **单例 PythonEngine** — Jep 限制每个 JVM 只能有一个 SharedInterpreter。所有 Model 实例通过唯一变量名前缀共享。 2. **Python 脚本做重活** — 复杂的 tensor→dict 转换在 Python 端完成,Java 只接收 `Map`。 3. **sys.path 过滤** — 自动过滤 Homebrew 系统包路径冲突,优先使用 venv 的 site-packages。 4. **AutoCloseable Model** — `Model implements AutoCloseable`,close 时将 Python 变量设为 `None` 便于 GC。 5. **Builder 模式** — 所有配置类(`ModelConfig`、`TrainingConfig`、`ExportConfig`、`AugmentationConfig`)使用链式调用。 --- ## 常见问题 ### JVM 崩溃 (Abort trap: 6) **原因:** 使用了 GraalVM CE。 **解决:** 切换到标准 OpenJDK(Temurin)。 ### "Jep native library not found" **原因:** venv 中未安装 jep。 **解决:** `.venv/bin/pip install jep` ### "ultralytics not installed" 或 opencv dlopen 错误 **原因:** Homebrew site-packages 路径与 venv 冲突。 **解决:** 使用 `PythonRuntime.init(pythonPath, jepLibPath)` 传入 venv 路径,PythonEngine 会自动过滤冲突路径。 --- ## 路线图 jpy-ml 的定位是通用 Java-Python ML 桥接框架。YOLO 是第一个引擎 —— 更多引擎正在路上。 ### 已完成 - [x] 批量推理 API(`model.predict(List)`) - [x] 摄像头/视频流实时推理 - [x] python-build-standalone 自动下载(终端用户无需安装 Python) - [x] PyTorch tensor 零拷贝桥接(`TensorBufferPool` + `RawDetectionResult`) - [x] GPU 显存管理与模型预热 API - [x] SAM 2 交互式分割(点/框提示) - [x] SAM 2 视频跟踪(逐帧提示 + 时序记忆) - [x] SAM 3 概念级分割(文本提示 + 图像样本) - [x] OpenCV 集成(图像处理) - [x] MediaPipe 集成(手部/面部/姿态) - [x] SLF4J 日志框架 - [x] 异常层次(`JpyMlException` 基类) - [x] CI/CD(GitHub Actions) - [x] 结果序列化(toJson / toMap) - [x] 直接图像输入(byte[] / BufferedImage) - [x] 模型中心自动下载(Model.preset) - [x] Java2D 结果可视化(ImageVisualizer) - [x] 异步推理 API(predictAsync) ### 近期 - [ ] Windows / Linux CI 测试 - [ ] 所有值类型的单元测试 ### 计划中的 ML 引擎 #### 其他引擎 - [ ] **Transformers (HuggingFace)** — NLP、文本生成、翻译、向量嵌入 - [ ] **Whisper** — 语音识别、语音转文字 - [ ] **Stable Diffusion / FLUX** — 图像生成、局部重绘、ControlNet - [ ] **DeepSeek / LLM** — 大语言模型推理 ### 基础设施 - [ ] 异步训练实时流式回调 - [ ] 模型仓库 / Hub 集成(从 URL 下载) - [ ] Spring Boot Starter 自动配置 - [ ] GraalVM Native Image 支持