YOLOv11工业视觉定位实战:从目标检测到位姿估计与手眼标定
2026/9/24 2:48:11 网站建设 项目流程

简介:《工业机器人视觉定位:YOLOv11高精度目标抓取与位姿估计模型调优》是一份面向工业视觉算法工程师、机器人开发人员及相关专业学生的技术PDF文档,聚焦YOLOv11在目标抓取与位姿估计场景下的模型调优,旨在解决传统目标检测方案效率低、成本高及复杂环境下精度不足等关键问题。资源打包为1个PDF文件,共36页,大小2.01MB,当前已有92人学习浏览。文档目录结构完整清晰,从工业机器人视觉定位原理与YOLOv11核心架构出发,系统讲解了数据收集与标注、数据清洗与增强、网络结构优化、损失函数设计、训练策略调整、基于2D/3D数据的位姿估计方法、模型评估验证等内容,还覆盖了汽车制造、电子制造、物流仓储等实际应用案例。读者可借此构建从数据处理到模型部署验证的完整方法体系,尤其适合需要提升机器人抓取精度与位姿估计能力的工程技术人员。

1. 从YOLOv11到抓取点:先想明白精度损失发生在哪一环

把YOLOv11写进工业机器人视觉定位方案时,最容易被忽略的事实是:模型检测精度刷到99%不代表抓得准,末端几毫米的偏差往往不在模型权重里,而在位姿求解与手眼标定。这篇笔记要拆的正是整条链路——YOLOv11网络结构与尺度选型、工业数据怎么清洗和调参、关键点如何转成6-DOF位姿、标定误差怎么一步步放大到机械臂末端。适合正在做上下料、分拣与装配定位的视觉工程师,以及要把视觉系统往Jetson或工控机上部署的技术人员。新手能跟着把第一版抓取流程跑通,熟手可以直接拿调优参数和避坑清单做现场排查。

2. 先选对模型再做调优:YOLOv11的工业部署选型与视觉定位链路

工业抓取的视觉系统,我习惯拆成两段来看。第一段是检测:YOLOv11输出目标类别、2D包围框和置信度,在需要精定位的工位还会额外回归几个关键点,比如工件的角点、定位销中心或螺纹孔圆心。第二段才是位姿估计:拿着这些2D关键点与目标3D模型上的对应点做PnP求解,得到物体坐标系相对相机坐标系的旋转和平移,再换算成机械臂可以执行的抓取位姿。这段位姿估计和YOLOv11是并列关系,不是配角——检测决定抓什么、在哪片区域,位姿决定手爪以什么角度伸进去。

很多项目把检测精度当成唯一指标,结果视觉验收单上mAP很漂亮,实际抓取时却不断撞料。原因在于2D包围框中心并不等于物体质心,更不等于抓取点。平放且姿态固定的工件用2D检测就够,可一旦物体在料筐里倾倒或相互堆叠,缺少位姿输出就没法规划抓取角度。位姿这条路的主流做法是几何求解,也就是PnP或ICP配准,而不是端到端这样一个神经网络直接回归旋转矩阵——后者在实验室数据上表现不错,到了产线上对不可见光照和反光金属的鲁棒性还是差一口气。这也是为什么我在做方案时坚持把检测网络和位姿求解分开设计:模型可以换,位姿求解与标定链路必须保留。

2.1 YOLOv11网络结构要点与尺度选型:部署在Jetson还是工控机

YOLOv11相比v8最直观的变化在主干:用C3k2模块替换了C2f,SPPF之后又接了一个带空间注意力的C2PSA,检测头保持anchor-free的解耦结构,标签分配沿用TAL。这些改动带来的实际收益是,同样精度下模型更小、小算力设备上吞吐更好。如果你已经在用v8跑项目,升级v11不是改个权重路径就完事——环境配置上要注意Ultralytics的Python包版本,导出ONNX或TensorRT时动态shape的参数也换了写法,换模型后必须对原有数据集完整回归一遍,别直接上产线。

工业现场的算力选型,我一般按部署位置来定。Jetson Orin Nano/NX这类设备上,跑YOLOv11s或n配合TensorRT FP16,能做到现场需要的帧率;工控机带RTX系列显卡就直接上m或l。把m作为默认起点,理由是它在精度和延迟之间最均衡;工件小、料筐深、需要看到更多细节时再换l,代价是显存占用和端到端延迟都上一个台阶。模型尺度选型是模型调优里最前面的一道选择题,选小了后续怎么调都补不回小目标召回;选大了现场吞吐不够又得回头降分辨率。

模型尺度参数量(约)COCO mAP50-95(约)常见部署位置
YOLOv11n2.6M39.5低算力嵌入式设备
YOLOv11s9.4M47.0Jetson Orin Nano
YOLOv11m20.1M51.5工控机RTX系列
YOLOv11l25.3M53.4工控机高配GPU
YOLOv11x56.9M54.7离线或双卡场景

表格里的数值是COCO公开基准下的参考量级,工业现场数据集比COCO简单,实际mAP会明显高于这些数字。选型时真正要看的是小目标子集的精度,而不是总量指标。部署时如果发现导出TensorRT后关键点输出和PyTorch不一致,多半是动态shape配置或FP16精度问题,把关键敏感层保留FP32即可,具体处理我在第5章的踩坑记录里再展开。

2.2 坐标变换链:像素到机械臂抓取点的最后一公里

检测和位姿都做对,抓取还会偏,问题多半出在坐标变换链。整条链是:像素坐标(u,v)到相机坐标系(Xc,Yc,Zc),再到机械臂基坐标系(Xb,Yb,Zb),最后到工具坐标系(Xt,Yt,Zt)。公式写出来很直白:

T_base_to_grasp = T_base_to_camera × T_camera_to_object × T_object_to_grasp

其中T_base_to_camera来自手眼标定,T_camera_to_object由PnP算出,T_object_to_grasp是工艺给的抓取偏移,比如夹爪中心在物体坐标系下的位置和姿态。三个矩阵互为因果:检测的关键点给PnP提供输入,PnP的输出喂给变换链,变换链任何一环的标定误差都会叠加到末端。

手眼标定分两种:相机装在机械臂末端叫eye-in-hand,标定方程是AX=XB;相机固定安装在基座上方叫eye-to-hand,标定方程是AX=ZB。前者适合机械臂移动范围大、目标可能被遮挡的场合,后者适合固定视野的上下料工位。工业机器人系统集成设计里最常见的做法是eye-to-hand,因为标定一次管很久,而且相机不跟着机械臂动,视野固定不变。理解了这条链,就知道调优不只是在训练脚本里改参数,还包括对每级变换的验证,这部分我在第4章和第5章会专门展开。

3. 数据决定上限:工业数据集的采集标注与YOLOv11训练参数

如果说模型结构决定精度的下限,数据集就决定上限。工业场景的目标类别通常不多,一个工位几种到几十种工件,但难点在光照、反光和堆积姿态上。公开数据集里训练好的权重直接拿到工业现场,遇上一片高亮金属反光就会集体翻车,所以YOLOv11环境配置好之后,第一件事不是直接训练,而是把数据集整明白。

3.1 工业数据的现实解法:合成数据打底、真实数据兜底

常见做法是把CAD模型导进Blender或Unity做合成渲染,配合域随机化生成训练数据:光照方向随机、材质粗糙度随机、背景纹理随机、相机视角随机,甚至叠加一些虚拟遮挡物去模拟料筐里的堆叠。合成数据可以快速做到几千张,覆盖各种极端姿态,这在真实产线上靠人工摆拍根本做不到。但只靠合成绩效不稳,因为渲染贴图和真实材质的反射特性总有差异,特别是拉丝铝、黑色橡胶这一类难处理的表面。

我的配比是合成数据占七到八成,真实数据占两到三成。真实数据每类工件至少采100到300张,故意覆盖反光最强、遮挡最严重、半出料筐这三种边界情况。合成渲染时不要用纯色背景,要贴和现场地面颜色接近的纹理,否则domain gap会把现场泛化能力拉下来。真实图像标完以后,建议把整批图过一遍模型做预标注,再把置信度低的样本挑出来人工修正,这样能省下大量标注工时。

3.2 把VOC标注转成YOLOv11格式:清洗脚本与五个校验点

工业上很多标注工具默认导出VOC的XML格式,YOLOv11训练要的是每张图对应一个同名txt,每行是class x_center y_center width height,坐标全部归一化到0到1。转换脚本不复杂,但脏数据的坑都在细节里:

import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, out_dir, class_names, img_w, img_h): tree = ET.parse(xml_path) root = tree.getroot() class_ids = {name: idx for idx, name in enumerate(class_names)} lines = [] for obj in root.findall("object"): name = obj.find("name").text if name not in class_ids: continue bndbox = obj.find("bndbox") x1 = float(bndbox.find("xmin").text) y1 = float(bndbox.find("ymin").text) x2 = float(bndbox.find("xmax").text) y2 = float(bndbox.find("ymax").text) # 越界标注裁剪到图像范围,避免训练时报错 x1 = max(0, min(x1, img_w)) x2 = max(0, min(x2, img_w)) y1 = max(0, min(y1, img_h)) y2 = max(0, min(y2, img_h)) if x2 <= x1 or y2 <= y1: continue # 过滤掉面积为零或反向的脏框 cx = (x1 + x2) / 2 / img_w cy = (y1 + y2) / 2 / img_h w = (x2 - x1) / img_w h = (y2 - y1) / img_h lines.append(f"{class_ids[name]} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}") out_path = os.path.join(out_dir, os.path.splitext(os.path.basename(xml_path))[0] + ".txt") with open(out_path, "w") as f: f.write("\n".join(lines))

脚本里img_w和img_h必须是图像的实际像素尺寸,不是缩放后的尺寸,一旦这里写错,归一化坐标全部偏移,训练出的模型在边缘位置会产生规律的预测偏差。越界裁剪是为了容错VOC标注里偶尔出现的坐标超界,这类标注不处理,YOLO训练时会在损失计算阶段直接报错。

转换完成后做五个校验:归一化坐标是否都在0到1之间;宽高是否为正值;类别ID是否落在配置的类别数量内;txt文件名是否和jpg文件名一一对应;是否存在宽度或高度小于3像素的目标。最后一条尤其关键,因为这类小目标在训练里既贡献不了有效梯度,还会干扰标签分配,最好直接过滤或者手动重新标注。

3.3 训练参数别照抄:imgsz、mosaic与piouv2的现场调法

数据就位后,训练命令可以直接用Ultralytics的命令行接口。下面是我在工业上下料项目里常用的参数模板:

yolo detect train \ data=industrial_v2.yaml \ model=yolov11m.pt \ epochs=150 \ imgsz=640 \ batch=16 \ optimizer=AdamW \ lr0=0.001 \ cos_lr=True \ mosaic=1.0 \ close_mosaic=10 \ patience=20

imgsz=640是默认值,如果工件在画面里占比很小,我一般会把imgsz提到1280,同时把batch降一半以适配显存。imgsz翻倍后,小目标的特征响应有明显改善,但推理速度也会明显下降,在Jetson这类设备上要先做个单帧延迟测试再决定。optimizer选AdamW而不是默认SGD,工业数据集规模普遍不大,AdamW在几千张图的情况下收敛更省心,学习率lr0给0.001是比较保守的起点。

这两个参数是要重点看的:close_mosaic=10表示训练最后10个epoch关闭mosaic增强,让模型回到接近真实分布的样本上做微调。很多翻车案例是mosaic从头开到尾,小目标被四张图拼接后切得只剩碎片,最后现场实测差得离谱;loss曲线整体在降,但小目标子集的表现根本看不出来。另外当工件相互堆叠、边界框重叠严重时,默认CIoU对边缘对齐不够敏感,可以把回归损失换成PIoU v2。PIoU v2对边界框的中心点和边缘对齐都做了加权,在遮挡场景下能减少重叠框回归的偏差。这类改动属于A/B项,不要盲改,节省的方式是训练一个小模型对比验证集上的损失变化再决定。

3.4 yolov11小目标优化:ROI裁剪与切片推理两条路

工业场景里小目标问题极其常见,目标短边小于10个像素时,YOLOv11的anchor-free检测头对小目标的响应天生偏弱。经验值:目标短边在8像素以下,基本学不动,靠调参很难补。两条路可以走,前提是搞清楚现场的约束。

第一条是固定工位ROI裁剪。相机位置不动,料筐位置也基本固定时,把推理区域裁剪到工件出现的区域,等效放大目标在输入图像中的尺寸。这是最便宜也最有效的方法,同时还能排除料筐外高亮背景的干扰。裁剪坐标要留余量,不能刚好切在目标边缘,否则目标一半在框外,检测头会被迫预测一个不完整的实例。

第二条是切片推理,适用于目标在画面里随机分布、无法固定ROI的场景。sahi库对Ultralytics模型已经做了适配:

from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction model = AutoDetectionModel.from_pretrained( model_type="ultralytics", model_path="best.pt", confidence_threshold=0.35, device="cuda:0", ) result = get_sliced_prediction( image="scene.png", detection_model=model, slice_height=640, slice_width=640, overlap_height_ratio=0.2, overlap_width_ratio=0.2, )

切片尺寸要和目标最长边匹配,目标太长容易被两片切片截断,overlap给到0.2是我反复测试后的折中值,再增大对召回帮助有限,推理耗时倒是明显上涨。切片推理的缺点是整图推理时间和显存占用都成倍增加,所以只建议在相机视野大、目标散落分布的场景下用。如果工位本身可以调整相机高度,优先把相机架高或拉近来改变目标占比,比任何算法都省事。

4. 位姿估计的模型调优:PnP求解、自由度约束与手眼标定误差

YOLOv11把目标在图像里的位置和关键点给出来,这只是视觉定位的中间产物。想要机械臂抓得准,必须把2D信息换算成3D位姿。这一章讲位姿估计的调优:PnP的参数怎么设、对称工件的多解怎么处理、手眼标定误差为什么会被放大。

4.1 用solvePnPRansac求位姿:输入点对决定输出精度

位姿估计最常用的实现是OpenCV的solvePnPRansac,输入是2D关键点与3D模型点的对应关系,输出是旋转向量rvec和平移向量tvec。2D点来自YOLOv11的关键点输出或分割结果处理,3D点来自工件CAD模型上对应特征的测量值,单位用毫米:

import cv2 import numpy as np # 3D点:在物体CAD坐标系下测量,单位mm object_points = np.array([ [0.0, 0.0, 0.0], [120.0, 0.0, 0.0], [120.0, 80.0, 0.0], [0.0, 80.0, 0.0], ], dtype=np.float32) # 2D点:YOLOv11关键点头输出,单位像素 image_points = np.array([ [512.1, 402.2], [582.8, 409.5], [596.0, 468.3], [526.4, 461.0], ], dtype=np.float32) camera_matrix = np.array([[1420, 0, 960], [0, 1420, 540], [0, 0, 1]], dtype=np.float32) dist_coeffs = np.array([0.01, -0.03, 0.001, 0.001, 0.0], dtype=np.float32) ok, rvec, tvec, inliers = cv2.solvePnPRansac( object_points, image_points, camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_EPNP, iterationsCount=500, reprojectionError=8.0, confidence=0.99, )

参数里最需要关注的是reprojectionError,这个值表示像素投影误差,超过该值的匹配点会被RANSAC判为外点。相机分辨率1280时给8.0比较合理;分辨率降到640,要收到4.0左右,否则大量外点混进解集,位姿会在帧间跳动。inliers返回的是内点索引数组,可以通过len(inliers)判断匹配质量,内点比例低于50%时问题多半不在模型而在关键点标注或相机内参,这时不要去调检测阈值,而是回头检查关键点的定位一致性。

此外,solvePnP最少需要4组非共面点。如果工件是平面薄板,4个共面角点会让位姿解退化,需要额外加一个模型厚度方向上的点来打破共面,或者改用OpenCV的SOLVEPNP_IPPE_SQUARE专用算法。这一点在扁平金属件抓取时经常踩中,我项目里至少有两回是这个原因导致姿态翻转。

4.2 对称与扁平工件的位姿歧义:让PnP输出的姿态别乱跳

正八边形法兰、圆柱外壳、圆柱销这类对称工件,是位姿估计的典型难点。现象是工件明明静止不动,连续几帧输出的旋转角却跳变几十度,机器人每次规划的抓取姿态都不一样,严重的会直接触发轨迹规划报错。原因是重投影误差沿着对称轴方向是平的,多个旋转角度对应几乎相同的2D投影,RANSAC每次选中的解不一样,输出自然不稳定。

解决办法是给位姿求解加自由度约束。圆柱体抓取时,绕轴线的旋转角对抓取没有实际影响,把6-DOF位姿降成4-DOF,固定绕对称轴的角度,只解三个平移和一个偏航角;对于带法兰孔的工件,先用孔位确定基准方向,再限制候选解只能落在若干个等距角度上。另一种通用做法是解聚类:连续采集多帧PnP结果,把相近的旋转平移向量聚成一簇,取簇中心作为最终输出,能有效抑制单帧噪声造成的跳变。如果目标表面有可靠点云,还可以用PnP解作为初值,再做ICP精配准,但金属反光件容易陷入局部最优,必须把对称轴方向作为约束写进ICP的初始化,否则结果可能比纯PnP还差。

这段调优的本质是:位姿估计的可靠性不只看训练模型强不强,还要看几何约束对不对。模型输出的2D关键点只是观测,3D位姿的解空间必须符合工艺事实。

4.3 手眼标定的误差放大:最后一级标定决定抓取精度

手眼标定是现场最容易被当成一次性工具的环节,标一次就再也不碰了。实际上相机支架的热胀冷缩、机械臂负载变化、工具碰撞后的微变形,都会让标定结果悄悄失效。经验上是这样估算误差的:重投影误差1个像素,在物体距离相机500毫米时大概对应0.1毫米左右;但手眼标定里平移部分误差会随机械臂伸展长度放大,加上TCP标定误差,末端偏差到两三毫米很常见。

eye-to-hand场景下,标定板固定在机械臂末端,机械臂带着标定板在视野内运动15到20个位姿,记录每个位姿下的机器人读数,用Tsai方法或Park-Martin方法求解AX=ZB。标定完成后必须做一步验证:让机械臂带标定板走到视野内几个已知位置,把机器人返回的位姿投影回图像,看角点重投影残差。残差超过3个像素就重新采集标定数据,不要嫌麻烦。比看标定软件输出的旋转矩阵数字有用得多。如果相机要换角度拍摄,标定板要始终清晰可见,光线不能有明显反光,采集时机械臂停止运动后再触发拍照,避免运动模糊引入像素级误差。

5. 现场避坑清单:5条能直接对号入座的踩坑记录

这一章把我在现场踩过的坑按照现象、原因、解决的格式整理出来,每一条都是真实发生过、且排查过程有代表性的。

5.1 重投影误差1像素末端偏差3毫米:标定链路里最容易翻车的一环

现象:视觉定位单点拍照时给出的抓取坐标看起来正常,但机器人连续抓取几次,有的准有的偏,偏差量级到几毫米,而且位置越靠近视野边缘偏差越大。原因:重投影误差衡量的是图像平面内的匹配质量,只能反映PnP这一步;手眼标定平移矩阵的误差随机械臂臂长放大,TCP工具长度标错也会线性叠加。另外相机内参的畸变系数如果有偏差,画面边缘的关键点会显著漂移。解决:固定标准工件让机械臂在视野多个高度位姿下拍照,逐点比较投影坐标和机器人实测坐标;重新做手眼标定,并在每次调整相机支架后强制重标。把这一步做成上电自检脚本,现场能省掉大量排查时间。

5.2 换批次漏检率从2%涨到30%:合成数据的域迁移失效

现象:合成数据训练出的模型验收时精度符合要求,现场换了一批表面处理工艺不同的同类工件,漏检率突然飙升。原因:合成渲染的贴图与真实材质光谱特征不一致,现场打光角度和亮度与训练域基本没有交集,模型学到的特征在新表面下失效。解决:合成管线里把光照改成多方向随机,材质贴图随机偏移色温和粗糙度,同时保留两到三成真实图做混合训练。每次供应商换批次后,先拿30张现场新图跑一次推理统计漏检率,再决定是否要补标增量训练。这个流程要写进工艺文件,不能靠视觉工程师个人临时发挥。

5.3 对称法兰的位姿每几帧跳变一次:PnP解集里该选哪一个

现象:同一静置工件的位姿输出在若干帧里旋转角跳变几十度,机器人每次规划的抓取姿态完全不同。原因:对称性导致PnP多解,几个旋转角度对应几乎相同的重投影误差,RANSAC在噪声下每次选中的解集合不同。解决:按工件建立对称约束表,圆柱绕轴固定角度,法兰用孔位确定基准方向;PnP之后对候选解做聚类,相近解取平均;比如对相邻10帧结果做姿态聚类,跳变就能被压下来。如果工件表面有反光导致关键点本身抖动,先处理成像质量,比任何滤波算法都靠谱。

5.4 验证集PR曲线很漂亮,料筐里全是漏检:mosaic把小目标切没了

现象:训练时mAP50-95达到0.9以上,但现场料筐里的小工件漏检严重,肉眼能看清的目标模型就是不出来。原因:mosaic增强在训练后半段还在把目标切碎,小目标的完整特征始终没有被模型见到;验证集里小目标占比也低,整体指标被大目标拉高,掩盖了问题。解决:close_mosaic参数设到10到15轮,而不是默认的3轮;如果目标短边小于10像素,把imgsz提高到1280再做训练,推理时也保持1280输入;或者用固定ROI裁剪放大目标区域。上线验收时要单独统计小目标子集的召回率,不要只看整体mAP。

5.5 昨天调好的抓取点今天漂了2毫米:支架微位移与TCP负载

现象:没有任何报警,视觉系统输出也正常,但抓取点位置发生系统性漂移,重启视觉程序无变化。原因:相机支架受热胀冷缩或产线振动发生微位移;机械臂末端换了夹爪后没有重新标定TCP,负载变化导致各轴挠曲,TCP工具坐标失效。解决:相机支架装机时用定位销加螺丝锁定,不要只靠螺丝摩擦定位;机械臂换夹具后必须带实际负载重新标定TCP;每次开机用固定在工位上的基准件做一个快速标定校验,偏移超过阈值就报警提示重新手眼标定。这些措施成本不高,但能避免半夜产线停线等人来处理。

6. 把调优经验固化成脚本:端到端验证与重复精度统计

调优不能靠印象,每次调整检测阈值、关键点权重或者手眼标定结果后,都要有量化对比。这一章给一套我项目里跟着交付走的验证脚本,分两部分:端到端推理输出结构化位姿数据,以及用统计指标判断位姿质量。

6.1 端到端验证脚本:一次运行输出检测框、关键点与位姿

import csv import cv2 import numpy as np from ultralytics import YOLO model = YOLO("best.pt") cap = cv2.VideoCapture(0) rows = [] for frame_id in range(50): ok, frame = cap.read() if not ok: continue results = model(frame, verbose=False)[0] if results.keypoints is None or len(results.boxes) == 0: continue kps = results.keypoints.xy.cpu().numpy()[0] object_points = np.array([[0, 0, 0], [120, 0, 0], [120, 80, 0], [0, 80, 0]], dtype=np.float32) ok_pnp, rvec, tvec, _ = cv2.solvePnPRansac( object_points, kps.astype(np.float32), camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_EPNP, iterationsCount=500, reprojectionError=8.0, confidence=0.99, ) if ok_pnp: rows.append([frame_id, *rvec.flatten(), *tvec.flatten()]) with open("pose_log.csv", "w", newline="") as f: writer = csv.writer(f) writer.writerow(["frame_id", "rx", "ry", "rz", "tx", "ty", "tz"]) writer.writerows(rows)

这段脚本把每一帧的检测关键点和PnP位姿落盘到CSV,是后续所有统计的基础。camera_matrix和dist_coeffs在真实项目里从相机标定结果加载,不要写死。脚本循环里加了空检测的跳过逻辑,避免关键点不存在时直接报错中断采集。如果关键点输出置信度偏低,可以在results内部加上关键点置信度过滤,低于阈值的那一帧放弃参与统计,宁可少一帧数据也不要让脏数据污染统计结果。

6.2 用数据暴露位姿跳变:重复定位精度的三个判定指标

有了CSV之后,统计就很简单:对tvec的三个分量算标准差,对rvec转成欧拉角后算标准差和最大最小差值。判定标准按工艺来定:普通上下料,平移标准差小于0.5毫米、角度标准差小于0.5度算合格;孔轴装配类的高精度场景,平移标准差要压到0.1毫米以内。如果某帧的旋转角突然偏离均值超过5度,检查那帧的关键点是否被反光干扰,把异常帧从统计里剔除后重新计算。

这套脚本同时还能验证YOLOv11保存推理结果的一致性:同一静态工件拍50帧,理想情况下位姿应该几乎不变,任何明显波动都指向关键点检测或者标定链路。我养成的习惯是每次调整检测阈值或关键点权重后,把同一组现场历史图重新过一遍这个脚本,对比输出位姿的方差,而不是只看训练集指标。线上数据永远比验证集诚实,这个习惯帮我挡掉了好几次上线前的回归事故。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询