ARTICLE DETAIL

资讯详情

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

物流分拣多尺度YOLOv11与机械臂协同控制实战

物流分拣多尺度YOLOv11与机械臂协同控制实战 简介一份29页的PDF文档系统梳理YOLOv11在物流分拣场景中的多尺度包裹识别方法与机械臂协同控制策略面向计算机视觉、物流自动化方向的研究人员、工程师与学生。内容从物流分拣行业现状与自动化需求切入详解YOLOv11骨干网络、颈部网络与检测头结构以及多尺度特征金字塔、注意力机制、数据增强与损失函数设计等识别优化策略机械臂部分涵盖运动学原理、控制方式与系统架构并重点介绍YOLOv11与机械臂之间的信息交互、任务优先级调度、路径规划与反馈控制算法。文档还给出从需求分析、硬件选型、软件开发到系统部署的完整实施路径以及仿真与实验评估方法目录按九大章节组织支持快速跳转定位。整个压缩包仅包含1个PDF文件大小1.74MB已有86人学习使用。该文档可作为视觉引导分拣系统研发参考尤其适合需要理解多尺度目标检测与机械臂协同控制全流程的读者。1. 物流分拣为什么要“多尺度 YOLOv11 机械臂协同”一起谈在物流分拣现场最扎心的翻车不是模型认不出包裹而是 YOLOv11 把大大小小的包裹都认出来了机械臂却抓不到。20cm 的小盒子被旁边 1.4m 的大纸箱挡住导致漏检塑封袋反光让检测框一抖一抖检测框中心到机械臂抓取点之间还隔着相机标定、传送带编码器、手眼矩阵一长串隐性误差。这套方案的完整名字叫“YOLOv11在物流分拣中的多尺度包裹识别与机械臂协同控制”核心就两件事让 YOLOv11 在真实产线光线和包裹尺度跨度极大的条件下把包裹认全认准再把像素坐标换算成机械臂基座坐标驱动机械臂完成抓放。它适合做视觉引导分拣线、机械臂上下料、流式包裹抓取的算法工程师和自动化工程师。读完这篇文章你能拿到一套可照做的数据集统计脚本、一组训练参数基线和五条我赔过工时才攒出来的现场排查经验。2. 先吃透“多尺度”把包裹尺寸分布做成可量化的数据集2.1 物理尺度差异和成像尺度差异是两码事聊多尺度之前先分清两个经常被混为一谈的问题。物流单上的包裹尺寸跨度极大这是物理尺度差异20cm 的手机盒和 1.2m 的纸箱一前一后上皮带这是物体本身的尺寸差。成像尺度差异则是同一个尺寸的物体在图像传感器上占据的像素数不同比如俯视相机画面里靠近镜头中心的小盒子和视野边缘的大箱子成像大小可能差 5 到 10 倍。这两种差异的解法正好相反。物理尺度差异靠数据集平衡和多尺度训练解决成像尺度差异优先靠相机布局解决。我一般不建议一上来就用算法硬扛成像尺度差异如果最小包裹在图像里的短边还不到 24 个像素YOLOv11 的浅层特征图再厉害也难救回来换更高分辨率的相机或调整安装高度比调模型便宜得多。现场判断方法很简单拿标定板摆几个代表尺寸的箱子走一遍皮带截图看最小件的像素短边低于 24 到 32 像素就优先处理相机而不是急着堆模型。2.2 用一个脚本把标注框的“尺度真相”捞出来做多尺度优化前先把数据集的尺度分布量化。我习惯写一个一次性脚本把训练标注全部扫一遍输出每个框的宽高、面积、短边以及它们落在不同像素区间的占比。有了这个分布后面所有的训练参数才有依据否则全在凭感觉调参。import os import numpy as np from glob import glob label_dir dataset/labels/train image_w, image_h 1920, 1080 # 与训练图像尺寸一致 boxes [] for txt_path in glob(os.path.join(label_dir, *.txt)): with open(txt_path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue _, cx_n, cy_n, w_n, h_n parts # 归一化坐标转回像素 box_w float(w_n) * image_w box_h float(h_n) * image_h boxes.append((box_w, box_h, os.path.basename(txt_path))) short_sides np.array([min(w, h) for w, h, _ in boxes]) print(样本框数量:, len(short_sides)) print(短边最小/最大:, short_sides.min(), short_sides.max()) print(短边中位数:, np.median(short_sides)) for lo, hi in [(0, 32), (32, 64), (64, 128), (128, 256), (256, 2048)]: ratio ((short_sides lo) (short_sides hi)).mean() print(f短边 {lo}~{hi}px 占比: {ratio:.2%})这段代码的核心是统计短边而不是面积。YOLO 的特征金字塔在匹配锚框时关注的是目标框的长边和短边与特征层感受野的关系一张 1920×1080 的图缩放到 640 之后短边小于 32 像素的目标在下采样 32 倍的最高层特征图上只剩一两个点基本等于不存在。如果你统计完发现短边 32 像素以下的框占比超过 10%那后面所有小目标优化都要围绕这个基数来做而不是盲目堆模型参数量。2.3 标注规范里的两个细节斜放大件与透明胶带物流包裹经常斜放、叠放YOLOv11 默认输出水平矩形框一个斜 30 度的大纸箱用水平框框出来会带进大量皮带背景模型学到的特征里混入了非包裹信息置信度和定位精度都受影响。常见做法是标注时尽量贴紧外轮廓允许框的四角切掉一点斜角区域但不要把周围空余背景大面积框进来。如果产线上斜放比例很高先用旋转框预标注工具标一遍再按最小外接水平矩形转成 YOLO 格式能减少人工标歪的概率。透明胶带和拉伸膜是另一个不稳定因素。一个 40cm 的箱子中间横着一条透明胶带视觉上会把同一个包裹劈成上下两半模型可能学到“这里是两个物体”的错误语义。标注时我要求标注员跨过胶带把整个包裹框成一个完整框同时在图片增强阶段把胶带当作一种普通干扰纹理处理不为它单独加负样本。加负样本会让检测头变得保守反而增加漏检这一点在后面的避坑章节还会讲到。3. 用 Ultralytics YOLOv11 跑通训练环境配置、参数调优与小目标优化3.1 环境配置最小路径从 pip 安装到第一次验证推理YOLOv11 目前在 Ultralytics 仓库中维护最省心的安装方式是直接 pip 安装。个人建议使用 Python 3.10 或 3.11能省掉很多编译期的隐性问题比如某些老版本 OpenCV 与 numpy 的 ABI 冲突。装完之后在命令行里先做一次推理验证环境pip install ultralytics yolo detect predict modelyolov11s.pt sourcetest.jpg imgsz640第一次执行会自动下载 yolov11s.pt 权重到用户缓存目录。现场工控机如果离线手动把 .pt 文件放到项目当前目录命令会优先读取本地文件不会卡在下载环节。跑通了推理再跑最小训练命令yolo detect train datapackage.yaml modelyolov11s.pt epochs100 imgsz1280 batch16 device0训练输出在runs/detect/train/下weights/best.pt是验证集上最优的权重。这里有个选型建议先用 s 模型跑通全流程验证集指标稳定后再根据部署设备换 m 或 l。工控机只有 CPU 推理时用 n 模型加 INT8 导出8G 显存的 GPU 用 s24G 显存再考虑 m。YOLOv11 的骨干网络在特征复用上比 v8 细致但物流场景里这种“大目标为主、尺度跨度大”的数据模型结构带来的差异会被数据集噪声掩盖不要迷信换模型就能解决所有问题。数据配置 package.yaml 至少包含 train 和 val 路径加 names 字段path: /data/package train: images/train val: images/val names: 0: parcel注意 names 的索引必须与标注文件里的类别编号一致不然训练时类别错位损失函数直接崩。这一步是最常见的新手翻车点报错信息通常伪装成 mAP 奇低。3.2 多尺度数据集上的生产参数组合与取舍下面的参数组合是从物流分拣场景中沉淀下来的基线不是照抄炼丹参数每条都有取舍逻辑。参数建议值说明imgsz1280最低不要低于 960保证最小包裹短边不低于 24 像素mosaic0.8物流样本边界语义干净不需要全程 1.0close_mosaic10最后 10 个 epoch 关闭 mosaic回归真实分布scale0.2别开默认值过度缩放会抹掉小包裹rectTrue长宽比极端画面节省显存且保持原图比例batch按显存能撑多大撑多大显存不够优先降 imgsz不降 batchimgsz 是最优先要调的参数。物流分拣常见大视野相机一张 1920×1080 的图里如果最小包裹只有 24 像素缩放到 640 后只剩 8 像素特征金字塔 P3 层再努力也无法恢复纹理信息。我一般直接拉到 1280 训练显存爆了就降到 960 配 s 模型而不是牺牲检测精度去迁就显存。scale 参数是第二个容易踩的坑。默认值 0.5 表示训练时随机缩放范围是原图的 0.5 到 1.5 倍对物理尺度差异大的数据集有一定增强作用但对物流这种小包裹本来就小的场景是灾难小包裹被再次缩小短边直接跌破有效像素下限。我把 scale 压到 0.2只做轻微尺度抖动让模型见过的尺度分布贴近真实。血泪经验一组开 scale0.5 的训练小件召回率比不开低了 8 个点教训是参数增强不是越多越好。mosaic 也要谨慎。mosaic 把四张图拼一张对包裹这种边缘语义清晰的物体切出来的半个包裹会让模型学到“边界可以被切开”的错误先验导致现场遮挡场景漏检。我的做法是训练前期保持 0.8最后 10 个 epoch 用 close_mosaic 关掉让模型把注意力拉回完整的包裹轮廓上。这个操作在 Ultralytics 里直接传close_mosaic10即可。rectTrue对物流线特别适用。皮带上的画面往往一张图只有一两个包裹长宽比极端按默认矩形批处理会把大图硬缩到正方形浪费大量像素。开启 rect 批训练后同一批次内按相近长宽比分组保持原图分辨率显存占用更低小目标也能保留更多细节。代价是训练时间略长但对分拣场景值得。3.3 小目标优化的两个立即可用手段数据重采样与切片推理如果 2.2 节的统计结果里短边 32 像素以下的框占比超过 10%或者验证集上小件召回率明显低于大件先做数据重采样。方法很简单把包含小目标的样本复制一份到新目录成倍提高小目标在训练集中的出现频率而不是给损失函数硬加权重。从头写样本权重逻辑要改训练源码容易引出版本问题复制样本则完全不碰训练逻辑。import shutil, os from glob import glob label_dir dataset/labels/train image_w, image_h 1920, 1080 small_samples [] for txt in glob(os.path.join(label_dir, *.txt)): with open(txt) as f: lines [l.split() for l in f if l.strip()] # 该样本中最小短边 32 像素判为小目标样本 has_small any(min(float(l[3]) * image_w, float(l[4]) * image_h) 32 for l in lines) if has_small: small_samples.append(txt) os.makedirs(dataset/images/train_rs, exist_okTrue) os.makedirs(dataset/labels/train_rs, exist_okTrue) for txt in small_samples: img txt.replace(labels, images).replace(.txt, .jpg) shutil.copy(img, dataset/images/train_rs/) shutil.copy(txt, dataset/labels/train_rs/)复制完成后把新目录加入 package.yaml 的 train 列表即可。重采样之后小目标样本权重翻倍模型在训练时见小件的次数变多收敛后的召回率会明显改善。但注意过采样比例不要超过原始小目标数量的 3 倍否则模型会对小目标过拟合把背景纹理误判成包裹误检率会上升。推理侧的小目标优化常用手段是切片推理。4K 分辨率的画面直接整图送进模型缩放到 1280 后小目标信息已经损失大半。切片推理把大图切成 640×640 的块带少量重叠分别推理再把所有框映射回大图坐标合并。自己写实现大约二十行def infer_sliced(model, img, slice_size640, overlap64, conf0.3, iou0.5): h, w img.shape[:2] boxes [] y0 0 while y0 h: x0 0 while x0 w: tile img[y0:y0 slice_size, x0:x0 slice_size] res model(tile, imgszslice_size, confconf, verboseFalse) for x1, y1, x2, y2, score, cls in res[0].boxes.data.cpu().numpy(): boxes.append([x1 x0, y1 y0, x2 x0, y2 y0, score, cls]) x0 slice_size - overlap y0 slice_size - overlap # 合并重叠区域重复检测到的框 return non_max_suppression(np.array(boxes), iou_thriou)切片推理要注意两个参数。重叠率取 10% 到 15%太小会让被切到边界的包裹在相邻块里各自露出半个合并困难太大则推理时间暴涨。合并阶段的 NMS 阈值建议比单图推理略高取 0.5 左右否则同一个包裹跨块出现两次时会被当成两个目标。如果包裹被切片从中间切开两个半框距离较远NMS 合并不了这时可以用加权框融合 WBF 代替 NMS按置信度加权拼出一个完整框。切片推理的代价是速度慢 3 倍左右只在小目标漏检成为瓶颈时使用不要全场景无脑开。如果你不想自己写用 SAHI 这类现成轮子也可以只是可定制性差一些。网上还有一种做法是往 YOLOv11 里加类似 HCANet 的注意力头强化小目标支路在小件密集场景有增益但对物流这种“尺度跨度大”的场景先把数据重采样和切片层做透收益远比换注意力结构来得快。4. 从检测框到抓取坐标机械臂协同控制的坐标解算链路4.1 手眼标定先分清眼在手外与眼在手上的外参求法机械臂协同控制里视觉标定是最容易“玄学”的一环。物流分拣的相机布局有两种常见方式。第一种是眼在手外相机固定在支架上视野覆盖整个皮带或分拣工位相机到机械臂基座的外参是固定的标定一次可以长期使用这也是推荐方案因为标定完不用随机械臂运动刷新。第二种是眼在手上相机装在机械臂末端标定的是相机到工具坐标系的变换机械臂每次运动都要重新做位姿变换标定误差会被臂的关节运动放大只用于狭窄空间需要相机贴近包裹的场景。两种布局都依赖手眼标定方程 AXXB。A 是机械臂末端位姿B 是标定板在相机坐标系下的位姿X 是相机到机械臂基座或工具系的变换。OpenCV 封装了完整求解流程import cv2 import numpy as np # objp: 棋盘格角点的世界坐标格距 30mm 时按实际标定板尺寸填 objp np.zeros((7 * 7, 3), np.float32) objp[:, :2] np.mgrid[0:7, 0:7].T.reshape(-1, 2) * 0.03 R_obj2cam_list, t_obj2cam_list [], [] for corners in corners_list: # corners_list 按帧存储 cv2.findChessboardCorners 结果 ret, rvec, tvec cv2.solvePnP(objp, corners, cam_mtx, dist_coeff) R_obj2cam, _ cv2.Rodrigues(rvec) R_obj2cam_list.append(R_obj2cam) t_obj2cam_list.append(tvec.reshape(3, 1)) R_cam2base, t_cam2base cv2.calibrateHandEye( R_gripper2base_list, t_gripper2base_list, R_obj2cam_list, t_obj2cam_list, methodcv2.CALIB_HAND_EYE_TSAI )先调用solvePnP解出每一帧标定板在相机坐标系下的外参再把机械臂记录的末端位姿和标定板位姿成对送入calibrateHandEye。注意机械臂运动轨迹要同时包含旋转和平移不要只做平移否则 AXXB 求解退化标定结果误差很大。标定板也不要与相机像平面平行倾斜 15 到 30 度能让求解更稳定。采集 15 到 20 组覆盖多个高度和角度的位姿标定后用已知尺寸的 marker 做精度验证反投影误差大于 5mm 就重新标不要急着往下走。4.2 像素到基座坐标的完整链路去畸变、内参逆变换与编码器补偿拿到检测框只是第一步像素坐标(u, v)想要变成机械臂基座坐标要经过四步去畸变、相机内参逆变换、手眼外参变换、传送带编码器补偿。我用一个函数把整条链路串起来import cv2 import numpy as np def pixel_to_base(u, v, z, cam_mtx, dist, T_cam2base, enc_offset, enc_k): # 1. 去畸变得到归一化相机坐标 uv np.array([[[u, v]]], dtypenp.float32) pt cv2.undistortPoints(uv, cam_mtx, dist, Pcam_mtx) x_n, y_n pt[0][0] # 2. 乘深度 z转换到相机三维坐标 X_cam np.array([x_n * z, y_n * z, z, 1.0]) # 3. 乘手眼标定得到的外参转到机械臂基座系 X_base T_cam2base X_cam # 4. 补偿拍照到抓取之间传送带移动的位移 delta_x enc_offset * enc_k # 编码器脉冲数 * 毫米/脉冲 X_base[0] delta_x return X_base[:3]第一步的undistortPoints会同时完成畸变校正输出归一化坐标乘以深度 z 就得到相机坐标系的三个分量。z 是包裹顶面在相机坐标系里的高度物流场景里如果皮带面高度固定取固定值加上包裹高度即可如果包裹高度不确定机械臂夹爪要么做“下压后抓取”的柔性动作要么在相机旁加一个激光测距仪把测到的值实时填入 z。没有高度信息的纯单目方案抓取时会让夹爪在竖直方向找不到落点。编码器补偿是最容易被忽略的一步。相机拍下包裹的时刻包裹在皮带上位于位置 A机械臂从收到指令到手指到位通常要 300 到 500ms此时包裹已经移动到了位置 B。如果不补偿机械臂按位置 A 抓必然空抓。enc_k是标定出来的毫米/脉冲斜率把机械臂沿传送带方向手动推一段已知距离记录编码器脉冲差两者相除得到斜率。这里强调一句不要用“时间乘标称皮带速度”做补偿皮带加减速和打滑会让标称速度失准编码器脉冲才是传送带运动的本体。我可以把这段代码复制到任何一条皮带线直接跑通前提是编码器要装在主动辊或跟随辊上装在被驱动辊上会丢脉冲。4.3 把检测结果封装成机械臂能消费的“抓取事件”机械臂不能直接消费 YOLOv11 输出的框它需要一条明确的抓取指令。我一般会把一次检测输出变成一条 JSON 事件带上抓取所需的全部字段。包含坐标、编码器位置、置信度和版本信息的完整事件帧长这样{ seq: 1024, cls: parcel, conf: 0.87, x_base_m: 0.452, y_base_m: 0.118, z_base_m: 0.05, enc_pos: 88123, ts_ms: 1720000000000, model_version: yolov11s_20250115, handeye_version: he20250110 }seq 是现场对账的锚点。机械臂每完成一次抓取回传同 seq 的完成帧给视觉端视觉端如果没收到回执就认为这一单丢失进入下一拍避免把上一次包裹重复抓。ts_ms 用毫秒时间戳配合 enc_pos 可以回放现场时序。model_version 和 handeye_version 这两个字段是我吃过亏之后才加上的现场出问题的时候能立刻分清是模型权重换过、手眼标定改过还是机械臂程序被人动过。通信时序上视觉端通过 TCP 把事件帧发给 PLC 或机械臂控制器机械臂执行完回一条 ack。写一个示意性的发送循环import socket, json sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((192.168.0.10, 5500)) # PLC 视觉接口地址与端口 while True: event build_grasp_event() # 检测结果 - 4.2 坐标换算 - JSON sock.send((json.dumps(event) \n).encode(utf-8)) ack sock.recv(64) if ack bdone: continue_cycle()生产现场不太建议用 Python 写这个循环实时性和稳定性都不够换成 C 或把 JSON 改成二进制帧更可靠。但字段设计和事件-回执时序是通用的先把这个结构定下来后面换任何语言都只是序列化方式的变化。5. 物流视觉协同的 5 个翻车点与排查办法5.1 反光塑封袋从画面里“消失”曝光是最大杀手现象黑色塑封袋包裹在皮带上方的照明灯下出现高光过曝检测框时有时无置信度在 0.3 上下飘。原因高光让袋面纹理被抹平YOLOv11 在过曝区域拿到的是一整块亮斑边界特征全部丢失加上塑封袋颜色和皮带接近模型把高光区域当成了背景。解决优先改光学而不是改模型。在镜头前加偏振片消除反光调整光源角度避免直射光反射进相机这两个动作往往能把置信度从 0.3 拉回 0.85 以上。如果是透明塑封袋还要在训练集里刻意加亮部遮挡增强模拟不同光照角度下的反光形态。偏振片几十块钱能解决的问题不要用模型硬扛。5.2 透明胶带把包裹劈成两个框标注与 NMS 双重背锅现象一个 40cm 的纸箱中间有一条横向透明胶带识别结果出来是两个紧挨着的小框机械臂去抓其中一个小框直接抓空。原因标注阶段标注员按视觉边界把胶带两侧分别标成了两个框模型学到的语义就成了“这是两个物体”部署时 NMS 把置信度较低的大框抑制掉只留下两个小框。解决标注规范要求跨过胶带画一个完整框胶带只是包裹表面的一种纹理不是物体边界。部署侧把 NMS 的 IoU 阈值从默认 0.45 提高到 0.6 左右让两个靠得很近的框有机会合并回一个大框。如果还不行在端侧对检测结果做加权框融合按两个框的置信度加权拼接成完整外接框。查这个问题时先看标签再怀疑模型这条属于标注一致性问题不是模型能力问题。5.3 机械臂抓偏空抓传送带速度不是恒定值现象视觉回显的检测框中心很准机械臂就是抓偏空抓率 15%看起来像是视觉和机械臂“各干各的”。原因拍照时刻到手爪到位之间有几百毫秒延迟皮带在这段时间内的瞬时速度有波动。按固定皮带速度乘时间算出来的位移补偿误差随节拍累积节拍越快偏差越大。解决在主动辊或跟随辊上装增量编码器每次拍照时把编码器脉冲读数写入抓取事件。机械臂在手爪到位前读取当前编码器值用过去 N 个节拍的脉冲差做短时滑窗预测估算包裹此刻的真实位置。补偿公式是“编码器脉冲差 × 毫米/脉冲”而不是“时间 × 标称速度”。系统时间戳在皮带打滑的瞬间不可靠编码器才是传送带运动的本体。5.4 小包裹被大包裹淹没训练集尺度失衡现象同一个模型大纸箱的召回率 95%小盒子的召回率只有 60%漏检基本都漏在小件上。原因产线采集数据时大件样本堆得多2.2 节的尺度统计显示短边 32 像素以下的小目标占比不到 10%。模型在训练过程中见到的大尺度纹理远多于小尺度自然对小目标不敏感。解决按尺寸分桶统计后对少于阈值的小目标样本做重采样成倍增加小件在训练集中的出现频率训练时把 imgsz 拉高让整体尺度上移现场推理端对小件密集区域做切片推理。验证时不要只看整体 mAP按尺寸分桶查看各桶 AP50小件那一桶的指标才是多尺度优化是否生效的判据。5.5 部署导出后掉点训练增强没关干净现象PT 模型在线测试效果不错导出 ONNX 或 TensorRT 后整体掉 5 到 10 个点现场表现和训练时对不上。原因训练最后几个 epoch 还在跑 mosaic 和 scale 增强模型学习到的图像分布是增强后的分布部署后的输入是真实图像没有对应增强输入分布发生偏移。另一个常见原因是导出imgsz与训练时不一致导出的缩放在不同分辨率下重新采样特征分布跟着变了。解决训练配置加close_mosaic10让最后 10 个 epoch 回归真实分布。导出时固定imgsz与训练一致。TensorRT 做 INT8 量化时用现场真实采集帧做校准集不要用训练集里增强后的图片校准集分布偏移是 INT8 掉点的常见元凶。6. 现场验收怎么做用分桶统计回答“值不值得上”6.1 按尺寸分桶验收一张表看清视觉和机械臂各自的问题现场验收不能只看一个 mAP。我的做法是录制 500 帧实际产线画面离线跑模型按包裹短边分成四个桶分别统计召回率、精确率再在产线上测机械臂抓取成功率。下表是我最近一次验收的实测分布你们不要照抄数字照抄会翻车重点是理解这个分桶逻辑包裹短边样本数召回率精确率机械臂抓取成功率 20cm1200.920.950.9020-50cm1500.960.960.9550-100cm1500.980.970.96 100cm800.970.970.90验收实操时让皮带跑 30 分钟把视觉发出的事件帧和机械臂回传的完成帧按 seq 对账。对不上的 seq 单独拉出来看是漏检、误检还是抓偏。漏检和抓偏的处理思路完全不同漏检优先调置信度阈值节拍要求高时把 conf 从 0.25 提到 0.4漏一个包的代价是退货率升高抓偏则优先查夹具、标定和编码器补偿。如果项目整体上看某一尺寸桶的抓取成功率不到 92%先怀疑机械臂侧而不是视觉侧因为视觉检出率在分桶里往往已经说明问题。6.2 留痕到位后期排查才有后悔药我坚持一个习惯所有抓取事件日志都落一份 JSON 到本地除坐标外必须包含 model_version、handeye_version、编码器标定斜率。训练时的 imgsz、增强配置也写成 txt 文件与权重放在一起。现场出了问题拿到日志先看版本字段权重没换但标定矩阵换过直接怀疑手眼标定权重换过再对比新模型的训练参数。我做过最蠢的事是一次现场同时换了标定又换了模型事后完全分不清是哪一步引入的误差蹲了半下午才排查出来。后来每次改动只改一项其余记录全部留痕这是用时间换来的教训。这套从多尺度数据集统计到 YOLOv11 训练参数调优再到机械臂坐标解算和验收分桶的链路看着不复杂但每一步都在把“玄学”变成可复现的工程。希望帮到你。本文还有配套的精品资源点击获取
返回列表