基础使用
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 格式要求,无需手动转换,直接满足训练需求。
完成图片标注后,所有图像和 .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.pt 与 last.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)
| 模型 | 参数量 | 计算量GFLOPs | COCO AP | 速度(CPU) | 适合场景 |
|---|---|---|---|---|---|
| n | ~1.9M | 8.7 | ~37% | 最快 | 手机、树莓派、低功耗边缘 |
| s | ~3.4M | 25.4 | ~44% | 很快 | 嵌入式、摄像头、实时检测 |
| m | ~7.7M | 70.0 | ~50% | 中等 | PC、边缘GPU、通用场景 |
| l | ~16.2M | 162.0 | ~54% | 较慢 | 服务器、高精准需求 |
| x | ~32.5M | 317.0 | ~57% | 最慢 | 云端、极致精度 |
- 规律:n → x,越来越大、越来越准、越来越慢、显存占用越来越高。
3. 结构上的本质差异
同一系列(如 YOLOv8)的 n/s/m/l/x 主干/Neck/Head 架构完全一样,只是:
- 宽度缩放:卷积通道数依次变多
- 深度缩放:卷积层数量依次变多
- 结果:参数 & 计算量逐级上升。








