# 目标检测模型训练

作为 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 镜像下载地址 (opens new window)

请根据你电脑的操作系统选择对应的安装版本。建议选择最新版。安装过程非常简单,一路点击 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

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

# 启动应用

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

python app.py

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

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

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

# 访问 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 (opens new window)

我们下载 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