
简介本资源面向计算机视觉方向的学习者与开发者聚焦YOLOv8在目标检测、语义分割与姿态估计三大任务上的工程实现适合具备一定深度学习基础、希望快速上手或复现多任务模型的中高级用户。压缩包共670个文件约1.94MB以358个Markdown文档、159个Python脚本、81个YAML配置为主辅以少量Rust、C、Jupyter Notebook、Shell及Dockerfile等文件覆盖模型配置、训练推理代码、环境部署与说明文档等用途。目前已有4886人学习下载。资源内含多任务推理示例与配置模板可帮助读者理解YOLOv8统一框架下检测、分割、姿态估计的代码组织方式掌握数据配置、模型加载与推理流程并借助Dockerfile与YAML快速搭建可复现的实验环境适合作为课程设计、项目开发或算法研究的参考素材。1. 一个模型干三件事yolov8-目标检测、语义分割、姿态估计到底怎么落地你拿到的需求大概率长这样一张图或一路视频流进去既要框出人和车又要标出路面和天空的像素区域还要把人的关节连成骨架。传统做法是训三个模型、维护三套推理管线、调三份预处理参数部署时显存和延迟直接翻倍。yolov8 把这三件事收进同一套 Ultralytics 框架检测、语义分割、姿态估计共用主干和训练入口换的只是 head 和数据集标注格式。这对一线工程师意味着一套环境配置、一套数据组织习惯、一套导出部署流程就能覆盖三类视觉任务。适合正在做智慧交通、安防巡检、运动分析、遥感解译的从业者也适合刚配完 yolov8 环境配置、想把手头标注数据一次跑通多任务的新手。下面按「先分清任务边界 → 再跑通最小训练 → 再处理踩坑 → 最后落到验证技巧」推一遍。2. 三个任务共用一套框架检测、分割、姿态的 head 差异与选型2.1 检测、分割、姿态估计在 yolov8 里到底差在哪yolov8 的检测任务输出的是每个目标的矩形框加类别和置信度head 是解耦头分类和回归分支分开。语义分割任务在检测头基础上多了一条 mask 分支输出的是每个实例的掩码注意 Ultralytics 的 segment 任务做的是实例分割不是 FCN 那种逐像素语义分割如果你要的是遥感图像语义分割那种整图类别图需要把实例掩码后处理成类别图或者换用专门的语义分割模型。姿态估计任务输出的是每个人体框内 17 个关键点的坐标和置信度head 的通道数从类别数变成关键点对数乘三。三者的主干和 neck 结构基本一致差异集中在 head 的输出通道和损失函数。检测用 CIoU 加 BCE分割多一个掩码 BCE 和 dice 损失姿态用 OKS 损失。这意味着你不需要为三个任务分别理解三套网络结构图只需要记住换任务就是换 head、换标注格式、换损失权重。2.2 任务选型什么时候用检测什么时候必须上分割或姿态判断标准很直接。只需要知道「有没有、在哪、是什么类别」检测就够了比如安全帽检测、车辆计数、遥感目标检测。需要知道目标的像素级轮廓比如路面裂缝面积、医学影像病灶边界、遥感影像语义分割里的建筑轮廓就上分割。需要知道人体关节位置和动作比如多人姿态估计、健身动作纠正、跌倒检测就上姿态。一个常见误区是拿检测框去估算姿态。框只能告诉你人在哪不能告诉你手抬没抬。另一个误区是拿实例分割去做整图语义分割后处理写复杂了还容易出错。我一般会先问一句下游到底要框、要掩码、还是要关键点答案定了任务就定了。2.3 用同一份环境跑通三个任务的最小命令环境配置是新手最容易翻车的地方。GTX1660Ti 跑 yolov8 完全够用但要注意 CUDA 版本和 PyTorch 的匹配。下面是最小可复现流程。# 创建环境python 版本建议 3.9 到 3.11 conda create -n yolov8 python3.10 -y conda activate yolov8 # 安装 pytorch以 cu118 为例具体按你的显卡驱动选 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralytics pip install ultralytics # 验证环境和模型能否加载 yolo checksyolo checks会打印环境信息重点看 CUDA 是否可用、版本是否匹配。如果这里显示 CPU only后面训练会慢到怀疑人生。# 检测任务最小训练 yolo detect train datacoco8.yaml modelyolov8n.pt epochs50 imgsz640 batch16 # 分割任务最小训练 yolo segment train datacoco8-seg.yaml modelyolov8n-seg.pt epochs50 imgsz640 batch16 # 姿态任务最小训练 yolo pose train datacoco8-pose.yaml modelyolov8n-pose.pt epochs50 imgsz640 batch16三个命令的差别只在 task 关键字和模型权重后缀。detect对应检测segment对应分割pose对应姿态。data指向数据集 yamlmodel指向预训练权重imgsz是输入尺寸batch是批大小。显存不够就把 batch 降到 8 或 4imgsz 降到 416 先跑通再往上加。2.4 数据集标注格式检测用框分割用多边形姿态用关键点检测的标注是每行class x_center y_center width height归一化到 0 到 1。分割的标注是class x1 y1 x2 y2 ...多边形点序列同样归一化。姿态的标注是class x_center y_center width height px1 py1 v1 ...每个关键点带可见性标志。这里有个血泪经验分割标注的多边形必须闭合且不能自交否则训练时 mask 损失会出 NaN。姿态标注的关键点数量必须和模型配置一致yolov8-pose 默认 17 点你标 14 点会直接报维度错误。# 检查标注文件是否符合 yolov8 格式的简易脚本 import os def check_label(path, taskdetect): with open(path) as f: for i, line in enumerate(f): parts line.strip().split() if task detect: assert len(parts) 5, f第{i}行检测标注应为5列实际{len(parts)}列 elif task segment: assert len(parts) 7 and (len(parts) - 1) % 2 0, f第{i}行分割标注列数不对 elif task pose: assert len(parts) 5 17 * 3, f第{i}行姿态标注应为56列实际{len(parts)}列 print(f{path} 格式检查通过) check_label(labels/train/0001.txt, taskdetect)这个脚本只做列数校验不做坐标范围校验。实际使用中还要检查坐标是否在 0 到 1 之间多边形点是否少于 3 个。少于 3 个点的多边形无法构成掩码训练时会报错。3. 训练自己的数据集从标注到 loss 曲线再到模型导出3.1 数据集目录结构和 yaml 配置怎么写yolov8 要求的数据集目录结构是固定的。检测、分割、姿态共用同一套目录逻辑只是 labels 内容不同。dataset/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml的写法path: /home/user/dataset train: images/train val: images/val # 检测和分割写类别名姿态写关键点配置 names: 0: person 1: car 2: helmet # 姿态任务额外加这一段 kpt_shape: [17, 3]path是数据集根目录train和val是相对路径。names的键必须从 0 开始连续。姿态任务的kpt_shape第一个数是关键点数量第二个数是每个点的维度3 表示 x、y、可见性。3.2 训练参数怎么设epochs、imgsz、batch 和学习率的实操取值新手最容易在参数上纠结。我一般这样起步epochs100imgsz640batch16lr00.01patience20。如果数据集小于 2000 张epochs可以降到 50lr0降到 0.001避免过拟合。yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/train \ nameexp1 \ exist_okTruepatience20表示 20 个 epoch 验证指标不提升就早停。project和name控制输出目录。exist_okTrue允许覆盖同名实验目录省得每次改名字。训练过程中想看 loss 曲线Ultralytics 会自动在runs/train/exp1下生成results.csv和results.png。如果你要自己画 yolov8 画损失函数曲线图直接读 csvimport pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/train/exp1/results.csv) df.columns df.columns.str.strip() plt.plot(df[epoch], df[train/box_loss], labelbox_loss) plt.plot(df[epoch], df[train/cls_loss], labelcls_loss) plt.plot(df[epoch], df[train/dfl_loss], labeldfl_loss) plt.xlabel(epoch) plt.ylabel(loss) plt.legend() plt.savefig(loss_curve.png)results.csv的列名前后可能有空格读进来先 strip。检测任务看 box_loss、cls_loss、dfl_loss分割任务多一个 seg_loss姿态任务看 pose_loss 和 kobj_loss。3.3 模型导出ONNX、TensorRT 和 RK3588 部署的前置准备训练完导出 ONNX 是最通用的做法RK3588 部署 yolov8 也通常先转 ONNX 再转 RKNN。# 导出 ONNX yolo export modelruns/train/exp1/weights/best.pt formatonnx imgsz640 opset12 simplifyTrue # 导出 TensorRT yolo export modelruns/train/exp1/weights/best.pt formatengine imgsz640 halfTrueopset12兼容性较好simplifyTrue会做图简化。TensorRT 导出加halfTrue用 FP16速度提升明显但精度可能略降。RK3588 部署时注意RKNN 对某些算子支持有限导出 ONNX 后建议先用 onnxsim 再转否则可能在转换阶段报不支持算子。4. 避坑与排查训练不收敛、显存爆了、导出失败怎么查4.1 训练 loss 不降反升现象前几个 epoch loss 正常下降之后突然飙升或震荡。原因通常是学习率太大或标注里有脏数据。解决先把lr0降到 0.001 再跑一轮如果还震荡用脚本抽查标注文件重点看有没有坐标超出 0 到 1 范围、类别号超出 names 范围、空标注文件。空标注文件会导致分类损失计算异常。4.2 显存不足报 CUDA out of memory现象训练启动几秒后报显存不足。原因batch 太大、imgsz 太大、或者模型选太大。解决按yolov8n → yolov8s → yolov8m的顺序降模型batch 从 16 降到 8 再降到 4imgsz 从 640 降到 416。另外检查是不是同时开了别的进程占显存nvidia-smi看一眼。4.3 分割训练 mask 损失出现 NaN现象分割任务训练几个 epoch 后 seg_loss 变成 NaN。原因多边形标注自交或点数量少于 3。解决写脚本过滤掉点数少于 3 的标注行自交检测可以用 shapely 库做多边形有效性校验。如果数据集里大量这种标注建议重新标注而不是硬训。4.4 姿态估计关键点全部预测到图像中心现象训练完推理所有关键点都挤在框中心附近。原因关键点可见性标志全标成了 0或者标注时关键点坐标没有归一化。解决检查标注文件里可见性列可见点标 2遮挡标 1不存在标 0。坐标必须是相对整图的归一化值不是相对框的。4.5 导出 ONNX 后推理结果和 PyTorch 不一致现象PyTorch 推理正常ONNX 推理框位置偏移或类别错乱。原因预处理不一致或者导出时没有加simplify。解决确认推理时的 letterbox 参数和训练时一致ONNX 输入输出的归一化方式要和导出时对齐。如果用的是 RK3588 部署还要确认 RKNN 转换时的均值方差配置和训练预处理匹配。5. 进阶验证用混淆矩阵和单张推理定位模型真实短板训练完看 mAP 只是第一步真正要定位短板得看混淆矩阵和单张推理。Ultralytics 训练结束后会在runs/train/exp1下生成confusion_matrix.png横轴是预测类别纵轴是真实类别。对角线越深越好非对角线上的亮块就是混淆重灾区。比如安全帽检测里「未戴帽」和「戴帽」互相混淆说明两类外观差异在特征空间里不够分。单张推理验证from ultralytics import YOLO model YOLO(runs/train/exp1/weights/best.pt) results model(test.jpg, saveTrue, conf0.25, iou0.45) for r in results: boxes r.boxes if boxes is not None: for box in boxes: cls int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() print(f类别:{model.names[cls]} 置信度:{conf:.2f} 框:{xyxy})conf0.25是置信度阈值iou0.45是 NMS 的 IoU 阈值。这两个参数是调优重点conf调高减少误检但漏检增加iou调低减少重叠框但密集场景容易漏。我一般会在验证集上跑一组conf从 0.1 到 0.5 的扫描看 F1 曲线峰值在哪。姿态估计的验证还要看 OKS 曲线分割任务要看 mask mAP50 和 mask mAP50-95 的差距。如果 mask mAP50 高但 mAP50-95 低说明掩码边界粗糙需要检查标注多边形是否贴合目标边缘。最后一个习惯每次训练完把results.csv、confusion_matrix.png、val_batch0_pred.jpg三个文件一起看。只看 mAP 数字容易自我感觉良好看图才能发现模型到底在哪类目标上翻车。希望帮到你。本文还有配套的精品资源点击获取