很多人入门目标检测,第一个接触的就是YOLO,但大多卡在第一步:要么环境装不对,要么数据集格式搞不清,要么训练全程报错,折腾两三天都跑不通一轮训练。其实只要流程走对,从零开始到跑出自己的检测模型,半天时间完全足够。
本文以目前工业界最主流的 YOLOv8 为例,全程采用实战视角,从环境搭建、数据集标注、配置编写到模型训练、推理测试,每一步都附带操作命令与避坑提醒,跟着步骤走就能完整跑通第一个属于自己的YOLO项目。
先看完整的执行流程:
一、环境搭建:一步到位,少走弯路
环境是新手的第一道坎,90%的报错都来自版本不匹配。我们选用最稳定的组合,全程用pip安装,不需要编译源码。
1.1 基础环境要求
- Python:3.9 ~ 3.11(推荐3.10,兼容性最好,避免用最新的3.12,很多依赖包适配滞后)
- 操作系统:Windows / Linux / macOS 均可
- 显卡:有N卡优先用GPU训练,速度是CPU的10~50倍;没有N卡也可以用CPU跑通,只是速度慢
1.2 安装PyTorch
这是最容易装错的一步。有GPU和没GPU是两套安装命令,不要直接复制网上的通用命令。
第一步:先确认CUDA版本(有GPU的情况)
打开命令行输入nvidia-smi,查看右上角的CUDA Version,比如11.8、12.1等。安装的PyTorch版本不要高于这个CUDA版本。
第二步:执行安装命令
# CUDA 11.8 版本(最通用,推荐)pipinstalltorch==2.3.0torchvision==0.18.0 --index-url https://download.pytorch.org/whl/cu118# CPU版本(没有N卡选这个)pipinstalltorch==2.3.0torchvision==0.18.0安装完成后验证是否成功:
importtorchprint(torch.__version__)print(torch.cuda.is_available())# GPU版本返回True就是装对了1.3 安装YOLOv8核心库
YOLOv8 官方封装了 ultralytics 库,一行命令就能安装,不需要自己拉源码编译。
pipinstallultralytics==8.2.01.4 验证安装
命令行直接输入:
yolo version输出版本号就说明安装成功。这一步如果报错,大概率是Python环境不对,切换到对应的虚拟环境再试。
二、数据集制作:从标注到格式标准化
数据集是训练的根基,格式错了,后面训练要么报错,要么效果一塌糊涂。YOLO有自己严格的标注格式和目录规范,必须严格遵守。
2.1 标准数据集目录结构
YOLO要求图片和标注文件分开存放,训练集和验证集一一对应,目录结构必须严格按照下面的格式来,这是新手踩坑最多的地方。
核心规则:
- 图片和标注文件文件名必须完全一致,只是后缀不同(jpg对应txt)
- images和labels下的子目录名必须完全对应,都是train和val
- 建议总数据量至少50张以上,训练集:验证集按8:2划分
2.2 标注工具安装与使用
最适合新手的标注工具是 LabelImg,原生支持YOLO格式导出,不需要手动转换。
安装与启动:
pipinstalllabelimg labelimg# 启动工具标注操作步骤:
- 打开工具后,先点击左侧
Change Save Dir,选择标注文件保存的文件夹 - 点击
Open Dir,选择要标注的图片文件夹 - 标注格式切换为YOLO(工具默认是PascalVOC,一定要改)
- 按
W键画框,输入类别名称,标注完成后按Ctrl+S保存 - 按
D切换到下一张,重复标注即可
2.3 YOLO标注格式详解
每个txt标注文件对应一张图片,每一行代表一个目标,格式固定为5个数值:
类别序号 中心点x 中心点y 目标宽度 目标高度注意:所有坐标都是归一化后的值,也就是除以图片的宽高后得到的0~1之间的小数,不需要自己计算,标注工具会自动生成。
举个例子,一张640×480的图片,标注一个类别为0的目标:
0 0.5 0.5 0.2 0.3代表目标中心点在图片正中间,宽度是图片的20%,高度是图片的30%。
2.4 数据集制作建议
- 类别序号从0开始,依次递增,不要跳号
- 类别名称和顺序全程统一,训练集和验证集必须一致
- 尽量保证每个类别的样本数量均衡,不要某一类特别多、某一类特别少
- 图片尽量和实际检测场景一致,角度、光线、距离要有差异,不要全是一模一样的图
三、配置文件编写:只需改三个地方
数据集准备好后,需要写一个yaml配置文件,告诉YOLO数据集在哪里、有多少个类别、类别叫什么。这是训练的唯一入口文件。
3.1 配置文件模板
新建一个my_data.yaml文件,内容如下:
# 数据集根目录路径(建议写绝对路径,避免相对路径找不到的坑)path:D:/datasets/my_dataset# 训练集和验证集图片路径(相对于上面path的相对路径)train:images/trainval:images/val# 类别数量nc:2# 类别名称,顺序必须和标注时的序号一一对应names:-cat-dog3.2 核心避坑点
- 路径不要有中文和空格:Windows下尤其注意,中文路径大概率会报各种奇奇怪怪的错误
- nc和names数量必须一致:写了2个类别,names就必须有2个元素,多一个少一个都会训练异常
- 优先用绝对路径:新手搞不清相对路径层级,直接写完整的绝对路径,最稳妥
- yaml缩进严格:用空格缩进,不要用Tab,层级错了直接解析失败
四、开始训练:一行命令启动训练
环境和数据集都准备好,训练其实是最简单的一步,一行命令就能启动。新手推荐先用命令行方式,参数清晰,不容易出错。
4.1 启动训练命令
打开命令行,切换到yaml文件所在的目录,执行:
yolo detect trainmodel=yolov8n.ptdata=my_data.yamlepochs=100batch=16imgsz=640device=04.2 核心参数详解
不用记太多,掌握这几个核心的就够了:
| 参数 | 含义 | 新手建议 |
|---|---|---|
| model | 预训练模型 | 首选yolov8n.pt,体积最小、训练最快,入门足够用;效果要求高可以换s/m/l/x |
| data | 数据集配置文件 | 就是我们刚才写的yaml文件 |
| epochs | 训练轮次 | 小数据集100轮足够,太多容易过拟合 |
| batch | 批次大小 | 根据显存调,显存小就设8、4,显存大可以设16、32;报错OOM就调小 |
| imgsz | 输入图片尺寸 | 默认640,小目标可以调1280,显存不够就调416 |
| device | 训练设备 | 有GPU填0,没有GPU填cpu |
4.3 训练过程指标解读
启动后控制台会滚动输出日志,重点关注这几个指标:
- box_loss、cls_loss:损失值,越低越好,正常情况下会持续下降,最后趋于平稳
- mAP50:主要评价指标,代表IOU阈值0.5时的平均准确率,越高越好
- mAP50-95:综合评价指标,多个IOU阈值下的平均,更能体现模型综合能力
正常训练100轮的话,简单场景mAP50能到0.8以上,就说明效果不错了。
4.4 训练结果文件
训练完成后,所有结果都保存在runs/detect/train/目录下,核心文件:
weights/best.pt:验证集效果最好的权重文件,推理优先用这个weights/last.pt:最后一轮训练的权重results.png:训练曲线图,包含损失、mAP等所有指标的变化趋势confusion_matrix.png:混淆矩阵,看每个类别的识别准确率
五、推理测试:用自己训练的模型做检测
训练完拿到权重文件,就可以用来检测图片、视频了,同样一行命令搞定。
5.1 单张图片检测
yolo detect predictmodel=runs/detect/train/weights/best.ptsource=test.jpgsave=True检测完成后,带标注框的结果图会保存在runs/detect/predict/目录下。
5.2 视频检测
把source换成视频路径即可,支持mp4、avi等常见格式:
yolo detect predictmodel=runs/detect/train/weights/best.ptsource=test_video.mp4save=True5.3 Python代码调用
如果要集成到自己的项目里,用几行代码就能调用:
fromultralyticsimportYOLO# 加载自己训练的模型model=YOLO("runs/detect/train/weights/best.pt")# 执行检测result=model.predict("test.jpg",save=True)# 打印检测结果forboxinresult[0].boxes:print("类别:",result[0].names[int(box.cls)])print("置信度:",float(box.conf))print("坐标:",box.xyxy.tolist())六、新手高频踩坑排查
6.1 报错:Dataset not found / 找不到图片
90%是路径写错了。检查yaml里的path路径是否正确,图片和标注的目录结构是否严格对应,文件名是否完全一致。优先换成绝对路径试试。
6.2 训练全程用CPU,GPU不工作
先确认torch.cuda.is_available()返回True,返回False说明PyTorch装成CPU版本了,卸载重装GPU版本。训练命令里加上device=0强制指定GPU。
6.3 显存不足,报OOM错误
三个解决办法,按顺序试:
- 调小batch,比如从16改成8、4,甚至2
- 换更小的模型,比如从yolov8s换成yolov8n
- 调小imgsz,从640改成416
6.4 loss一直很大,训练不收敛
优先检查标注:是不是类别序号写错了、标注框画得不准、txt文件和图片不对应。其次检查nc类别数和实际标注是否一致,类别数不匹配是常见隐形坑。
6.5 中文路径各种奇奇怪怪的报错
直接把数据集和项目都放到纯英文路径下,不要有中文、空格、特殊字符,能解决80%的玄学报错。
写在最后
跑通第一个YOLO项目只是入门,真正的优化工作才刚刚开始。后续可以通过扩充数据集、调整超参数、更换更大的模型、加入数据增强等方式持续提升检测效果。
对于新手而言,最重要的不是一开始就追求最高的精度,而是先完整跑通全流程,建立对目标检测的整体认知。先跑起来,再逐步优化,是最高效的学习路径。