初识yolo视觉检测
一、yolo环境搭建
YOLO 环境搭建的主流方案目前以 Ultralytics YOLOv8/v11 为主(同时兼容 v3/v5 旧版),以下是完整的搭建流程:
1.1 系统要求
| 项目 | 最低配置 | 推荐配置 |
| Python | 3.8 | 3.10 - 3.11 |
| CUDA(GPU训练) | 11.2 | 12.1+ |
| PyTorch | 1.8 | 2.0+ |
| 显存 | 4GB | 8GB+ |
CUDA和Python有版本对应关系,如果你的CUDA版本是13.0,那Python至少是3.10版本。纯 CPU 推理可跳过 CUDA 安装,但速度较慢。
1.2 搭建步骤
1.2.1. 创建虚拟环境(强烈建议)
|
1 2 3 4 |
# 创建环境 conda create -n yolov8 python=3.10 -y # 激活环境 conda activate yolov8 |
1.2.2. 安装 PyTorch
查询CUDA版本
|
1 |
nvcc --version |
根据你的硬件选择对应命令:
有 NVIDIA GPU(以CUDA 12.1为例):
|
1 |
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 |
仅 CPU:
|
1 |
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu |
1.2.3. 安装 Ultralytics(推荐方式)
|
1 |
pip install ultralytics |
这会同时安装 ultralytics + yolov8 + 所有依赖(OpenCV、NumPy、Pillow、PyYAML 等)。
1.2.4. 验证安装
创建一个test.py文件,放置到你用户目录下面
|
1 2 3 4 5 6 7 8 9 |
# test.py from ultralytics import YOLO # 加载预训练模型 model = YOLO("yolov8n.pt") # 推理测试 results = model("https://ultralytics.com/images/bus.jpg") results[0].show() |
运行:
|
1 |
python test.py |
若弹出检测框图片,说明环境搭建成功。过程中会检测是否存在yolov8n.pt,如果不存在会自动下载该文件。
1.3 可选:源码安装(需二次开发时)
|
1 2 |
git clone https://github.com/ultralytics/ultralytics.gitcd ultralytics pip install -e . |
二、Label Studio图片标注
Label Studio 是一个开源的多模态数据标注平台,支持图像、文本、音频、视频、时序等标注任务。以下是几种主流部署方式:
2.1 pip 安装
还是在刚才的yolov8环境中执行安装命令。
|
1 2 3 4 5 |
# 安装 pip install label-studio # 启动 label-studio start |
2.2 标注步骤
2.2.1. 登录Label Studio
需要注意,默认的admin账户无法登录,需要自己创建一个账户。
2.2.2. 创建新项目
登录后点击 「Create Project」
填写 Project Name 和 Description
点击 「Save」
2.2.3. 配置标注模板(Labeling Interface)
这是最关键的一步,决定你要做什么类型的标注。
进入项目后,点击右上角 「Settings」→「Labeling Interface」
点击「Browse Templates」选择预设模板或自定义 XML:
| 任务类型 | 推荐模板 |
| 图像目标检测 / 实例分割 | Object Detection with Bounding Boxes |
| 图像语义分割 | Semantic Segmentation with Masks |
| 图像分类 | Image Classification |
| 文本分类 | Text Classification |
| 命名实体识别(NER) | Named Entity Recognition |
| 音频转录 | Audio Transcription |
| 视频标注 | Video Object Tracking |
| 关键点检测 | Keypoint Labeling |
这里我们选择「Object Detection with Bounding Boxes」
自定义标签名称(Labels):
可以在Code模板中修改例如:
|
1 2 3 4 5 6 7 8 |
<View> <Image name="image" value="$image"/> <RectangleLabels name="label" toName="image"> <Label value="person" background="#FFA39E"/> <Label value="car" background="#D4380D"/> <Label value="dog" background="#FFC069"/> </RectangleLabels> </View> |
标签数据量不大的话,可以使用Visual,删除原有的Labels,添加新的标签名称,我这里只添加了一个红旗。
点击 「Save」
2.2.4. 导入数据
返回项目页,点击 「Import」按钮
选择导入方式:
| 方式 | 操作 |
| 直接上传 | 拖拽文件或点击上传(支持图片、音频、文本、CSV、JSON 等) |
| 本地存储 | Settings → Cloud Storage → 添加 Local Storage 路径 |
| 云存储 | 支持 AWS S3、Azure Blob、GCS |
| URL 导入 | 准备 JSON/CSV 文件,其中包含媒体文件的 URL |
导入完成后,数据会出现在 「Data Manager」 中
2.2.5. 开始标注
点击 「Label All Tasks」 或进入 「Data Manager」 点击单条数据
标注界面操作:
☆图像目标检测(Bounding Box)
底部选择标签(如 红旗)
在图像上拖拽绘制矩形框
可调整框的大小和位置
按 Submit 提交
☆图像分割(Polygon / Brush)
选择标签后,用多边形工具逐点勾勒轮廓
或选择画笔工具涂抹区域
按 Ctrl+Z 撤销,Ctrl+Shift+Z 重做
☆文本分类 / NER
文本分类:直接点击类别标签
NER:选中文字片段,点击实体标签
快捷键(通用)
| 快捷键 | 功能 |
| 1, 2, 3... | 快速切换标签 |
| Ctrl + Enter | 提交(Submit) |
| Alt + Enter | 跳过(Skip) |
| Ctrl + Z | 撤销 |
| Del / Backspace | 删除选中标注 |
| ← → | 切换前后任务 |
确保被标注过。
2.2.6. 导出标注数据
进入项目,点击 「Export」,选择导出格式:
| 任务类型 | 推荐格式 | 说明 |
| 目标检测 | YOLO | 直接用于 YOLOv5/v8 训练 |
| 目标检测 | COCO | 通用格式,兼容多数框架 |
| 目标检测 | Pascal VOC XML | 经典格式 |
| 分割 | JSON(MSCOCO) | 含 polygon/mask 信息 |
| 分类 | CSV | 简单表格 |
| 分类 | JSON-Min | 轻量 JSON |
点击 「Export」 下载压缩包
系统会自动生成训练yolo所需要的images、labels以及classes文件。
三、训练yolo
3.1 准备工作
3.1.1. 整理目录结构
YOLOv8 要求的数据集结构:
|
1 2 3 4 5 6 7 8 |
my_dataset/ ├── train/ │ ├── images/ # 训练图片 │ └── labels/ # 训练标注 ├── val/ │ ├── images/ # 验证图片 │ └── labels/ # 验证标注 └── data.yaml |
我们需要通过一个python脚本实现目录结构的转换,创建一个LabelStudio.py文件。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
import os import shutil import random from pathlib import Path # ========== 配置路径 ========== src_images = Path("label-studio-export/images") # 导出文件的 images 目录 src_labels = Path("label-studio-export/labels") # 导出文件的 labels 目录 dataset_dir = Path("my_dataset") # 输出目录 split_ratio = 0.8 # 80% 训练,20% 验证 # ========== 创建目录 ========== for split in ["train", "val"]: (dataset_dir / split / "images").mkdir(parents=True, exist_ok=True) (dataset_dir / split / "labels").mkdir(parents=True, exist_ok=True) # ========== 获取文件列表并打乱 ========== images = sorted([f for f in src_images.iterdir() if f.suffix.lower() in [".jpg", ".jpeg", ".png", ".bmp"]]) random.seed(42) random.shuffle(images) split_idx = int(len(images) * split_ratio) train_images = images[:split_idx] val_images = images[split_idx:] # ========== 复制文件 ========== def copy_files(img_list, split): for img_path in img_list: label_path = src_labels / (img_path.stem + ".txt") # 复制图片 shutil.copy(img_path, dataset_dir / split / "images" / img_path.name) # 复制标签(如果存在) if label_path.exists(): shutil.copy(label_path, dataset_dir / split / "labels" / label_path.name) else: print(f"⚠️ 警告:{img_path.name} 没有对应标签文件") copy_files(train_images, "train") copy_files(val_images, "val") print(f"✅ 划分完成:训练 {len(train_images)} 张,验证 {len(val_images)} 张") print(f"📁 数据集路径:{dataset_dir.absolute()}") |
执行这个py文件
|
1 2 3 |
(yolov8) C:\Users\Administrator>python LabelStudio.py ✅ 划分完成:训练 3 张,验证 1 张 数据集路径:C:\Users\Administrator\my_dataset |
3.1.2. 编写 data.yaml
在 my_dataset/ 下创建 data.yaml,内容如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 数据集根目录(绝对路径或相对训练脚本的路径) path: C:/Users/Administrator/my_dataset/ # 训练/验证图片路径(相对于 path) train: train/images val: val/images # 类别数量 nc: 1 # 类别名称(按 class_id 顺序,与 Label Studio 中一致) names: 0: 红旗 |
注意:
path建议使用绝对路径,避免路径解析错误names中的顺序必须与 Label Studio 中的class_id对应(可查看导出的classes.json确认)
3.2 开始训练
在YOLO 环境下(conda activate yolov8),然后运行go.py文件,文件中的 Python 代码如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from ultralytics import YOLO if __name__ == '__main__': model = YOLO("yolov8n.pt") model.train( data=r"C:\Users\Administrator\my_dataset\data.yaml", epochs=100, imgsz=640, batch=8, workers=4, device=0, name="my_project", exist_ok=True ) |
注意:训练过程中会下载模型,注意网络链接。https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo26n.pt
3.3 训练结果
训练完毕提示存储位置,由于我之前安装过StableDiffusion,存储位置变成SD下面了,我手动复制到C:\Users\Administrator。结果目录如下:
|
1 2 3 4 5 6 7 |
runs/detect/my_project/ ├── weights/ │ ├── best.pt # 最佳模型(用这个) │ └── last.pt # 最后一轮模型 ├── results.png # 损失曲线 ├── confusion_matrix.png └── args.yaml |
3.3 验证
通过运行check.py验证结果。
|
1 2 3 4 5 6 7 8 9 10 |
from ultralytics import YOLO if __name__ == '__main__': model = YOLO(r"runs\detect\my_project\weights\best.pt") metrics = model.val( data=r"C:\Users\Administrator\my_dataset\data.yaml", workers=0 # 或者保留 workers=4,但外面必须包 if __name__ == '__main__': ) print(f"mAP50: {metrics.box.map50}") |
四、注意事项
4.1 数据准备(最关键)
4.1.1. 标注质量
- 框要贴边:边界框应紧贴目标边缘,不要留大量空白,也不要裁掉目标部分
- 避免漏标:一张图里同类别目标必须全部标出,否则模型会学到"部分目标不需要检测"
- 避免重复框:同一目标不要打多个重叠框,会干扰 NMS
- 小目标也要标:如果目标小于 16×16 像素,考虑放大原图或换更高分辨率训练
4.1.2. 数据量建议
| 场景 | 每类最少图片 | 推荐图片 |
|---|---|---|
| 简单场景(单一背景) | 100~200 张 | 500+ |
| 复杂场景(多背景、多姿态) | 500 张 | 2000+ |
| 工业级部署 | 2000+ | 10000+ |
4.1.3. 数据集划分
- 训练集 : 验证集 = 8:2 或 7:3
- 验证集必须和训练集同分布(不要挑"好认的"放验证集)
- 如果数据极少,可用交叉验证,但 YOLO 通常直接划分即可
4.1.4. 图片多样性
- 不同角度、光照、背景、遮挡程度
- 包含负样本(没有目标的图片,标签文件夹放空
.txt或只放图片不标注),可减少误检
4.2 模型选择
| 模型 | 速度 | 精度 | 适用场景 |
|---|---|---|---|
yolov8n |
最快 | 较低 | 边缘设备、实时性要求高 |
yolov8s |
快 | 中等 | 一般部署 |
yolov8m |
中等 | 较高 | 平衡选择 |
yolov8l/x |
慢 | 最高 | 服务器、追求精度 |
建议:先用 n 或 s 快速验证 pipeline 是否通,再换大模型提精度。
4.3 训练参数调优
4.3.1. 核心参数
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
model.train( data="data.yaml", epochs=100, # 一般 100~300,看 loss 是否收敛 imgsz=640, # 默认 640;小目标多可试 1280 batch=16, # 越大越好,显存不够再降(8, 4) patience=50, # 早停:val mAP 不提升就停,省时间 device=0, # GPU workers=4, # Windows 下必须包在 if __name__=='__main__' 里 pretrained=True, # 必须 True,预训练权重极大提升效果 amp=True, # 混合精度,省显存且加速 mosaic=1.0, # 数据增强,小数据集建议开启 close_mosaic=10, # 最后 10 epoch 关闭 mosaic,稳定收敛 ) |
4.3.2. 学习率(lr)
- 默认
lr0=0.01对大部分情况够用 - 如果数据集很小(<500 张),尝试
lr0=0.001或lrf=0.001 - 如果 loss 震荡不下降,降低 lr;如果 loss 下降太慢,适当提高
4.4 数据增强策略
YOLO 内置增强通常够用,但可根据场景调整:
| 增强 | 作用 | 注意 |
|---|---|---|
mosaic=1.0 |
四图拼接,增加场景复杂度 | 小数据集必开,最后几 epoch 关掉 |
mixup=0.1 |
图像混合 | 目标检测一般 ≤0.2,太高会模糊 |
degrees=0.0 |
旋转角度 | 如果目标旋转多(如遥感),可设 10~30 |
fliplr=0.5 |
左右翻转 | 一般保持 0.5 |
hsv_h/s/v |
颜色扰动 | 默认即可,除非对颜色敏感 |
小目标优化:
imgsz=1280(或更高)- 如果用的是 YOLOv8,可尝试
yolov8n-p6或yolov8s-p6(P6 模型支持 1280 输入,多一个检测头)
4.5 训练过程监控
4.5.1. 看哪些指标?
box_loss:应持续下降,最后趋于平稳cls_loss:分类损失,同样应下降dfl_loss:分布焦点损失,下降即可metrics/mAP50:验证集 mAP@0.5,核心指标metrics/mAP50-95:更严格指标,最终看这一个
4.5.2. 判断训练状态
| 现象 | 诊断 | 处理 |
|---|---|---|
| train loss ↓,val mAP ↑ | 正常 | 继续训练 |
| train loss ↓,val mAP 不升或↓ | 过拟合 | 增加数据、增强、正则化(weight_decay)、降 lr |
| train loss 不降 | 欠拟合 | 增加 epochs、检查标注、提高 lr、换大模型 |
| mAP 波动大 | 数据太少或学习率太大 | 加数据、降 lr、增加 batch |