YOLOv8 姿态估计实战:关键点训练、角度判断与部署
这篇教程根据我复现 YOLOv8 姿态估计流程时整理,重点演示如何训练关键点模型、读取 keypoints 结果、判断姿态并完成部署。
YOLOv8 的姿态估计和目标检测相比,核心差异在于输出的是关键点而不是框。本文适合做关键点检测、姿态判断和工业检测的入门模板。
本文会重点跑通以下流程:
- 安装 YOLOv8 姿态依赖
- 从数据集后台获取关键点数据
- 训练姿态估计模型
- 读取 keypoints 并可视化
- 做姿态角度判断和部署
如果你正在系统学习目标检测、实例分割、OCR、多目标跟踪或视觉大模型,建议收藏本文;配套 notebook、示例图片和运行环境说明后续会继续整理。如果环境配置卡住,可以在评论区说明具体报错。
📚 文章目录
- YOLOv8 姿态估计实战:关键点训练、角度判断与部署
- ⚙️ 环境准备
- 📦 从数据集后台获取关键点数据
- 🏋️ 开始训练
- 🧪 推理与可视化
- 📐 姿态判断
- 📤 部署说明
- ☁️ 云端推理示例
- 📌 小结
- 📚 同系列教程汇总
⚙️ 环境准备
先检查运行环境并安装依赖。建议优先使用带 NVIDIA GPU 的环境,避免推理和训练阶段显存不足。
!nvidia-smiimportos HOME=os.getcwd()print(HOME)!pip install ultralytics==8.2.103-q# prevent ultralytics from tracking your activity!yolo settings sync=Falseimportultralytics ultralytics.checks()fromultralyticsimportYOLOfromIPython.displayimportdisplay,Image📦 从数据集后台获取关键点数据
下面按 notebook 原流程继续执行。
!mkdir-p{HOME}/datasets%cd{HOME}/datasetsfromtypesimportSimpleNamespace# 从数据集后台下载关键点数据集后,修改 DATASET_DIR 指向解压目录。DATASET_DIR="/content/dataset"# 修改为数据集后台导出的数据集目录dataset=SimpleNamespace(location=DATASET_DIR)importyamlwithopen(f"{dataset.location}/data.yaml",'r')asf:dataset_yaml=yaml.safe_load(f)dataset_yaml["train"]="../train/images"dataset_yaml["val"]="../valid/images"dataset_yaml["test"]="../test/images"withopen(f"{dataset.location}/data.yaml",'w')asf:yaml.dump(dataset_yaml,f)🏋️ 开始训练
关键点模型的训练流程和检测略有不同,但核心还是数据路径和权重路径。
%cd{HOME}fromultralyticsimportYOLO model=YOLO('yolov8n-pose.pt')results=model.train(data=f"{dataset.location}/data.yaml",epochs=100,imgsz=640)🧪 推理与可视化
先把关键点预测可视化,确认骨架和顶点位置正确。
%cd{HOME}model=YOLO('runs/pose/train/weights/best.pt')importosimportrandom random_file=random.choice(os.listdir(f"{dataset.location}/test/images"))file_name=os.path.join(f"{dataset.location}/test/images",random_file)results=model(file_name)print(results[0])# Bug in Google Colabimportlocale locale.getpreferredencoding=lambda:"UTF-8"!pip install supervision==0.24.0-qimportsupervisionassvimportcv2 key_points=sv.KeyPoints.from_ultralytics(results[0])vertex_annotator=sv.VertexAnnotator(radius=3,color=sv.Color.WHITE)edge_annotator=sv.EdgeAnnotator(thickness=2,edges=[(0,1)])annotated_frame=cv2.imread(file_name)annotated_frame=edge_annotator.annotate(scene=annotated_frame,key_points=key_points)annotated_frame=vertex_annotator.annotate(scene=annotated_frame,key_points=key_points)annotated_frame=sv.resize_image(annotated_frame,resolution_wh=(900,900),keep_aspect_ratio=True)sv.cv2_to_pillow(annotated_frame)📐 姿态判断
姿态判断通常是关键点结果上的业务规则。
importmathdefcheck_angle_within_tolerance(xy,tolerance_degrees=5):p1,p2=xy[0]dx=p2[0]-p1[0]dy=p2[1]-p1[1]angle_degrees=math.degrees(math.atan2(abs(dy),abs(dx)))ifdx!=0else90returnabs(angle_degrees-0)<=tolerance_degrees is_glue_upright=check_angle_within_tolerance(results[0].keypoints.xy)is_glue_upright📤 部署说明
Notebook 原流程包含在线部署。这里保留部署入口说明,便于接入你自己的发布流程。
project.version(dataset.version).deploy(model_type="yolov8",model_path=f"{HOME}/runs/pose/train/")☁️ 云端推理示例
云端推理适合部署后的快速验证,这里保留调用示例。
# Run inference on your model on a persistant, auto-scaling, cloud API# Load modelmodel=project.version(dataset.version).modelassertmodel,"Model deployment is still loading"# Choose a random test imageimportos,random test_set_loc=dataset.location+"/test/images/"random_test_image=random.choice(os.listdir(test_set_loc))print("running inference on "+random_test_image)pred=model.predict(test_set_loc+random_test_image).json()pred📌 小结
姿态估计除了训练本身,更重要的是关键点后处理和业务规则。先把关键点可视化跑通,再做角度判断会更稳。
这一类 notebook 建议按“先环境、再数据、再单样例、最后批量推理”的顺序复现。遇到报错时,优先检查 GPU、依赖版本、数据集目录和模型权重路径。
后续我会继续按源项目顺序整理同系列中的目标检测、实例分割、OCR、多目标跟踪和视觉大模型教程。
📚 同系列教程汇总
Google Gemini 3.5 Flash 零样本目标检测教程:从提示词到可视化结果
GLM-OCR 文档识别实战教程:从验证码、公式到车牌 OCR
RF-DETR + ByteTrack 多目标跟踪实战教程:从命令行到 Python 视频轨迹可视化
SAM 3 图像分割实战教程:文本、框和点提示的多种分割方式
SAM 3 视频分割实战教程:用文本提示分割并跟踪视频中的目标
YOLOv8 姿态估计实战:关键点训练、角度判断与部署-本文