作为 Java 程序员,我们在使用自有数据集训练目标检测模型时,常常会遇到一个难题:目前主流的目标检测模型训练基本都依赖 Python 语言。这对只熟悉 Java 的开发者来说,无疑增加了学习成本和使用难度。

虽然基于 DJL(Deep Java Library)可以实现无需编写 Python 代码、甚至不必安装 Python 环境即可训练模型,极大降低了门槛。但 DJL 官方目前提供的预训练模型主要是早期的 SSD 和 YOLO,这些模型的准确率和速度已不及最新的检测算法。

如果想自行实现最新的目标检测模型,又需要深入理解每个模型的神经网络架构,难度较大,门槛较高。

综合考虑,我认为比较实用的折中方案是:使用 PyTorch 或 TensorFlow 的 API 来训练模型,训练过程可以借助现成的工具和配置,不必手写复杂代码;然后再通过我们开发的 SmartJavaAI(基于 DJL 封装)来做模型的推理部署。这样既能充分利用主流深度学习框架的训练优势,又能让 Java 程序员轻松进行模型推理。

Java 开发者看到这里,请不要被“Python”吓到,其实训练过程相当简单,并不需要你写任何 Python 代码。我会提供详细的、零基础也能跟着做的完整教程,帮助你轻松完成模型训练。


注意事项:
1、本教程基于 Windows + CPU 环境 进行训练,其他平台(如 Linux 或 GPU)教程将后续补充。
2、在本教程中用到的所有资源,我都已整理好并上传至百度网盘,下载链接如下:https://pan.baidu.com/s/1k8CYtwX8qVTEC593nlePoQ?pwd=xzm9 提取码: xzm9
3、训练过程中,有任何问题可以加微信入群讨论:deng775747758

一、安装python环境

1. 安装 Anaconda3

你可以从清华大学开源软件镜像站下载 Anaconda3 的安装包:
🔗 Anaconda 镜像下载地址

请根据你电脑的操作系统选择对应的安装版本。建议选择最新版。安装过程非常简单,一路点击 Next 即可完成。

我本地安装的版本为:
Anaconda3-5.3.1-Windows-x86_64.exe

安装完成后,打开 Anaconda Prompt(可以通过点击 Windows 开始菜单搜索Anaconda Prompt并打开):

如果命令行前显示 (base),说明 Anaconda 已成功安装并初始化:

部分用户打开prompt窗口没有显示base,而是显示的Anaconda路径,这个时候需要检查一下安装的版本,重新安装最新版本


2. 修改 pip 安装源为国内镜像

由于默认的 pip源在国外,下载速度较慢,我们建议将 pip 源修改为国内镜像,例如清华大学镜像源。

步骤如下:
  1. 打开文件管理器,在地址栏输入:

    %APPDATA%
    

    按回车后会跳转到路径:C:\Users\用户名\AppData\Roaming

  2. 在该目录下新建一个名为 pip 的文件夹。

  3. pip 文件夹中创建一个名为 pip.ini 的配置文件。

  4. 编辑 pip.ini 文件,添加以下内容(使用清华源):

[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn

提示

1、你也可以将源替换为其他国内镜像站点,如阿里云、豆瓣等。

2、我们提供的网盘链接里也包含此文件,可以直接下载使用


3. 创建并激活虚拟环境

在进行项目开发时,推荐使用虚拟环境来隔离不同项目的依赖库。下面我们将通过 Anaconda 创建一个新的 Python 虚拟环境。

打开 Anaconda Prompt,执行以下命令:

创建虚拟环境

conda create -n yolov12 python=3.11

🔍 说明yolov12 是环境名称,你可以根据需要自定义;python=3.11 表示该环境使用的 Python 版本。

输入 y 并按回车继续安装:

等待安装完成后,你会看到如下提示界面:

激活虚拟环境

conda activate yolov12

激活后,命令行前会显示当前环境名 (yolov12),表示已成功进入该虚拟环境:


恭喜!你现在已成功安装 Anaconda,并创建了一个独立的 Python 虚拟环境。


二、安装yolov12

1. 下载 YOLOv12

你可以通过以下方式将项目克隆或解压到本地:

  • 方式一:使用 Git 拉取代码(推荐)
git clone https://github.com/sunsmarterjie/yolov12.git


2. 安装依赖库

进入 yolov12-main 项目的根目录,打开 requirements.txt 文件。该文件列出了所有需要安装的 Python 包。

前2个包为了提高安装成功率,我们教大家手动安装,第3个包只有用GPU才需要,CPU使用不需要安装。

(1)下载依赖包

请根据你的 Python 版本(我们的Python版本是3.11)选择对应的 wheel 文件进行下载(也可以从我们提供的网盘下载):

  1. PyTorch

  2. TorchVision

  3. Torchaudio

⚠️ 注意:这些包适用于 CPU 版本,且部分版本与 Python 版本有关,请确保与你当前环境匹配。


(2)手动安装依赖

将上述三个 .whl 文件统一存放到一个目录中,例如:D:\yolo\lib\

然后在 Anaconda Prompt 或命令行中切换到该目录,并依次执行以下命令进行安装:

pip install torch-2.2.2+cpu-cp311-cp311-win_amd64.whl
pip install torchvision-0.17.2+cpu-cp311-cp311-win_amd64.whl
pip install torchaudio-2.2.2+cpu-cp311-cp311-win_amd64.whl

如果输出中出现类似以下信息,说明安装成功:

Successfully installed …

如果出现红色报错信息,则表示安装失败。

3. 安装 requirements.txt 中的依赖库

在安装 requirements.txt 中的依赖之前,请务必注释掉前三行。因为我们已经手动安装了前两个依赖库(torchtorchvision),第三个依赖库仅在使用 NVIDIA 显卡并支持 CUDA 的环境下才需要安装。

你可以通过在每行前加 # 来注释掉这三行:

接着,在打开的 Anaconda Prompt 窗口中,进入 yolov12-main 项目的根目录,执行以下命令来安装剩余依赖:

pip install -r requirements.txt

如果看到类似如下输出,则表示安装成功:

Successfully installed xxxxx

4. 下载模型文件

YOLOv12 的 GitHub 官方页面提供了预训练模型的下载链接。如果你无法访问 GitHub,也可以通过我们提供的网盘链接进行下载。

请将下载好的模型文件放置在项目yolov12-main根目录中,以便后续训练或推理任务使用。

官网模型参数讲解

字段 含义
Model 模型的具体版本(n/s/m/l/x)表示从最小到最大,参数量逐渐增多,性能也逐步增强
size (pixels) 输入图像的尺寸(通常是方形,640×640)
mAPval 50‒95 检测精度(mean Average Precision),值越高说明识别越准确,范围是 0~100
Speed (T4 TensorRT10) 使用 NVIDIA T4 GPU(TensorRT 加速)下的推理速度,单位应该是毫秒或帧每秒(根据项目而定)
params (M) 模型的参数量,单位是百万(M),数字越大模型越复杂、越重
FLOPs (G) 浮点运算次数(计算复杂度),单位是 GFLOPs,越大代表计算量越大(对 CPU/GPU 要求越高)

各模型适应场景,可以按需下载

模型名 适用场景 特点
YOLO12n (nano) 移动端、低功耗设备 模型非常小,速度快,精度一般
YOLO12s (small) 实时性要求高的轻量部署 精度比 nano 高一点,依然很轻
YOLO12m (medium) 平衡性能和速度 精度明显提升,适合中型项目
YOLO12l (large) 精度优先 参数量大,推理慢,精度高
YOLO12x (extra large) 离线处理、精度最高 超大模型,计算资源消耗最大,但精度最好

5. 运行官方网页

为了启动 YOLOv12 的官方网页应用,请按照以下步骤操作:

修改 app.py 文件

进入 yolov12 根目录,找到并编辑 app.py 文件。将文件的最后一行修改为:

gradio_app.launch(share=True)

安装依赖库

在运行应用之前,还需要安装两个额外的依赖库:

pip install thop

pip install pydantic==2.10.6
启动应用

在 Anaconda Prompt 窗口中,确保你已经进入了 yolov12 的根目录,然后执行以下命令来启动应用:

python app.py

如果缺少 thop 库,可能会出现错误提示:

如果没有正确安装 pydantic==2.10.6,也可能会遇到如下错误:

成功启动后的界面如下图所示:

由于每个人的电脑环境可能不同,安装完这两个库后仍有可能出现缺少依赖库的报错。如果出现类似“No module named 'xxx‘ ”的错误提示,只需根据提示安装对应的依赖库即可。

访问 Web 应用

根据控制台输出的日志信息,在浏览器中打开链接(例如:http://127.0.0.1:7860)。请注意实际端口号可能有所不同。

准备模型文件

在运行前,请确保已提前下载好模型文件,并放置于 yolov12 根目录中。在网页应用中上传图片后,在 Model 中选择相应的模型文件,点击“Detect Objects”按钮即可开始检测。若未提前下载模型,系统会自动下载,但速度较慢。

检测效果展示:

至此,YOLOv12 已经安装完毕,接下来可以进行模型训练。

三、训练模型

1. 数据标注

在进行模型训练之前,我们需要对图像数据进行标注。本教程将使用开源工具 LabelImg 来完成数据标注工作。

下载 LabelImg

LabelImg 是一个轻量级且易于使用的图像标注工具,支持 Windows、Mac 和 Linux 系统。

下载地址:
https://github.com/HumanSignal/labelImg/releases

我们下载 windows_v1.8.1.zip 版本(Windows 用户)

解压后即可使用。

设置分类类别

打开 windows_v1.8.1\data 文件夹中的 predefined_classes.txt 文件。

该文件定义了预设的类别,每一行代表一个类别。你可以删除原有内容并添加你自己的类别。

示例:我们这里添加两个类别 —— 火焰烟雾

启动软件

直接双击 .exe 文件运行 LabelImg,界面如下所示:

创建目录结构

建议创建如下两个文件夹:

  • images:存放需要标注的原始图片
  • labels:存放生成的标注文件(.txt

本教程使用的是一个公开的 火焰与烟雾数据集,你也可以使用自己的数据集。
将压缩包 Fire and Smoke Dataset 解压到 images 文件夹中即可开始标注。

配置保存路径
  1. 设置标注文件保存路径:
    点击菜单栏中的 Change Save Dir 按钮,选择你创建的 labels 文件夹。

  2. 设置图片文件夹路径:
    点击 Open Dir 按钮,选择你创建的 images 文件夹。

  3. 切换为 YOLO 格式:
    点击如下图所示位置,确保输出格式为 YOLO

开始标注
  1. 快捷键 W 或点击菜单栏 Edit -> Create RectBox,开始绘制矩形框。
  2. 框住图像中需要识别的目标物体。
  3. 弹出类别选择框后,选择正确的类别并点击 OK
  4. 使用快捷键 Ctrl + S 保存当前标注。
  5. 快捷键 D 跳转下一张图片。

如果图片中存在多个目标物体,可以分别框选并标注。

标注结果说明

每张图片标注完成后,都会在 labels 文件夹中生成一个同名的 .txt 文件,文件内容如下:

0 0.567 0.492 0.345 0.678

其中:

  • 第一个数字是类别索引(0 表示火焰,1 表示烟雾)
  • 后面四个数表示边界框的中心坐标和宽高(归一化值)

生产环境使用建议至少准备 1000 张以上标注数据

下面是一些常用的labelImg的快捷键:

快捷键 功能
Ctrl + Q 退出软件
Ctrl + O 打开文件
Ctrl + U 打开目录
Ctrl + R 更改保存目录
Ctrl + S 保存
Ctrl + L 更改标注框的线条颜色
Ctrl + J 移动和编辑标注框
Ctrl + D 复制选中的框
Ctrl + H 隐藏所有标注框
Ctrl + A 显示所有标注框
Ctrl + + 放大图像
Ctrl + - 缩小图像
Ctrl + = 显示图像的原始大小
Ctrl + F 适应窗口大小
Ctrl + Shift + O 打开的文件夹中只显示 .xml 文件
Ctrl + E 编辑标签
Ctrl + Shift + S 将标注保存为其他格式
Ctrl + Shift + F 适应图像宽度
Delete 删除选中的标注框
D 显示下一张图片
A 显示上一张图片
Space 标记当前图片已标记
W 创建标注框

至此,已完成数据标注部分。接下来我们将进入数据集划分阶段。


2. 划分数据集

在训练目标检测模型前,我们需要将数据集按比例划分为:

  • 训练集(train
  • 验证集(val
  • 测试集(test

划分后的目录结构如下所示:


步骤一:准备划分脚本

split_yolo_dataset.py 脚本复制到 yolov12 项目根目录下。

在 Anaconda Prompt 中,进入 yolov12 根目录,执行以下命令:

python split_yolo_dataset.py ^
  --images_dir "D:\yolo\images" ^
  --labels_dir "D:\yolo\labels" ^
  --output_dir "D:\yolo\data" ^
  --train_ratio 0.7 ^
  --val_ratio 0.2 ^
  --test_ratio 0.1

请根据自己的数据路径修改上述参数。


参数说明
参数名 示例值 描述
--images_dir "D:\yolo\images" 原始图像目录,包含所有需要划分的图片。
--labels_dir "D:\yolo\labels" 标签目录,通常为与图像同名的 .txt 文件,采用 YOLO 标注格式。
--output_dir "D:\yolo\data" 数据划分后的输出路径,会自动生成 train/, val/, test/ 子目录。
--train_ratio 0.7 训练集比例,例如 0.7 表示占 70%。
--val_ratio 0.2 验证集比例,例如 0.2 表示占 20%。
--test_ratio 0.1 测试集比例,例如 0.1 表示占 10%。

⚠️ 注意:三个比例之和应等于 1。output_dir 目录请提前创建好,否则脚本可能报错。


执行成功如下图所示:

以下是你提供内容的优化版本,保留了原有结构和信息,但做了语言表达、格式统一和逻辑顺序上的优化,让内容更清晰易读、专业性更强:


3. 编写 data.yaml 配置文件

我们需要创建一个 data.yaml 文件,配置训练所需的路径和类别信息。请根据你的实际情况修改以下示例中的路径和类别名称:

train: D:/yolo/data/train/images  # 训练集图像路径
val: D:/yolo/data/val/images      # 验证集图像路径
test: D:/yolo/data/test/images    # 测试集图像路径

nc: 2  # 类别数量

# 类别名称(顺序需与标注文件一致)
names: ['fire','smoke']

类别数量需要和类别名称里的数量一致

4. 开始训练模型

yolov12 根目录下创建一个新的 Python 文件 train.py,并粘贴以下代码:

yolov12.yaml和data.yaml都需要改为你自己的路径

本教程基于 yolov12.yaml 配置文件进行训练。默认将使用模型:yolov12n,若需使用更大模型(如 yolov12m 或 yolov12l),请将模型结构文件替换为相应的配置,例如:yolov12m.yaml。

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO

if __name__ == '__main__':
    model = YOLO(model=r'D:\yolo\yolov12\ultralytics\cfg\models\v12\yolov12.yaml')
    # model.load('yolo11n.pt') # 加载预训练权重,改进或者做对比实验时候不建议打开,因为用预训练模型整体精度没有很明显的提升
    model.train(data=r'D:\yolo\data.yaml',
                imgsz=640,
                epochs=100,
                batch=4,
                workers=4,
                device='cpu',
                close_mosaic=10,
                resume=False,
                project='runs/train',
                name='exp',
                single_cls=False,
                cache=False,
                )

参数说明

参数名 示例值 说明
imgsz 640 输入图像的尺寸,训练时会自动缩放到该大小
epochs 100 训练轮数(整套数据训练的次数)
batch 4 每批训练的图片数量
workers 4 数据加载的子进程数,提高数据预处理效率
device 'cpu' 训练设备,'0' 表示第一块GPU,'cpu' 表示使用 CPU
close_mosaic 10 训练后多少轮关闭 Mosaic 数据增强
resume False 是否断点续训
project 'runs/train' 训练结果保存的主目录
name 'exp' 当前实验的名称
single_cls False 是否视为单类别训练
cache False 是否将数据缓存到内存中,加快训练速度(需要较大内存)
关于 epochsbatch 如何设置?
参数 建议设置(根据数据量和硬件)
epochs - 小数据集(几百张):建议 100~300
- 大数据集(上万张):建议 50~150
- 训练时间受限:先试 50
batch 设置batch为CPU物理核心数的整数倍

执行训练命令

打开 Anaconda Prompt,切换到 yolov12 根目录,执行以下命令开始训练:

python train.py

如果看到类似以下输出,就说明训练已经开始:

训练完成后,你会看到如下提示:

生成的模型文件如下:

  • best.pt:模型在验证集上表现最好的权重文件
  • last.pt:训练最后一轮保存的权重文件

5. 测试模型效果

新建 detect.py 文件,用于验证模型是否可用:

模型路径和测试图片路径需要修改为实际路径

# -*- coding: utf-8 -*-

from ultralytics import YOLO

if __name__ == '__main__':

    # Load a model
    model = YOLO(model=r'D:\yolo\yolov12\runs\train\exp3\weights\last.pt')
    model.predict(source=r'D:\yolo\Fire and Smoke Dataset\Fire and Smoke Dataset\archive\Datacluster Fire and Smoke Sample\Datacluster Fire and Smoke Sample (60).jpg',
                  save=True,
                  show=False,
                  )

执行该脚本后,终端会输出预测完成的图片路径:

并在目录中保存预测结果图片:


至此,整个模型的训练与测试流程已基本完成。本教程作为入门级实践指南,旨在帮助读者熟悉模型开发的整体流程,不建议直接用于生产环境部署。如需应用于实际场景,仍需进一步优化,后续我们也将推出专门的模型调优教程。

特别说明:要获得理想的检测效果,通常需要至少上千张高质量、标注完整的训练图片。本教程所附的数据集仅用于演示流程,规模较小,因此模型效果有限,若无法准确检测属于正常现象。

我们也提供了一个已标注好的完整数据集(网盘中:yolo_fire_smoke_data.rar),可直接用于训练和验证。
数据集包含 3 个类别:fire、default、smoke。
若使用本数据集,需确保你的训练脚本和配置中类别数统一为 3 类。

6. 模型转换为 ONNX 格式

虽然模型已经训练结束,如果想要在Java环境中调用,需要将模型转换为Onnx格式

yolov12-main 根目录下创建一个新的 Python 文件 exportOnnx.py,并粘贴以下代码:

模型路径需要替换为实际路径

# -*- coding: utf-8 -*-

from ultralytics import YOLO

if __name__ == '__main__':

    # Load a model
    model = YOLO(model=r'C:\Users\Administrator\Downloads\best.pt')
    result = model.export(format="onnx", imgsz=640, half=True)  # or format="engine"

转换完毕,命令行窗口会打印出最终onnx格式的模型路径:saved as D:\yolo\yolov12-main\runs\train\exp3\weights\best.onnx

7. 在 Java 中调用自训练模型进行目标检测

在调用模型检测接口前,请确保准备以下两个文件:

(1)onnx格式的模型文件

(2)synset.txt类别文件(放入和模型相同目录)

DetectorModelConfig config = new DetectorModelConfig();
config.setModelEnum(DetectorModelEnum.YOLOV12_CUSTOM);//自定义YOLOV12模型
// 指定模型路径,需要更改为自己的模型路径
config.setModelPath("/Users/xxx/Documents/develop/fire_model/best.onnx");
DetectorModel detectorModel = ObjectDetectionModelFactory.getInstance().getModel(config);
//指定图片路径,需要更改为自己的图片路径
detectorModel.detectAndDraw("/Users/xxx/Downloads/test.jpg","output/test_detected.jpg");

synset.txt和标注数据用到的文件:predefined_classes.txt内容一样
示例 synset.txt 文件内容:

每一行代表一个类别,此文件必须和训练时候的类型一致

fire
smoke

注意事项:
1、当前支持 基于 YOLOv8 ~ YOLOv12 训练的模型,未测试其他版本,使用时请设置 modelEnum = DetectorModelEnum.YOLOV12_CUSTOM。
2、训练方法详见模型训练教程。
3、支持与其他检测方法通用调用,示例仅使用 detectAndDraw 方法。

至此,从模型训练到在 Java 中完成模型推理的流程已经全部打通。若需进一步集成其他检测方式或扩展功能,请参考接口文档或源码实现。

项目地址

  • 完整代码地址:examples
  • SmartJavaAI 开发文档:官方文档
  • SmartJavaAI Gitee开源地址:Gitee
  • SmartJavaAI Github开源地址:Github
  • SmartJavaAI GitCode开源地址:GitCode

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐