拓冰建站拓冰建站
首页 / 资讯中心 / 正文

YOLO目标检测零基础入门:从训练到部署的全流程指南

YOLO 是目标检测领域最常用的算法系列之一零基础读者想上手最常见的卡点不是显卡不够而是不知道先学原理还是先跑代码选哪个版本以及训练数据从哪里来。目标检测本身要解决的问题很直接在一张图中找出所有目标的位置和类别。YOLO 的特殊之处在于它把“找位置”和“分类别”合并成一个前向计算过程因此推理速度快、工程化程度高成为新手接触目标检测时最合适的起点。这篇文章不打算堆一堆公式而是按“先建立整体认知再跑通最小推理然后训练自己的数据集最后导出到业务程序”的主线展开训练指标为 0、检测框重叠、初始参数量和最终参数量不一致、CPU 多进程推理变慢等常见现象也会专门拆开讲。1. 先建立YOLO的整体认知再决定要不要直接训练1.1 YOLO解决什么问题把检测变成一次回归先理解 YOLO 为什么快。早期目标检测常用两阶段思路先在图像上生成大量候选区域再对每个候选区域做分类和位置修正。这个过程准确但候选区域数量多计算开销大。YOLO 的全称是 You Only Look Once意思是只需要看一次图。它把图像划分成若干个网格每个网格负责预测中心点落在该网格里的目标。网络输出不再是“有没有目标”这样的二分类问题而是直接输出目标框的坐标、宽高和类别概率相当于把检测问题转换成回归问题。网格划分是理解 YOLO 的关键。假设输入图片是 640x640模型会把特征图划分成不同尺度的网格比如 80x80、40x40、20x20。小网格负责小目标大网格负责大目标。每个网格会预测若干个候选框然后通过置信度筛选和非极大值抑制去掉重复框。新版本 YOLO 在标签分配和检测头设计上有了很多变化比如 anchor-free 思路但“一次前向计算直接输出检测结果”这个核心没有变。初学者不需要把每个公式都推导一遍但要能回答两个问题YOLO 输出什么YOLO 如何把输出变成最终检测框。输出的是张量里面包含框的坐标、目标置信度和类别概率后处理要做的是过滤低分框、合并重叠框。后续调试模型时最常看的也是这几个环节。1.2 版本众多初学应该怎么选YOLO 有多个版本常见的有 YOLOv5、YOLOv8、YOLOv9、YOLO11以及学术社区里的各种改进版。版本多不代表必须全部学完。对零基础来说选择标准不是最先进而是资料多、坑少、能跑通。从工程化程度看YOLOv5 和 YOLOv8 都有比较完整的命令行工具和 Python 接口适合先跑通流程。YOLOv8 之后的版本在训练导出上更统一也内置了分类、检测、分割等任务。如果你只是学习目标检测建议先固定一个版本把“训练自己的数据”这条链路跑通再横向对比其他版本的差异。频繁切换版本会让新手分不清是代码问题还是版本差异。这里要强调的是不要一上来就看源码或论文。先把自己当成软件使用者用现成工具完成一次图片检测再去看模型结构。很多源码层面的概念比如 C2f 模块、SPPF、检测头解耦等到你有一次完整训练经验后再理解会容易很多。入门对象建议做法不建议做法完全没有接触过检测先用官方预训练权重跑图片推理直接读论文推导损失函数有 Python 基础但没跑过训练用官方配置训练小数据集一上来定制网络结构有训练经验想部署固定版本做导出和边缘设备测试频繁切换不同版本想做算法改进在理解检测头和损失后小步修改同时改主干、检测头、训练策略1.3 完整项目流程数据、训练、验证、导出、部署一个完整的 YOLO 项目不只是“跑通 train.py”这么简单。正常情况下流程是这样明确检测目标检测什么物体边界怎么定义。收集和清洗图片图片数量、分辨率、场景覆盖。标注数据把目标框出来标注成 YOLO 格式。规划数据集划分训练集、验证集、测试集。准备 YAML 配置数据集路径、类别名、类别数量。训练模型选择合适的预训练权重和超参数。验证模型看 mAP、混淆矩阵、典型失败案例。导出模型转成 ONNX 或其他部署格式。部署推理接入摄像头、视频流或业务程序。回归测试检查真实场景中的误检、漏检。很多初学者直接从第 6 步开始拿着别人的数据集训练完就认为项目完成。这样遇到真实数据时问题会立刻暴露。最好的做法是从第 2 到第 5 步认真做一次哪怕样本量很小也能把整条链路走通。后面所有调试问题最终基本都会回溯到数据质量上。2. 零基础起步环境准备与最小项目跑通2.1 先按学习环境准备依赖避免一上来就折腾 CUDA刚入门时不建议第一天就配 CUDA、cuDNN、NVIDIA 驱动。学习阶段用 CPU 跑一张图片推理完全够用。等开始训练自己的数据图片数量增加后再考虑 GPU 环境。推荐在项目目录里创建一个独立虚拟环境避免污染系统 Python。下面示例使用 conda也可以用 venvconda create -n yolo-learn python3.10 -y conda activate yolo-learn pip install -U pip pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu pip install ultralytics如果本机有 NVIDIA GPU并且已经安装好驱动可以安装 CUDA 版 PyTorch具体命令以 PyTorch 官网给出的版本为准。这里先不要混装 CPU 版和 GPU 版卸载重装反而容易出错。检查环境是否正常python -c import torch, ultralytics; print(torch.__version__); print(ultralytics.__version__)运行后能看到版本号即可。注意 ultralytics 包更新很快如果之后复现别人的训练结果最好把版本固定下来。2.2 下载预训练权重用一条命令跑通推理使用 ultralytics 的命令行工具可以先下载一张公开测试图片然后运行检测。第一次运行会自动下载权重文件耗时取决于网络情况。yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg如果因为网络原因无法下载可以手动下载权重文件再用本地路径指定。yolo predict model./yolov8n.pt source./bus.jpg执行完成后控制台会输出每张图的检测结果包括检测到的目标类别、置信度、框坐标以及结果保存位置。默认情况下会在runs/detect/predict目录下生成带标注框的图片。这一步的核心目的不是调参而是验证环境没问题。如果这一步能通过说明 torch、ultralytics、图像读取链路都正常。2.3 用 Python API 读取预测结果并理解关键参数命令行适合快速验证但要真正理解预测结果最好用 Python API。创建一个predict_demo.pyfrom ultralytics import YOLO model YOLO(yolov8n.pt) results model.predict( sourcebus.jpg, conf0.25, iou0.45, saveTrue, ) for r in results: print(图片尺寸:, r.orig_shape) print(检测框数量:, len(r.boxes)) print(类别编号:, r.boxes.cls.tolist()) print(置信度:, r.boxes.conf.tolist()) print(坐标xyxy:, r.boxes.xyxy.tolist())运行后可以看到一张图里有哪些目标。关键参数说明参数含义常见值调小/调大的影响conf置信度阈值0.25调低会保留更多低分框误检增加iouNMS 重叠阈值0.45调低会合并更多重叠框容易漏检调高可能保留重复框device推理设备cpu 或 0指定多个 GPU 可写 device[0,1]save是否保存结果图True不保存时只返回内存结果很多新手只看保存出来的图片觉得有框就行。建议把print的信息也看一下因为后续做程序调用时你真正需要的是坐标和置信度而不是一张画好框的图片。2.4 从图片到视频和摄像头验证最小闭环YOLO 的预测接口同样支持视频文件和摄像头流。命令如下yolo predict modelyolov8n.pt sourcetest.mp4 saveTrue yolo predict modelyolov8n.pt source0 showTruesource0表示读取本机摄像头。视频推理会比图片慢因为每一帧都要做一次前向计算。这里需要理解“模型预测”和“视频解码编码”是两件事。预测花的时间取决于模型大小、输入分辨率和硬件视频的读取、显示、保存花的时间取决于 OpenCV。跑通视频后已经完成了最小闭环你能用现成模型从不同来源拿到预测结果。对零基础来说这个阶段不需要自己训练先把“调用模型”这件事做熟练。3. 训练自己的数据集从标注到YAML配置3.1 标注流程与YOLO格式文件用自己的数据训练第一步是标注。YOLO 格式的标注文件是纯文本每一行对应一个目标类别编号 x_center y_center width height注意坐标是相对于图片宽高的归一化值取值在 0 到 1 之间。比如一张 1000x800 的图片某个目标框左上角在 (200, 160)宽高是 (100, 80)那么中心点 x 是 250/10000.25中心点 y 是 200/8000.25宽是 100/10000.1高是 80/8000.1对应文本行0 0.25 0.25 0.1 0.1手工写文本很累通常用标注工具完成。常见工具包括 LabelImg、CVAT、X-AnyLabeling、Roboflow 等。选择标准是能导出 YOLO 格式能方便地处理类别名称。标注时最容易犯的错误是“把所有目标都标成一个类”或者“只标了一部分目标”。目标检测模型学习的是标注样本的分布标注漏了模型就会漏检标注框不贴合模型回归出来的框就有偏差。少量数据时宁愿标注框紧一点也不要为了赶时间随手拉框。3.2 数据集目录结构与YAML配置训练时ultralytics 会读取一个 YAML 文件里面描述数据路径和类别名。推荐目录结构datasets/ plastic/ images/ train/ val/ labels/ train/ val/ plastic.yamlimages和labels必须一一对应。比如images/train/001.jpg对应labels/train/001.txt。如果图片没有目标标签文件可以是空文件但文件名要存在。plastic.yaml内容类似path: datasets/plastic train: images/train val: images/val names: 0: bottle 1: box 2: cuppath建议写成相对于当前运行目录的路径或者写成绝对路径。names中的顺序必须和标注文件里的类别编号一致。训练前可以把每个类别对应的图片数量统计出来避免某个类别样本过少。3.3 训练命令和关键超参数准备完成后用预训练权重做迁移学习yolo detect train dataplastic.yaml modelyolov8n.pt epochs50 imgsz640 batch16 device0如果不了解超参数先不要乱改。重点理解几个参数参数含义注意事项epochs训练轮数不是越大越好观察验证集指标是否饱和batch每次迭代样本数显存不够就调小但 batch 太小会影响收敛imgsz训练输入尺寸640 是常见默认值不要随意改小device训练设备没有 GPU 就写 cpu但训练会很慢patience早停轮数验证指标长期不提升会自动停止workers数据加载进程数Windows 上设置过大会报错cache是否缓存数据显存/内存够时能加快训练multiscale是否随机切换输入尺寸数据增强的一种可能提高泛化但会变慢multiscaletrue是 YOLO 训练时常见的增强选项它让模型在不同输入尺寸下训练提升对尺度变化的适应性。代价是每个 batch 的输入尺寸都可能变化训练时间会变长。小数据集首次训练时可以先不开等主流程跑通后再试。3.4 训练过程的观察点loss、指标和样本训练时控制台会输出类似下面的内容Epoch 1/50: 100%|...| loss1.234, box_loss0.8, cls_loss0.3, dfl_loss0.1不要只看总 loss 降没降要分别看分类损失、回归损失和 DFL 损失。如果某个损失不下降说明对应模块有问题。训练结束后runs/detect/train目录下会有results.png、confusion_matrix.png、val_batch*.jpg等文件。验证指标最常用的是 mAP50 和 mAP50-95。mAP50 是预测框和真实框的 IoU 超过 0.5 算正确的平均精度适合快速判断模型有没有学会mAP50-95 更严格衡量不同重叠程度下的表现。如果 mAP 一直很低先看验证集图片里的预测框是位置偏了还是类别分错还是根本没有框。训练完成后权重文件通常包括last.pt和best.pt。best.pt是根据验证集指标选出的最优模型不是最后一个 epoch 的模型。导出时优先使用best.pt。4. 初学者最常遇到的四个问题指标为0、重叠框、参数不一致、CPU慢4.1 训练指标全是 0一个非常典型的现象是训练过程能正常跑但每个 epoch 结束后 val 指标全是 0。很多新手怀疑是模型坏了但大多数情况下是数据问题。检查顺序如下确认images/train和labels/train里的文件是否一一对应。确认每个 txt 标签文件里的类别编号是否超出names长度。比如names只有 3 个类但标签中出现了class_id5验证指标会异常。确认标签坐标是否在 0 到 1 之间。有些标注工具导出的坐标是像素坐标直接放进 YOLO 训练会导致框范围错误。确认样本图片是否可正常读取。损坏图片会被跳过但会造成有效样本不足。确认val目录是否真的存在图片和标签。如果验证集为空指标自然为 0。可以在训练前写一段校验脚本from pathlib import Path for split in [train, val]: img_dir Path(fdatasets/plastic/images/{split}) lbl_dir Path(fdatasets/plastic/labels/{split}) for img in img_dir.glob(*.jpg): label lbl_dir / f{img.stem}.txt if not label.exists(): print(f缺失标签: {label})还可以统计每个标签文件里的类别号分布确保没有越界。4.2 预测框重叠或漏检推理结果里出现大量重叠框通常和 NMS 有关。NMS 的全称是非极大值抑制作用是当多个框都指向同一个目标时保留置信度最高的框去掉其他重叠框。如果后处理没有生效或者iou阈值设得过高重叠框会大量保留。检查方式看预测框的置信度是否集中在同一目标上。看results中的r.boxes.xyxy是否大量重叠。尝试调低iou比如从 0.45 调到 0.3。使用max_det限制每张图最大检测数量。results model.predict(sourcebus.jpg, conf0.25, iou0.3, max_det100)如果标签本身就是一个目标用了多个框标注模型会学出重复框。这种情况不是后处理问题而是标注问题。现象检查点常见原因重复框很多可视化预测框坐标NMS 未生效或 iou 阈值偏高目标很大但框很小查看标签归一化坐标标注坐标原点或宽高写错同一目标时断时续检查视频帧亮度变化光照变化导致置信度波动小目标漏检查看输入分辨率imgsz 过小时小目标特征丢失严重4.3 训练前后的参数量不一致有网友遇到“训练一开始统计的参数量和最后训练完得到的参数量不一致”这需要先明确统计口径。模型参数量通常指可训练参数的数量但不同方式统计的口径不同加载预训练权重时如果你加了分类头或换了主干网络参数量会变化。model.parameters()默认统计所有参数包括未更新的 BatchNorm 参数。分布式训练时模型可能被DistributedDataParallel包装统计口径会包含额外结构。导出 ONNX 时检测头后处理部分可能被剥离参数量又会变化。如果只是在训练前后打印sum(p.numel() for p in model.parameters())训练过程中基本不会变。不一致多半是你在不同阶段加载了不同模型。比如训练开始时打印的是带预训练分类头的模型训练完保存时只保存了检测模型或者代码里新建了一个YOLO(yolov8n.yaml)而不是YOLO(yolov8n.pt)。排查方式python -c from ultralytics import YOLO; mYOLO(best.pt); print(sum(p.numel() for p in m.model.parameters()))如果这个数字和训练日志里的不一致检查是不是用了不同的 yaml 或 pt。4.4 CPU 多进程推理反而更慢有痛点描述“YOLO CPU 多进程慢 1.4 秒”这在实际项目中很常见。直觉上多进程应该更快但 YOLO 推理是计算密集型任务CPU 上每个进程都要加载模型都要分配内存还要进行同样的矩阵运算。如果机器核数有限多进程反而会互相争抢 CPU 资源。处理思路不要为每一帧创建新进程应创建常驻进程池。模型加载应在子进程启动时完成一次不要每次推理都加载。使用 PyTorch 的 CPU 线程设置避免进程内再开过多线程。考虑用批量预测替代多进程一次预测多张图。CPU 部署时优先导出 ONNX 并使用 OpenVINO 等加速库。yolo predict modelyolov8n.pt sourcetest.mp4 devicecpu如果程序里使用 Python 原生multiprocessing可以先写一个最小复现脚本测量单进程推理耗时和双进程推理耗时。很多时候慢的原因是内存带宽或磁盘读取而不是模型本身。5. 从训练到应用检测头、主干网络和模型导出5.1 理解分类头、回归头、anchor 与 anchor-freeYOLO 检测头通常分为分类头和回归头。分类头输出每个候选框属于各个类别的概率回归头输出目标框的中心点、宽高在部分版本里还有分布损失相关输出。解耦检测头的好处是分类和回归任务不用共享太多参数训练更稳定。anchor 是早期 YOLO 用来预设候选框尺寸的机制。你可以把 anchor 理解成一组“常见框的模板”模型在模板基础上修正位置和尺寸。anchor-free 则不再依赖固定模板而是直接预测目标中心点和到边界的距离。新版本 YOLO 很多采用 anchor-free 思路减少超参数对小目标也有更好表现。有一个相关概念是 one-to-many 和 one-to-one。one-to-many 指训练时一个真实目标可以同时分配给多个预测框学习信号更强one-to-one 指推理时一个目标只保留一个预测框减少 NMS 后处理依赖。不同版模型在训练和推理的标签分配策略上不同这也是为什么有些模型可以去掉 NMS有些模型一定要保留 NMS。初学者不需要在这里深入数学推导但要知道一个修改原则改主干、改检测头不只是改一个模块还要连带调整标签分配、损失计算和后处理。只换其中一个部分很可能训练不收敛。5.2 换主干网络和换检测头的风险判断网上有很多把 YOLO 的主干网络换成 VanillaNet、Swin Transformer、MobileNet 的实践。这样做有没有风险有而且主要风险不在代码层面而在训练难度。YOLO 预训练权重的结构和你的新模型结构不一致时迁移学习就失效了。很多新手直接modelYOLO(yolov8n.pt)然后把内部模块替换成自己的结构。实际训练时模型一开始就会报错或者从头开始训练收敛非常慢。替换主干前需要确认三件事新主干输出的特征图尺寸和通道数是否满足检测头输入要求。新主干是否具备多尺度特征输出即有没有类似 P3、P4、P5 的特征金字塔结构。换掉主干后是否还有可用的预训练权重。没有预训练权重就需要更大的数据量否则精度会非常差。换检测头同样有风险。检测头需要接收特征图输出类别分支和回归分支修改后要保证损失函数能正确读取输出。更合理的做法是先控制变量想改进精度先调数据增强和训练策略想改进速度先换更小的基础模型确实想改网络结构至少在小数据集上做对比实验。改动类型风险等级建议换更小的同系列模型低直接选择官方 nano/small 版本修改输入尺寸低按目标大小调整 imgsz修改数据增强策略中分多组实验对比更换主干网络高先验证特征图兼容性更换检测头高需要同步修改损失函数和后处理5.3 导出 ONNX 模型给外部程序调用训练好的best.pt不能直接给 C 或 Java 程序使用通常要先导出为 ONNX。ONNX 是一种开放的模型交换格式很多平台的推理引擎都能加载。yolo export modelbest.pt formatonnx opset12 dynamicTruedynamicTrue表示允许输入尺寸变化如果业务中固定输入尺寸可以不开启推理效率更高。导出完成后可以用 ONNX Runtime 做一次验证import onnxruntime as ort import numpy as np from PIL import Image session ort.InferenceSession(best.onnx) input_name session.get_inputs()[0].name image np.random.randn(1, 3, 640, 640).astype(np.float32) outputs session.run(None, {input_name: image}) print(len(outputs))ONNX 输出的是模型原始张量后处理还需要自己写。如果用formatonnx导出一般输出包含检测框信息但具体格式随模型版本不同。导出后一定要用一张真实图片对比原模型的预测结果确保前后处理逻辑一致。Qt 等桌面程序调用时常见做法是 C 集成 ONNX Runtime把预处理、推理、后处理封装成接口。这里要注意的是图像预处理读入图片后要缩放到模型输入尺寸做归一化再按模型要求的通道顺序排列。很多“导出后检测不出目标”的问题都出在预处理顺序不一致。5.4 边缘设备部署从 RK3588 案例看部署链路有热词提到 RK3588 部署 YOLO、RV1126 部署 YOLO这类设备部署和电脑端有本质区别。边缘设备通常有 NPU但 NPU 不一定支持所有算子。常见的部署链路是把 PyTorch 模型导出为 ONNX。把 ONNX 转换为平台支持的模型格式比如 RKNN。在转换工具中做量化常见为 INT8 量化。在开发板上验证精度和速度。把预处理、后处理写成 C 或 C 程序。转换工具链版本和 PyTorch 版本必须匹配否则会出现算子不支持或输出结果错误。部署前要确认平台支持的 ONNX opset 版本、量化方式和模型输入尺寸。不要在大模型转换失败后才看文档先在开发板上跑通官方提供的最小示例再替换成自己的模型。边缘设备部署的难点不在“跑起来”而在“精度不下降太多”和“内存占用可控”。INT8 量化通常会让 mAP 有轻微下降这时候要对比量化前后的检测结果决定是否需要保留某些算子为浮点计算。6. 最佳学习路线与可复用清单6.1 按“推理、训练、调优、部署”四阶段推进零基础学 YOLO不要按论文顺序推进推荐按这四步推理阶段用预训练模型检测图片、视频、摄像头目的是熟悉输入输出格式。训练阶段准备自己的小数据集跑通训练命令理解 YAML、标签、权重文件。调优阶段针对某个实际目标提高精度试数据增强、调超参数、观察 mAP。部署阶段导出 ONNX接入到程序或设备验证真实场景效果。每个阶段要有明确结果。推理阶段的成果是“能用脚本输出图片和坐标”训练阶段的成果是“best.pt 在验证集上达到可用值”调优阶段的成果是“对比实验表”部署阶段的成果是“外部程序能稳定调用”。6.2 项目启动前的数据检查清单开始训练前按下面的清单逐项确认[ ] 图片是否存在损坏文件能否用 OpenCV 正常读取。[ ] 标签文件和图片文件是否一一对应。[ ] 类别编号是否连续是否从 0 开始。[ ] 标签坐标是否已经归一化是否都在 0 到 1 范围内。[ ] 每个类别样本数量是否平衡最少类别有没有足够样本。[ ] 训练集和验证集是否有重叠。[ ] YAML 中的names顺序是否和标注工具导出的编号一致。[ ] 验证集图片是否覆盖不同场景而不是只选容易识别的图。这个清单能避免大量无意义训练。6.3 每周练习任务设计如果你打算用一到两个月入门每周给自己安排一个小任务会更有节奏感。第一周用 CPU 环境运行预训练模型完成图片和视频推理画出检测框理解 conf 和 iou 的作用。第二周找 100 到 200 张自己的图片标注 1 到 3 个类别整理成 YOLO 格式跑通一次完整训练。第三周做小规模调参实验固定 epochs 和 imgsz调整 batch 和增强选项比较 mAP 变化。第四周导出 ONNX写一个 ONNX Runtime 推理脚本对比原模型的输出。第五周尝试解决一个具体问题比如小目标检测差、重叠框多、CPU 推理慢。第六周把完整流程整理成文档作为后续项目模板。练习的关键是每次只改一个变量。不要同时换数据集、换模型、换超参数否则出了问题根本没法定位。6.4 遇到问题时的判断顺序实际项目按以下顺序排查效率会高很多输入图片是否能正常读取路径是否正确。标注文件和类别编号是否正确。YAML 路径和目录结构是否和代码一致。模型权重是否加载成功是否误用了别人的权重。推理参数是否合理conf 和 iou 是否设置过低或过高。数据加载 worker 数量和内存是否足够。导出模型时 opset、dynamic、量化参数是否匹配。YOLO 的问题绝大多数不是网络结构问题而是数据问题和环境问题。遇到指标为 0先看标签遇到检测不到目标先用官方权重跑同一张图遇到导出后结果不对先对比原模型和 ONNX 的输出差异。学会用最小实验定位问题比多跑几个模型更有价值。上面四阶段路线不是终点。跑通一个项目后可以把基础模型换掉尝试旋转目标检测、实例分割、多任务训练或者把检测结果接入业务系统。那时你再回头看 YOLO 的网络结构、损失函数和标签分配会发现之前很多抽象概念都已经变成自己踩过的坑。对零基础来说真正的进步不在于背下多少概念而在于完整跑通项目后遇到问题能判断该看数据、看日志还是看模型结构。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门