新手零门槛!Java+YOLOv11从0到1:100行代码实现猫狗图像分类,一键复制跑通
做Java+YOLO入门的同学,是不是都被环境搭一周、依赖冲突、代码看不懂、模型加载失败这些问题劝退?我去年第一次学Java+YOLOv8的时候,光是解决OpenCV DNN的JNI依赖、模型格式转换,就折腾了整整3天,差点放弃。
今天这篇文章,用最主流、最稳定、零JNI依赖的技术栈:Java 17 + DJL(Deep Java Library,亚马逊开源的纯Java深度学习库) + YOLOv11n(轻量版,推理快,新手友好),实现经典的猫狗图像分类,核心代码100行左右,一键复制,Windows/Linux/macOS都能用,统信UOS/鲲鹏也能快速适配。
一、先搞懂:为什么选这套技术栈?
新手入门Java+YOLO,最怕的就是JNI依赖冲突、跨平台适配难、代码复杂难维护,这套技术栈完美解决了所有痛点:
- 纯Java,零JNI依赖:DJL是纯Java实现的,不需要OpenCV DNN的JNI库,不需要TensorFlow Lite的C++库,一键安装NuGet(哦不对,是Maven)依赖,跨平台直接跑;
- 生态完善,支持所有主流模型:DJL原生支持YOLOv5/v8/v11/v26、BERT、ResNet等所有主流模型,支持ONNX Runtime、PyTorch、TensorFlow等推理引擎,新手入门用ONNX Runtime,性能好、部署简单;
- 代码简洁,新手友好:DJL封装了所有底层细节,比如模型加载、图像预处理、推理、后处理,核心代码100行左右就能实现完整的图像分类;
- 国产平台适配好:DJL原生支持统信UOS/麒麟/鲲鹏/飞腾等国产平台,开启NEON向量加速后,性能比原生Python还快。
二、环境准备(5分钟搞定,零踩坑)
2.1 系统要求
- Java 11+(推荐Java 17 LTS,性能最好、兼容性最强);
- Maven 3.6+(或者Gradle,新手推荐Maven,配置简单);
- 任意操作系统(Windows/Linux/macOS/统信UOS/麒麟)。
2.2 Maven依赖配置(一键复制)
创建一个空的Maven项目,在pom.xml里添加以下依赖,不需要任何额外配置,不需要下载任何本地库:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>yolo11-cat-dog</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<djl.version>0.27.0</djl.version>
</properties>
<dependencies>
<!-- DJL核心库 -->
<dependency>
<groupId>ai.djl</groupId>
<artifactId>api</artifactId>
<version>${djl.version}</version>
</dependency>
<!-- DJL ONNX Runtime推理引擎(新手首选,性能好、部署简单) -->
<dependency>
<groupId>ai.djl.onnxruntime</groupId>
<artifactId>onnxruntime-engine</artifactId>
<version>${djl.version}</version>
<scope>runtime</scope>
</dependency>
<!-- DJL图像预处理库 -->
<dependency>
<groupId>ai.djl</groupId>
<artifactId>model-zoo</artifactId>
<version>${djl.version}</version>
</dependency>
<!-- 日志库(可选,新手可以不加,用System.out.println) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.12</version>
</dependency>
</dependencies>
</project>
2.3 模型准备(1分钟搞定)
我们用Ultralytics官方预训练的YOLOv11n分类模型,轻量版,推理快,新手友好,模型大小仅2.8MB:
- 打开浏览器,访问Ultralytics官方模型库:https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-cls.onnx;
- 下载模型文件,放到项目的
src/main/resources目录下; - 模型的分类标签是COCO数据集的1000类,但我们只需要猫狗分类,标签索引是:15=猫,16=狗。
三、核心代码实现(100行左右,一键复制)
创建一个CatDogClassifier.java类,放在com.example包下,核心代码100行左右,一键复制就能跑通:
package com.example;
import ai.djl.Application;
import ai.djl.MalformedModelException;
import ai.djl.Model;
import ai.djl.inference.Predictor;
import ai.djl.modality.Classifications;
import ai.djl.modality.cv.Image;
import ai.djl.modality.cv.ImageFactory;
import ai.djl.modality.cv.transform.Normalize;
import ai.djl.modality.cv.transform.Resize;
import ai.djl.modality.cv.transform.ToTensor;
import ai.djl.modality.cv.translator.ImageClassificationTranslator;
import ai.djl.repository.zoo.Criteria;
import ai.djl.repository.zoo.ModelNotFoundException;
import ai.djl.translate.TranslateException;
import ai.djl.translate.Translator;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class CatDogClassifier {
// 模型路径(src/main/resources目录下)
private static final String MODEL_PATH = "src/main/resources/yolo11n-cls.onnx";
// 模型输入尺寸(YOLOv11分类模型固定224×224)
private static final int INPUT_SIZE = 224;
// 猫狗分类标签索引(COCO数据集)
private static final int CAT_INDEX = 15;
private static final int DOG_INDEX = 16;
// 置信度阈值(只显示置信度>0.5的结果)
private static final float CONF_THRESHOLD = 0.5f;
public static void main(String[] args) {
// 1. 准备测试图片路径(换成你自己的图片路径)
String testImagePath = "src/main/resources/test-cat.jpg";
// String testImagePath = "src/main/resources/test-dog.jpg";
try {
// 2. 构建图像分类翻译器(预处理+后处理)
Translator<Image, Classifications> translator = ImageClassificationTranslator.builder()
// 预处理:Resize到224×224 → ToTensor → Normalize(和Python训练时完全一致)
.addTransform(new Resize(INPUT_SIZE, INPUT_SIZE))
.addTransform(new ToTensor())
.addTransform(new Normalize(
new float[]{0.485f, 0.456f, 0.406f}, // COCO数据集均值
new float[]{0.229f, 0.224f, 0.225f} // COCO数据集标准差
))
// 后处理:只显示Top 5结果
.optTopK(5)
.build();
// 3. 构建模型加载Criteria(指定模型路径、推理引擎、翻译器)
Criteria<Image, Classifications> criteria = Criteria.builder()
.optApplication(Application.CV.IMAGE_CLASSIFICATION)
.setTypes(Image.class, Classifications.class)
.optModelPath(Paths.get(MODEL_PATH))
.optTranslator(translator)
.optEngine("OnnxRuntime") // 指定ONNX Runtime推理引擎
.build();
// 4. 加载模型(只加载一次,不要每次推理都加载)
try (Model model = criteria.loadModel();
Predictor<Image, Classifications> predictor = model.newPredictor()) {
System.out.println("模型加载成功!");
// 5. 加载测试图片
Path imagePath = Paths.get(testImagePath);
Image image = ImageFactory.getInstance().fromFile(imagePath);
System.out.println("测试图片加载成功!");
// 6. 执行推理
Classifications classifications = predictor.predict(image);
System.out.println("推理完成!");
// 7. 解析结果(只显示猫狗分类,置信度>0.5)
List<Classifications.Classification> topK = classifications.topK();
System.out.println("\nTop 5分类结果:");
for (Classifications.Classification cls : topK) {
System.out.printf("类别:%s,置信度:%.2f%%\n",
cls.getClassName(), cls.getProbability() * 100);
}
// 8. 只显示猫狗分类的最终结果
System.out.println("\n猫狗分类最终结果:");
boolean found = false;
for (Classifications.Classification cls : topK) {
int index = Integer.parseInt(cls.getClassName().split(" ")[0]);
if (index == CAT_INDEX && cls.getProbability() > CONF_THRESHOLD) {
System.out.printf("这是一只猫!置信度:%.2f%%\n", cls.getProbability() * 100);
found = true;
break;
} else if (index == DOG_INDEX && cls.getProbability() > CONF_THRESHOLD) {
System.out.printf("这是一只狗!置信度:%.2f%%\n", cls.getProbability() * 100);
found = true;
break;
}
}
if (!found) {
System.out.println("未检测到猫或狗!");
}
} catch (MalformedModelException | ModelNotFoundException | TranslateException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、测试运行(1分钟搞定,零踩坑)
- 准备一张测试图片(猫或狗的图片),放到项目的
src/main/resources目录下,命名为test-cat.jpg或test-dog.jpg; - 修改
CatDogClassifier.java里的testImagePath变量,换成你自己的图片路径; - 右键点击
CatDogClassifier.java,选择“Run ‘CatDogClassifier.main()’”; - 等待几秒钟,就能在控制台看到分类结果!
五、新手常见问题与解决方案(避坑指南)
5.1 模型加载失败
- 问题现象:报错
ModelNotFoundException或MalformedModelException; - 解决方案:检查模型路径是否正确,模型文件是否完整,模型文件是否放在
src/main/resources目录下; - 避坑技巧:用绝对路径测试,比如
C:/Users/xxx/Desktop/yolo11n-cls.onnx,确认没问题再用相对路径。
5.2 推理结果不对
- 问题现象:明明是猫,却识别成狗,或者置信度很低;
- 解决方案:检查预处理的均值和标准差是否和Python训练时完全一致,检查模型输入尺寸是否正确(YOLOv11分类模型固定224×224);
- 避坑技巧:用Ultralytics官方预训练模型的话,预处理参数必须和官方一致,不要随便修改。
5.3 推理速度慢
- 问题现象:单张图片推理要1秒以上;
- 解决方案:检查是否每次推理都加载了模型(模型只加载一次,不要放在循环里),检查是否开启了CPU优化(DJL默认开启),如果有NVIDIA显卡,可以开启CUDA加速;
- 避坑技巧:模型加载放在
try-with-resources块外面,或者用单例模式,只加载一次。
六、进阶学习方向
跑通猫狗分类后,你可以沿着这几个方向深入学习:
- 目标检测:用YOLOv11n目标检测模型,实现猫狗目标检测;
- 自定义模型训练:用自己的数据集训练YOLOv11分类/目标检测模型,导出为ONNX格式,用DJL加载推理;
- 工业场景落地:结合OpenCV C#/Java,实现工业视觉缺陷检测;
- 国产平台适配:在统信UOS/鲲鹏/飞腾等国产平台上部署,开启NEON向量加速。
写在最后
Java+YOLO入门,从来不是简单的“找个代码复制粘贴”,而是要选对技术栈,避免JNI依赖冲突、跨平台适配难这些坑。本文这套技术栈,用纯Java的DJL库,一键安装Maven依赖,100行左右核心代码,一键复制就能跑通经典的猫狗图像分类,新手零门槛。
如果你在Java+YOLO入门中遇到任何问题,欢迎在评论区交流讨论。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)