ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

托盘关键点检测数据集:从标注到YOLOv8-pose训练全流程

托盘关键点检测数据集:从标注到YOLOv8-pose训练全流程 简介托盘关键点检测数据集面向物流自动化、工业视觉质检与机器人操作训练场景为AGV、机械臂等设备的托盘抓取定位与姿态估计提供专用数据支撑。数据集聚焦Pallet单类别关键点标注每行包含类别ID及5组坐标点精准刻画托盘角点与支撑点等几何结构兼容YOLO等主流检测框架可直接用于位姿估计与结构完整性分析。资源包共1360个文件含679张jpg实景图像、679个txt关键点标注文件以及1个yaml配置和1份docx说明文档压缩包约62.37MB训练集584张、验证集95张覆盖多样化摆放角度与光照条件。目前已有181人学习下载适合从事智能仓储、工业机器人仿真训练及关键点检测算法验证的研究者与开发者帮助快速搭建托盘定位模型并优化抓取路径规划。1. 托盘关键点检测数据集从标注格式到训练落地的完整路径托盘关键点检测数据集.zip 这类资源核心价值不在于图片数量而在于关键点定义是否统一、标注是否可直接喂给 YOLOv8-pose 或 RTMPose 这类框架。托盘在仓储、物流、叉车对接场景里是高频目标但普通矩形框只能告诉你「这里有个托盘」关键点才能给出托盘四个角点或插孔位置进而算出位姿、判断偏移量、引导机械臂或 AGV 对准。我见过太多团队拿检测框硬做对接结果托盘轻微旋转就翻车。关键点检测把这个问题从「猜」变成「算」。这份数据集适合做仓储自动化、叉车视觉引导、托盘位姿估计的工程师也适合想用 YOLOv8 训练自己数据集但缺一个结构化关键点案例的人。下面按「数据长什么样 → 怎么转格式 → 怎么训 → 坑在哪」推一遍。2. 托盘关键点数据集的标注结构与格式转换2.1 关键点定义决定模型上限托盘关键点检测的第一步不是写代码是确认关键点语义。常见定义有两类一类是四个外角点适合算托盘外接矩形和旋转角另一类是插孔中心点适合叉车货叉对准。我一般会先打开标注文件看坐标顺序因为不同来源的数据集对「左上、右上、右下、左下」的排列可能不一致顺序错了模型学出来的骨架就是拧的。YOLOv8-pose 要求的关键点格式是每个目标一行类别、归一化中心点、归一化宽高、然后每个关键点的 x、y、可见性。可见性 0 表示未标注1 表示遮挡但位置可推断2 表示可见。托盘场景里被货物压住的角点很常见如果全标 2模型会学到错误的高置信位置。# 检查标注文件里关键点数量和可见性分布 import json from collections import Counter with open(annotations.json, r, encodingutf-8) as f: data json.load(f) kp_count Counter() vis_count Counter() for ann in data[annotations]: kps ann.get(keypoints, []) kp_count[len(kps) // 3] 1 for i in range(2, len(kps), 3): vis_count[kps[i]] 1 print(关键点数量分布:, kp_count) print(可见性分布:, vis_count)这段代码做两件事统计每个目标的关键点个数确认是否统一为 4 点或 8 点统计可见性取值判断标注质量。如果出现 3 点、5 点混杂说明数据集里有关键点缺失的样本训练前要么补齐要么剔除。可见性如果全是 2遮挡样本的鲁棒性会差建议抽检被遮挡托盘图片。2.2 从 COCO 关键点格式转 YOLOv8-pose多数托盘关键点数据集以 COCO 格式分发转 YOLOv8-pose 需要把绝对坐标归一化并按图像宽高缩放。转换脚本本身不复杂坑在图像尺寸和标注尺寸不一致。有些数据集图片被重新缩放但标注没同步转出来框全偏。import json import os from PIL import Image def coco_to_yolo_pose(coco_json, img_dir, out_dir): with open(coco_json, r, encodingutf-8) as f: coco json.load(f) img_info {img[id]: img for img in coco[images]} cat_info {cat[id]: i for i, cat in enumerate(coco[categories])} os.makedirs(out_dir, exist_okTrue) for ann in coco[annotations]: img img_info[ann[image_id]] w, h img[width], img[height] # 实际读取图片尺寸做校验 real_w, real_h Image.open(os.path.join(img_dir, img[file_name])).size if (w, h) ! (real_w, real_h): print(f尺寸不一致: {img[file_name]} 标注{w}x{h} 实际{real_w}x{real_h}) w, h real_w, real_h x, y, bw, bh ann[bbox] cx, cy (x bw / 2) / w, (y bh / 2) / h nw, nh bw / w, bh / h cls cat_info[ann[category_id]] kps ann[keypoints] kp_str [] for i in range(0, len(kps), 3): kx, ky, v kps[i], kps[i1], kps[i2] kp_str.append(f{kx/w:.6f} {ky/h:.6f} {int(v)}) line f{cls} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f} .join(kp_str) txt_path os.path.join(out_dir, os.path.splitext(img[file_name])[0] .txt) with open(txt_path, a, encodingutf-8) as f: f.write(line \n) coco_to_yolo_pose(annotations.json, images, labels)逻辑说明先建立图像 id 到信息的映射和类别 id 到连续索引的映射YOLO 要求类别从 0 开始。对每个标注取 bbox 算归一化中心点和宽高再逐关键点归一化。参数上v直接取 COCO 的可见性如果原数据集用 0/1 表示可见/不可见需要映射成 YOLO 的 0/2。尺寸校验那几行是血泪经验我遇到过标注写 1920×1080、实际图片是 1280×720 的数据集不校验的话训练 loss 能降但预测全飘。2.3 数据集划分与 YAML 配置转换完要划分 train/val比例一般 8:2 或 9:1。托盘场景如果不同光照、不同托盘颜色差异大建议按场景分层抽样别随机切否则验证集可能全是同一种托盘指标虚高。# tray_pose.yaml path: ./tray_dataset train: images/train val: images/val kpt_shape: [4, 3] # 4个关键点每个3维(x,y,visible) flip_idx: [1, 0, 3, 2] # 水平翻转时关键点索引映射 names: 0: traykpt_shape必须和标注一致写错直接报错。flip_idx是数据增强水平翻转时的关键点对应关系四个角点按左上、右上、右下、左下定义时翻转后左上变右上所以映射是 [1,0,3,2]。这个不设对增强会制造错误标签模型学出镜像混乱的骨架。3. 用 YOLOv8-pose 训练托盘关键点模型的实操参数3.1 环境与最小训练命令环境用 ultralytics 官方包即可Python 3.8 以上PyTorch 按显卡选版本。训练命令一行能跑但参数决定成败。yolo pose train \ datatray_pose.yaml \ modelyolov8n-pose.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.001 \ lrf0.01 \ patience30 \ augmentTrue \ mosaic0.5 \ degrees10 \ translate0.1 \ scale0.3 \ fliplr0.5 \ projectruns/pose \ nametray_v1逐项说model选 n 还是 s 看数据量托盘关键点如果只有几千张n 够用过大会过拟合。imgsz640是起点托盘在图中占比小就上 960 或 1280但显存翻倍。lr00.001是 Adam 系常用值SGD 可以到 0.01。patience30早停关键点任务 loss 波动比检测大别设太小。mosaic0.5别开满关键点拼接后角点可能落在图像外标签会错。degrees10旋转增强对托盘位姿有用但别超过 15否则角点顺序语义容易乱。fliplr0.5配合 YAML 里的flip_idx才安全。3.2 关键点损失与评估指标怎么看YOLOv8-pose 的损失由框回归、关键点回归、关键点可见性分类组成。训练时看box_loss、pose_loss、kobj_loss三条曲线。pose_loss下降慢是正常的关键点定位精度天然比框难。验证时看pose_mAP50和pose_mAP50-95但这两个指标对托盘场景不够直观我一般还会算角点平均像素误差。# 用验证集预测结果算角点像素误差 from ultralytics import YOLO import numpy as np model YOLO(runs/pose/tray_v1/weights/best.pt) results model.val(datatray_pose.yaml) errors [] for r in results: if r.keypoints is None: continue pred r.keypoints.xy.cpu().numpy() # 预测关键点 gt r.keypoints.xyxy.cpu().numpy() if hasattr(r.keypoints, xyxy) else None # 实际项目中这里对接标注真值逐点算欧氏距离 # 简化示意统计预测点间距离合理性 for kp in pred: if len(kp) 4: d np.linalg.norm(kp[0] - kp[2]) errors.append(d) print(角点对角线像素距离均值:, np.mean(errors))这段是示意框架真实评估要拿预测关键点和标注真值逐点算欧氏距离再除以托盘框对角线长度做归一化。归一化误差低于 0.05 基本可用于位姿估计高于 0.1 说明关键点定位不够得查标注质量或加数据。参数上注意keypoints.xy返回的是像素坐标不是归一化值别混用。3.3 推理与部署时的输入尺寸对齐训练用 640推理也必须 640 或同比例否则关键点坐标会偏。部署到边缘设备时letterbox 的填充量要记录后处理时减掉。from ultralytics import YOLO import cv2 model YOLO(best.pt) img cv2.imread(test_tray.jpg) h, w img.shape[:2] results model.predict(img, imgsz640, conf0.5, verboseFalse) for r in results: if r.keypoints is None: continue kps r.keypoints.xy.cpu().numpy()[0] # 如果原图不是640xy已是原图尺度ultralytics内部做了还原 for i, (x, y) in enumerate(kps): cv2.circle(img, (int(x), int(y)), 5, (0, 255, 0), -1) cv2.putText(img, str(i), (int(x), int(y)-8), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) cv2.imwrite(result.jpg, img)ultralytics 的keypoints.xy已经映射回原图坐标这点比早期版本省事。但如果你自己写前处理letterbox 的缩放比和 padding 必须手动还原否则关键点整体偏移。conf0.5是托盘场景起点漏检多就降到 0.3误检多就升到 0.6。关键点置信度阈值在r.keypoints.conf里可以单独过滤低置信点。4. 托盘关键点训练避坑与排查清单4.1 关键点顺序不一致导致骨架错乱现象训练 loss 能降但预测出的关键点连线交叉四个角点顺序混乱。原因数据集里不同标注人员对「左上」的理解不同或者部分图片做了镜像但没改索引。解决训练前用脚本可视化所有标注骨架逐类抽查发现顺序不一致的样本统一重排或剔除。我一般会写一个把关键点按角度排序的预处理以托盘中心为原点算极角固定从左上开始顺时针。4.2 可见性标注全为可见导致遮挡失效现象验证集上被货物遮挡的托盘角点预测飞到框外。原因标注时所有关键点都标了可见模型没学过「看不见但位置可推断」的情况。解决对遮挡样本重新标注被遮挡角点标 1 而非 2并在增强里加入随机遮挡。如果重标成本高至少在 loss 里对可见性为 1 的点降权。4.3 图像与标注尺寸不匹配现象训练初期 loss 正常下降但推理时框和关键点整体偏移固定比例。原因数据集图片被缩放但标注坐标没同步或者 EXIF 旋转导致宽高互换。解决转换前逐张校验图片实际尺寸和标注尺寸不一致的按实际尺寸重新归一化。手机拍摄的图片注意 EXIF orientation用 PIL 读取时先做ImageOps.exif_transpose。4.4 数据增强把关键点转出图像边界现象训练中期 loss 突然飙升之后恢复但精度上不去。原因mosaic 或旋转增强后部分关键点坐标超出 [0,1]YOLO 对越界关键点的处理是截断或丢弃制造了噪声标签。解决降低 mosaic 概率到 0.3 以下旋转角度限制在 ±10 度或者在数据加载后过滤掉关键点越界的样本。我习惯在增强后加一道校验任一关键点归一化坐标超出 [0,1] 就跳过该增强结果。4.5 托盘类别单一时忽略背景负样本现象模型在验证集上表现好一到真实仓库就把货架、地砖缝误检成托盘。原因训练集全是托盘正样本没有负样本模型没学过「什么不是托盘」。解决加入 10% 到 20% 的无托盘背景图或者用难例挖掘把误检图加进训练。YOLOv8 里背景图对应空标签文件别放错目录。5. 托盘关键点模型的进阶技巧与验证习惯训练能跑通只是起点真正决定托盘关键点检测能不能上产线的是验证方法。我一般不看 mAP 就下结论而是拿预测关键点去算托盘位姿再和真实位姿比。具体做法用四个角点做透视变换解出托盘平面法向量和旋转角和标定好的真值比角度误差。角度误差小于 3 度、平移误差小于 5 毫米才算可用于叉车对接。这个验证比任何 loss 曲线都直接。进阶用法上如果托盘种类多、颜色差异大单模型关键点容易混。我会按托盘类型分模型或者加一个分类头先判类型再回归关键点。另一个技巧是时序平滑视频流里对连续帧的关键点做卡尔曼滤波单帧抖动会被压下去位姿输出稳定很多。参数上卡尔曼的过程噪声别设太小否则托盘快速移动时滤波跟不上出现滞后。还有一个容易被忽略的点关键点模型的量化部署。边缘设备上用 TensorRT 或 ONNX Runtime 量化到 FP16 甚至 INT8关键点精度会掉。我的习惯是量化后重新跑一遍角点像素误差评估误差增加超过 20% 就放弃 INT8退回 FP16。这个没有后悔药只能量化前后都测。最后说个习惯每次换数据集或改关键点定义先拿 20 张图过一遍可视化确认骨架连线符合直觉再开训。我翻车最惨的一次就是没看可视化关键点顺序错了训了两天才发现白白烧了卡时。希望帮到你。本文还有配套的精品资源点击获取
返回列表