YOLO训练-卷积网络
本文最后更新于69 天前,其中的信息可能已经过时,如有其他问题请留言
AI智能摘要
文章介绍了YOLO(You Only Look Once)模型的基础知识、模型引入、训练准备,以及使用LabelImg工具标注数据集的过程。YOLO是一种深度学习模型,通过卷积网络快速识别和定位图像中的目标。文章提供了Python环境中使用官方ultralytics库直接引入YOLO系列模型的示例,并展示了如何使用该模型进行目标检测。此外,还介绍了如何对目标进行标注,包括使用LabelImg工具和编写Python脚本进行文件复制与分类。

基础使用

YOLO 视觉目标检测模型,通过卷积网络完成训练后,能够实现对图像中目标的快速识别与定位。其核心逻辑并非逐像素分析相似度,而是借助卷积网络的特征提取能力,从图像中提取目标的深层特征(如轮廓、纹理),进而判断目标类别及具体位置,实现端到端的高效检测。

模型引入

在 Python 环境中,我们可以直接引入官方维护的ultralytics库快速使用 YOLO 系列模型。通过创建 YOLO 模型实例,库会自动下载对应版本的官方预训练权重,无需手动配置,即可快速开展模型训练、目标检测等任务。

from ultralytics import YOLO

model = YOLO("yolo11n.pt")
//对图片进行目标检测
results = model(img_path)
//显示识别检测结果(类别,坐标,置信度)
results[0].show() 

训练准备

由于 YOLO 提供了官方预训练权重,模型已经具备识别日常场景中简单的人和物品的能力。但如果要在特定的应用场景中使用,就必须对模型进行针对性训练。

训练的本质是:让卷积神经网络在我们提供的自定义数据集上,重新学习目标的特征规律,调整内部的权重参数,使模型能够精准识别我们指定的目标类别、位置与形态。

模型训练需要提前准备好划分好的训练集(train)、测试集(test)、验证集(val),并编写对应的 yaml 配置文件 告诉模型数据集路径、类别数量和类别名称。YOLO 模型采用图片与标注文件分离存放的标准结构,整体文件布局如下:

dataset/  # 数据集根目录(自定义名称)
├── images/          # 存放所有图片文件
│   ├── train/       # 训练集图片(.jpg/.png)
│   ├── val/         # 验证集图片(训练中评估精度)
│   └── test/        # 测试集图片(最终模型测试)
├── labels/          # 存放标注文件(与图片一一对应)
│   ├── train/       # 训练集标注(.txt 格式)
│   ├── val/         # 验证集标注
│   └── test/        # 测试集标注
└── data.yaml        # 数据集配置文件

在完成数据集划分后,需要对图片中的目标进行标注,为模型提供学习依据。LabelImg 是 YOLO 模型最常用的开源标注工具,支持直接输出模型训练所需的标准标注格式。通过该工具按下W键框选出图片中的目标并指定类别后,工具会自动生成与图片同名的 .txt 标注文件,并严格匹配 YOLO 格式要求,无需手动转换,直接满足训练需求。

标注工具Labelimg的安装与使用

完成图片标注后,所有图像和 .txt 标签已一一对应。为了快速、随机地将数据按比例划分为训练集、验证集、测试集,我们可以编写 Python 脚本自动完成文件复制与分类,避免手动操作的误差。

import os
import random
import shutil

# 1. 配置路径与划分比例
image_dir = 'images'       # 原始图片存放目录
label_dir = 'labels'      # 原始标签存放目录
output_root = "datasets"  # 输出数据集根目录
split_ratio = [0.8, 0.1, 0.1]  # 训练集:验证集:测试集 = 8:1:1
image_exts = ('.jpg','.jpeg','.png','.bmp')  # 支持的图片格式

# 数据集类型
sets = ['train','val','test']

# 2. 创建输出文件夹结构
for setname in sets:
    img_dest = os.path.join(output_root, setname, "images")
    label_dest = os.path.join(output_root, setname, "labels")
    os.makedirs(img_dest, exist_ok=True)
    os.makedirs(label_dest, exist_ok=True)

# 3. 读取并打乱所有图片文件
image_files = [f for f in os.listdir(image_dir) if f.endswith(image_exts)]
random.shuffle(image_files)  # 随机打乱,保证数据分布均匀
total = len(image_files)
print(f"发现 {total} 个图像文件")

# 4. 计算各数据集数量
train_num = int(total * split_ratio[0])
val_num = int(total * split_ratio[1])
test_num = total - train_num - val_num
print(f"划分结果: 训练集 {train_num} 个,验证集 {val_num} 个,测试集 {test_num} 个")

# 5. 复制文件到对应目录
for idx, img_name in enumerate(image_files):
    # 判断当前图片属于哪个集合
    if idx < train_num:
        set_name = "train"
    elif idx < train_num + val_num:
        set_name = "val"
    else:
        set_name = "test"
    
    # 复制图片
    src_img = os.path.join(image_dir, img_name)
    dest_img = os.path.join(output_root, set_name, "images", img_name)
    shutil.copy2(src_img, dest_img)

    # 复制对应的标签文件
    label_name = os.path.splitext(img_name)[0] + '.txt'
    src_label = os.path.join(label_dir, label_name)
    if os.path.exists(src_label):
        dest_label = os.path.join(output_root, set_name, "labels", label_name)
        shutil.copyfile(src_label, dest_label)
    else:
        print(f"警告:{label_name} 标签文件缺失,跳过复制!")

print("数据集划分完成!结果存储在 ./datasets 目录")

生成目录结构如下

datasets/
├── train/
│   ├── images/  # 训练集图片
│   └── labels/  # 训练集标签
├── val/
│   ├── images/  # 验证集图片
│   └── labels/  # 验证集标签
└── test/
    ├── images/  # 测试集图片
    └── labels/  # 测试集标签

数据集划分完成后,需要编写 YAML 配置文件,让 YOLO 模型能够正确读取数据。该文件的核心作用是告诉模型数据集的存储路径、需要检测的目标类别总数,以及与标注时完全一致的类别名称,确保模型训练时能够正确匹配标签。

path: ./datasets
train: train/images
val: val/images
test: test/images
nc: 3
names: ['类别名1',"类别名2","类别名3"]

模型训练

数据集与配置文件准备完毕后,即可通过 Python 脚本启动模型训练。我们加载官方预训练模型,传入数据集配置文件与训练参数,模型会自动开始迭代学习。训练过程中,卷积网络会不断优化权重,最终输出适用于自定义场景的检测模型。

import os
import yaml
from ultralytics import YOLO

def main():
    # 项目根目录
    project_dir = "."
    # 数据集配置文件路径
    data_config_path = os.path.join(project_dir, "data.yaml")

    # 加载 YOLO11 预训练模型
    model = YOLO("yolo11n.pt")

    # 训练参数配置
    train_params = {
        "data": data_config_path,   # 数据集配置文件
        "epochs": 13,              # 训练迭代轮数
        "batch": 10,               # 每次训练的批次大小
        "imgsz": 640,              # 输入图像尺寸
        "device": "cpu"            # 使用 CPU 训练(有 GPU 可改为 0)
    }

    # 启动训练
    results = model.train(**train_params)

if __name__ == '__main__':
    main()

训练完成后,程序会自动生成 runs 目录,训练相关日志、参数与模型权重均保存在该目录下。在训练生成的 exp 文件夹中,会产生 best.ptlast.pt 两个权重文件。其中 best.pt 是训练过程中精度表现最优的模型权重,last.pt 为最后一轮迭代保存的权重,实际项目部署与检测应用中,通常优先选用 best.pt 最优模型。

模型评测

训练完成并获得最优模型 best.pt 后,即可将模型用于实际的目标检测任务。通过编写推理脚本,加载训练好的权重文件,对单张图片进行分析。模型会自动识别图像中的目标,输出目标类别、置信度、边界框坐标,并生成带标注的可视化结果图,同时在窗口中实时展示检测效果。

import cv2
import os
from ultralytics import YOLO

def test_png():
    model_path = "./weights/bch.pt"
    image_path = "./images/4.png"
    output_dir = "./runs/test_png"

    os.makedirs(output_dir, exist_ok=True)

    if not os.path.exists(image_path):
        raise FileNotFoundError(f"图片不存在 {os.path.abspath(image_path)}")
    if not os.path.exists(model_path):
        raise FileNotFoundError(f"模型不存在 {os.path.abspath(model_path)}")

    model = YOLO(model_path)
    print(f"模型加载成功: {os.path.abspath(model_path)}")

    detector_params = {
        "conf": 0.5,
        "iou": 0.45,
        "device": "cpu",
    }

    print(f"\n正在检测图片: {os.path.abspath(image_path)}")
    result = model(image_path, **detector_params)

    for result in result:
        img_name = os.path.basename(image_path)
        output_path = os.path.join(output_dir, f"detected_{img_name}")
        result.save(output_path)

        annotated_img = result.plot(
            labels = True,
            conf = True,
            line_width = 2,

        )

        display_img = annotated_img
        cv2.imshow("result", display_img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

        boxes = result.boxes
        print(f"\n图片中检测到{len(boxes)}个目标")
        for i , box in enumerate(boxes):
            cls_id = int(box.cls[0])
            cls_name  = model.names[cls_id]
            conf = float(box.conf[0])
            xyxy = box.xyxy[0].tolist()

            print(f"目标{i+1}")

            print(f"类别:{cls_name}")
            print(f"置信度:{conf:.2f} ({conf*100:.2f}%)")

        print(f"\n标注结果已保存至:{os.path.abspath(output_path)}")
    print("\n检测完成")

if __name__ == '__main__':
    test_png()

除了对单张图片进行检测外,我们还可以利用训练好的模型,对 ** 整个测试集(test set)** 进行批量自动化评估。通过读取 data.yaml 配置文件,模型自动加载测试集中的所有图片,批量完成目标检测。

该过程不仅会输出精确率、召回率、mAP等量化指标,还会自动保存所有图片的检测标注结果,实现对模型整体性能的全面统计与评估。同时也可批量对大量图片进行自动推理,统计各类目标的检测数量、识别准确率、目标分布情况等数据,实现规模化图像智能分析与数据统计。

import os
import yaml
from ultralytics import YOLO

def test_sets():
    # 1. 配置路径
    project_root = "."  # 项目根目录
    model_path = os.path.join(project_root, "weights", 'bch.pt')  # 最优模型
    data_config_path = os.path.join(project_root, 'data.yaml')   # 数据集配置
    result_save_path = os.path.join(project_root, 'runs', 'test_sets')  # 结果保存

    # 创建结果保存文件夹
    os.makedirs(result_save_path, exist_ok=True)

    # 2. 读取配置,获取测试集路径
    with open(data_config_path, 'r', encoding='utf-8') as f:
        data_config = yaml.safe_load(f)
        # 自动拼接测试集图片路径
        test_dir = os.path.join(data_config.get('path', '.'), data_config.get('test', "test/images"))
        print(f"测试集实际路径:{test_dir}")

        if not os.path.exists(test_dir):
            raise FileNotFoundError(f"测试集不存在:{test_dir}")

    # 3. 加载训练好的模型
    if not os.path.exists(model_path):
        raise FileNotFoundError(f"模型不存在:{model_path}")
    model = YOLO(model_path)
    print(f"模型加载完成:{model_path}")

    # 4. 批量评估参数配置
    val_params = {
        "data": data_config_path,    # 数据集配置
        "split": "val",              # 评估集:val 验证集 / test 测试集
        "device": "cpu",             # 使用 CPU
        "save": True,                # 保存检测后的图片
        "save_dir": result_save_path,# 结果保存目录
        "plots": True,               # 生成评估曲线
        "verbose": True,             # 打印详细日志
    }

    # 5. 启动批量评估
    metrics = model.val(**val_params)
    print("测试集批量评估完成!")

if __name__ == '__main__':
    test_sets()

训练完成后,模型会自动生成一系列评估文件,帮助我们从量化与直观两个维度判断模型性能。性能指标曲线包括精确率、召回率、PR 曲线与 F1 分数曲线,清晰反映模型在不同置信度下的检测能力;混淆矩阵则能帮助我们定位类别识别中的混淆问题。同时,模型会输出验证集的真实标注图与预测结果对比图,直观展示模型对图像目标的检测效果,为后续参数调整与数据优化提供明确依据。

核心曲线文件

混淆矩阵文件

YOLO卷积网络优化

YOLOv11-GSF

YOLO 模型常用专业术语通俗解释

1. 鲁棒性

含义:模型在复杂、干扰、未知场景下依旧能稳定准确检测的能力。

通俗理解

光线变暗、遮挡目标、背景杂乱、拍摄角度变化、图片模糊时,模型不误检、不漏检,依然能正常识别,就叫鲁棒性强。

举例:白天训练的模型,晚上暗光下也能准确识别人物,说明鲁棒性好。

2. 预训练权重

官方在大型通用数据集上提前训练好的模型参数,不用从零开始训练,拿来迁移学习微调即可,收敛更快、精度更高。

3. 微调训练

基于预训练权重,在自己的小众自定义数据集上继续训练,让模型学会识别专属类别,不用从头训练卷积网络。

4. 卷积神经网络 CNN

依靠卷积层提取图像特征(边缘、纹理、轮廓、深层语义特征),是 YOLO 模型的主干特征提取网络。

5. 特征提取

卷积网络逐层从图片里提取:浅层(线条、边缘)→中层(局部轮廓)→深层(目标整体形态、语义),让模型看懂物体是什么。

6. 边界框 Bounding Box

模型预测出的矩形框,框出图片中目标所在的位置。

7. 置信度 Confidence

模型预测结果的可信程度,取值 0~1。

比如置信度 0.85,代表模型有 85% 的把握认为这个目标是某类别。

设置conf=0.5,只保留可信度 50% 以上的检测结果。

8. 交并比 IOU / NMS

  • IOU:两个框(预测框和真实框)重叠面积的比值;
  • NMS 非极大值抑制:去掉同一目标重复多出的检测框,保留置信度最高的一个。

9. 精确率 Precision

预测出来的目标里,真正正确的比例,衡量模型误检多不多

10. 召回率 Recall

所有真实目标中,被模型成功找出来的比例,衡量模型漏检多不多

11. F1 分数

精确率和召回率的综合平均值,用来平衡误检和漏检,分数越高模型综合表现越好。

12. mAP 平均精度

目标检测核心评价指标,综合所有类别的识别精度,数值越接近 1,模型整体性能越强。

13. 过拟合

模型在训练集表现极好,但在验证集、测试集表现很差;只会死记训练图片,泛化能力差,陌生图片识别效果差。

14. 泛化能力

模型在从未见过的新图片、新场景上,依然能准确检测的能力,和鲁棒性高度相关。

15. 迭代 Epochs

训练轮数,每一轮 epoch 都会把整个数据集完整学习一遍,轮数适中模型收敛最佳。

16. Batch 批次

一次送入模型同时训练的图片数量,由电脑显存配置决定大小。

17. 归一化

把图片坐标、尺寸数值压缩到 0~1 之间,统一输入格式,方便卷积网络计算收敛。

18. 前向传播 / 反向传播

  • 前向传播:图片输入网络,模型给出预测结果;
  • 反向传播:计算预测和真实标签的误差,自动调整网络权重,让模型越来越准。

19. 权重参数

卷积网络里可学习的数值,训练过程就是不断更新权重,让模型学会目标特征。

20. 混淆矩阵

直观统计:每一类目标被正确识别、被错分成其他类的数量,用来分析类别混淆、识别错误原因。

21.模型后缀

1. 字母含义(尺寸从小到大)

  • n = Nano:极小、最轻量
  • s = Small:小型、轻量均衡
  • m = Medium:中型、平衡精度/速度
  • l = Large:大型、高精度
  • x = Extra Large:超大、最高精度

2. 核心区别(一眼看懂)

YOLOv8 典型对比(输入 640)

模型参数量计算量GFLOPsCOCO AP速度(CPU)适合场景
n~1.9M8.7~37%最快手机、树莓派、低功耗边缘
s~3.4M25.4~44%很快嵌入式、摄像头、实时检测
m~7.7M70.0~50%中等PC、边缘GPU、通用场景
l~16.2M162.0~54%较慢服务器、高精准需求
x~32.5M317.0~57%最慢云端、极致精度
  • 规律:n → x,越来越大、越来越准、越来越慢、显存占用越来越高

3. 结构上的本质差异

同一系列(如 YOLOv8)的 n/s/m/l/x 主干/Neck/Head 架构完全一样,只是:

  • 宽度缩放:卷积通道数依次变多
  • 深度缩放:卷积层数量依次变多
  • 结果:参数 & 计算量逐级上升
整理资料不易,觉得有帮助可以投喂下博主哦~感谢!
作者:Hueil
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 协议
转载请注明 文章地址 及 作者 哦~
暂无评论

发送评论 编辑评论


                
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇