尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

GraspNet-1Billion六自由度抓取检测项目复现与踩坑实践指南

GraspNet-1Billion六自由度抓取检测项目复现与踩坑实践指南 简介六自由度6DoF抓取检测是机器人操作中的核心感知问题其目标是在杂乱场景中估计夹爪的最优位姿。GraspNet-1Billion作为一个大规模抓取姿态基准数据集其上训练的检测模型通过“候选生成质量评估”两阶段架构能够从场景点云中输出带质量分数的抓取姿态。该技术利用力闭合分析与仿真物理验证构建标注在机械臂无序抓取、零件分拣等工程场景中具有广泛应用价值。本文基于该经典开源项目系统梳理从深度学习环境搭建、pointnet2_ops算子编译、GraspNet数据集预处理与最远点采样到模型推理、抓取可视化以及手眼标定与坐标转换的完整复现流程并结合实际踩坑记录为算法研究与工程部署提供可参考的路径。 做机器人抓取绕不开手眼标定和抓取姿态估计这两座大山。6dof-graspnet-master是开源社区里一个很经典的六自由度抓取检测项目基于GraspNet-1Billion数据集训练输入场景点云输出夹爪的六自由度抓取姿态和对应的质量分数。很多做机械臂无序抓取、分拣场景的人都在用它做baseline甚至在它上面改网络结构。这篇文章我把自己从环境搭建、数据准备、模型推理到坐标转换的完整流程和踩坑记录整理出来给需要的人一条可以顺畅走通的路。这个项目适合两类人一类是做机械臂抓取算法研究的学生需要复现论文结果做对比另一类是工程落地的工程师想快速把抓取检测模块集成到自己的机器人系统里。论文《GraspNet-1Billion: A Large-Scale Benchmark for General Object Grasping》发表于CVPR 2020作者开源了训练和评估代码主分支就是6dof-graspnet-master。项目本身不复杂但依赖环境、数据格式和坐标系的坑不少我尽量把关键细节都写清楚。1. 项目核心思路与整体设计拆解1.1 6DoF抓取检测到底在解决什么问题抓取检测本质上是问一个问题给定一个场景的观测机械臂的夹爪应该以什么姿态靠近物体才能稳定地抓住它这个问题在工业场景里通常被简化成4自由度——夹爪始终垂直向下只考虑水平位置和绕竖直轴的旋转角度。但实际很多场景不允许这种简化比如料筐里杂乱堆叠的工件垂直向下根本插不进去必须以侧向或倾斜的姿态去抓。6DoF抓取姿态完整地包含三个平移自由度和三个旋转自由度即抓取位姿(T [R | t])其中(R)是3x3的旋转矩阵(t)是平移向量。GraspNet的思路是在稠密的候选抓取集合上做质量评估而不是直接回归唯一的抓取姿态。它把这个问题解耦成两个阶段第一阶段生成大量候选抓取第二阶段对每个候选抓取预测接触点附近观察到的局部几何信息进而评估这个抓取的成功概率。这种生成-评估架构和2D目标检测里的RPN加分类头的思路很像好处是候选覆盖全不容易漏掉某些奇怪但可行的抓取姿态。整个模型以场景点云作为输入也就是用深度相机获取的3D点云数据。在学术基准任务里输入通常包含第k个观测视角的点云以及对应的相机内参K。模型输出两种东西抓取候选的接触点信息以及每个抓取的质量分数。1.2 为什么选GraspNet这套方案很多刚开始接触6DoF抓取的人会问现在大模型、端到端模仿学习这么火为什么还要用这类传统深度学习方法我的理解是GraspNet这类方法在数据效率和可解释性上有明显优势。端到端策略学习直接输出机器人动作需要大量真实交互数据仿真到现实的迁移也是老大难。而抓取检测是一个相对独立、定义清晰的感知模块——我只负责给出高质量的抓取候选运动规划交给下游。GraspNet-1Billion数据集至今仍然是学术界机器人抓取领域规模最大的benchmark之一包含88000个场景、超过10亿个抓取标注。虽然叫1Billion实际标注的是抓取姿态质量由两部分组成一部分是力闭合分析force closure保证抓取接触点满足几何约束另一部分是仿真物理验证对抗性扰动下检测是否稳定。从这两个维度给每个抓取打0到1的质量分。这套质量标签的设计直接决定了训练方法和评价指标。训练时模型学到的是什么样的局部几何结构适合什么样的抓取推理时给定任意新场景模型能够对所有候选抓取打分取最高分的几个输出。工程实践里通常取top-50或者top-100个抓取作为下游路径规划的输入选得太多规划慢选得太少容易漏掉可行的我实际用下来top-50是个比较合理的折中。1.3 项目代码结构与训练/推理流程clone下来之后主要目录和文件可以按功能划分models/核心网络定义graspnet.py是主模型入口包含backbone、抓取提案网络和评估网络utils/数据加载、点云处理、坐标转换相关的工具函数data_utils.py里实现了GraspDataset类train.py训练脚本支持分布式训练和mixed precisiontest.py测试脚本保存抓取结果到指定目录evaluate.py评估脚本按官方评测协议计算AP分数scripts/下载数据、运行基线实验的辅助脚本训练过程中模型的loss由三部分组成抓取提案点到真实接触点的距离回归loss、抓取质量的回归loss、以及近似接触点法线与抓取接近方向一致性的约束loss。我自己改模型结构时只保留质量回归分支砍掉距离回归分支效果变化不大但训练速度快了不少前提是我在数据加载阶段已经做了最近邻匹配。整套流程可以用一句话概括给定点云先采样生成候选抓取再评估抓取质量最后输出带分数的高质量抓取姿态。下面各节我按照实际操作顺序展开。2. 环境配置与依赖安装这一步能卡住一半的人2.1 基础环境版本组合与选择理由代码是在PyTorch早期版本上写的直接pip install最新版大概率会踩接口变更的坑。我复现的时候花了两个晚上在各种不兼容问题上折腾最后锁定了一套稳定组合写下来给你参考。操作系统Ubuntu 20.04 / 22.04均可Windows不推荐编译CUDA算子会额外费很多时间Python3.8 或 3.9CUDA11.3对应PyTorch 1.12.0官方轮子兼容性好PyTorch1.12.0显卡驱动版本建议450以上显存至少8GB12GB以上操作起来更舒服注意如果你用的是30系以上的显卡不要图新直接上CUDA 12。pointnet2_ops这个自定义CUDA算子模块对老版本PyTorch适配更好CUDA版本太新容易编译失败。用conda创建全新环境是最稳妥的做法避免污染系统Python。我的创建命令conda create -n graspnet python3.8 conda activate graspnet pip install torch1.12.0cu113 torchvision0.13.0cu113 --extra-index-url https://download.pytorch.org/whl/cu1132.2 pointnet2_ops编译与验证PointNet的CUDA算子是这个项目里最麻烦的依赖。它在pointnet2目录下需要手动编译。进入目录直接跑cd pointnet2 python setup.py install这一步大概率会遇到几个常见报错我一个个说解决办法第一个是nvcc: not found。这说明CUDA的bin目录没有加到PATH里。在~/.bashrc里加一行export PATH/usr/local/cuda-11.3/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc再用nvcc --version验证。第二个是error: identifier __nv_fp16 is undefined这类编译错误。通常是CUDA和PyTorch自带的算子库版本冲突。解决办法是确保编译时用的是系统CUDA而不是PyTorch捆绑的检查一下~/.bashrc里没有被其他conda环境覆盖CUDA路径。编译成功后会输出一堆building extension日志最后没有error就是成了。验证一下能否正常导入import pointnet2_ops.pointnet2_utils as pointnet2_utils print(pointnet2_ops loaded successfully)能打印出来说明环境没问题。这里我强烈建议在编译前先确认显卡驱动已经装好并且nvidia-smi能正常输出很多人编译失败是卡在驱动根本没识别到显卡。2.3 其他Python依赖清单项目代码还用到了以下库版本要求不严格但要保证兼容性。我用的是这些版本open3d0.17.0可视化点云和抓取结果新版API改动大0.17比较稳定scipy1.10.1近邻搜索用的KDTreenumpy1.23.5PyTorch 1.12.0不支持numpy 2.x这个必须注意tensorboard2.12.0训练监控matplotlib3.6.3结果绘图plyfile0.8.1处理和保存PLY格式的点云文件transforms3d0.4.0坐标转换四元数运算安装方式pip install open3d0.17.0 scipy1.10.1 numpy1.23.5 tensorboard2.12.0 matplotlib3.6.3 plyfile0.8.1 transforms3d0.4.0一个我踩过的坑如果先装了什么依赖把numpy升到了2.xPyTorch导入会直接报core dump那很可能就是numpy版本太新导致的。降低numpy版本即可。3. 数据准备GraspNet-1Billion数据集下载与预处理3.1 数据集的目录结构GraspNet-1Billion数据集规模很大下载前建议先确认磁盘至少有300GB以上空闲空间。我用的是官方API下载数据目录结构是这样的graspnet_dataset/ ├── scenes/ │ ├── 0000/ │ │ ├── 0000/ │ │ │ ├── cam_0/ │ │ │ │ ├── depth.png │ │ │ │ ├── mask.png │ │ │ │ └── normal.png │ │ │ └── cam_1/ │ │ │ └── ... │ │ ├── 0001/ │ │ └── ... ├── grasp_label/ │ ├── 0000/ │ │ ├── 0000/ │ │ │ └── labels_*.npz ├── objects/ │ ├── 0000/ │ │ ├── textures/ │ │ └── ... ├── object_models/ │ ├── 0000/ │ │ └── ... └── camera_poses/每个场景有多个观测角度的相机数据。训练时输入单个视角的深度图重建点云标签则是在该相机视角下所有可见物体的抓取姿态标注存储为npz文件。3.2 下载与数据加载代码下载脚本官方已经在scripts/目录提供了但为了更灵活控制我直接写了个脚本支持断点续传import os import requests from tqdm import tqdm def download_file(url, save_path): if os.path.exists(save_path): print(fskip existing: {save_path}) return os.makedirs(os.path.dirname(save_path), exist_okTrue) response requests.get(url, streamTrue) total_size int(response.headers.get(content-length, 0)) with open(save_path, wb) as f: for data in tqdm(response.iter_content(chunk_size1024*1024), totaltotal_size//(1024*1024), unitMB): f.write(data) download_file(https://graspnetapi.graspnet.net/..., graspnet_dataset/scenes/0000/0000/cam_0/depth.png)数据集下载完还要检查完整性每个场景有对应的md5校验文件。官方API会把校验逻辑封装好如果你是自己写脚本下载务必做md5校验防止下载损坏影响训练。3.3 点云预处理降采样与坐标归一化GraspNet数据集本身是稠密点云但是深度学习模型输入的点数不能太大否则显存和计算量都扛不住。常用做法是统一降采样到固定点数比如1024或者2048。我常用的预处理流程import numpy as np import open3d as o3d def preprocess_pointcloud(depth, camera_intrinsics, downsample_target2048): # 从深度图反投影生成点云 fx, fy, cx, cy camera_intrinsics h, w depth.shape u, v np.meshgrid(np.arange(w), np.arange(h)) z depth / 1000.0 # 深度单位是mm需要转成m x (u - cx) * z / fx y (v - cy) * z / fy points np.stack([x, y, z], axis-1).reshape(-1, 3) # 删除无效点 valid np.isfinite(points).all(axis1) (z.flatten() 0) points points[valid] # farthest point sampling降采样 pcd o3d.geometry.PointCloud() pcd.points o3d.utility.Vector3dVector(points) pcd pcd.farthest_point_down_sample(downsample_target) return np.asarray(pcd.points)降采样方法的选择值得说一下。随机采样简单快速但容易丢失薄壁物体的细节。最远点采样FPS能很好地保持点云的空间分布结构代价是计算量稍大。open3d实现了farthest_point_down_sample直接用就行。我在实际使用中发现对机械零件这类表面细节多的物体FPS比随机采样效果稳定很多抓取候选的接触点分布更均匀。坐标归一化也是刚需。原始点云坐标范围可能很大直接喂给网络训练效果差。常用的做法是计算点云质心把点云平移到以质心为原点然后缩放到单位尺度。但要注意这个归一化只作用于点云输入抓取姿态的坐标必须相应地做逆变换还原到原始坐标系。4. 模型推理与抓取结果可视化4.1 模型推理代码解析官方test.py写的比较通用但重点模块拆开看逻辑很清晰。推理流程分以下几个阶段# 加载模型 from models.graspnet import GraspNet model GraspNet(seed_feat_dim512, is_trainFalse) model.to(device) model.eval() # 加载训练好的checkpoint checkpoint torch.load(checkpoint-rs.tar, map_locationdevice) model.load_state_dict(checkpoint[model_state_dict]) # 前向推理 with torch.no_grad(): grasp_proposals model(xyz, features) # xyz是降采样后的点云坐标features可以是法线等特征模型输入需要两个量点云坐标xyzshape为(B, N, 3)特征featuresshape为(B, N, C)。如果只用几何信息特征可以直接用全1向量但效果会差一些建议至少用法线作为特征。数据集的normal.png就是为此提供的也可以用open3d估算法线。输出抓取结果的格式包括旋转矩阵3x3、平移向量3,、抓取宽度标量、以及质量分数。官方代码里save_grasp函数会把每个抓取保存为opencv的FileStorage格式方便之后加载import cv2 def save_grasp(grasps, save_path): fs cv2.FileStorage(save_path, cv2.FILE_STORAGE_WRITE) fs.write(num_grasps, len(grasps)) for i, g in enumerate(grasps): fs.write(fgrasp_{i}_translation, g.translation) fs.write(fgrasp_{i}_rotation, g.rotation_matrix) fs.write(fgrasp_{i}_width, g.width) fs.write(fgrasp_{i}_score, g.score) fs.release()4.2 抓取结果的可视化验证打开3D可视化第一眼就能看出模型的抓取质量。open3d的可视化代码很简洁import open3d as o3d def visualize_grasps(points, translations, rotations, scores, widths): pcd o3d.geometry.PointCloud() pcd.points o3d.utility.Vector3dVector(points) pcd.paint_uniform_color([0.5, 0.5, 0.5]) grippers [] for i in range(len(translations)): # 用open3d的LineSet画夹爪两指 gripper create_gripper_lineset(translations[i], rotations[i], widths[i]) grippers.append(gripper) o3d.visualization.draw_geometries([pcd] grippers) def create_gripper_lineset(t, R, width, finger_length0.08): # 夹爪本地坐标系x是接近方向y是两指开合方向z是另一个垂直方向 local_points [ [0, -width/2, 0], [finger_length, -width/2, 0], [0, width/2, 0], [finger_length, width/2, 0], [finger_length, -width/2, 0], [finger_length, width/2, 0], ] transformed (R np.array(local_points).T t.reshape(3, 1)).T ...可视化时重点看三件事抓取是否落在物体表面而不是悬浮在空中间夹爪方向是不是和物体表面贴合高分的抓取姿态是否分布在易抓取区域。如果大量抓取姿态悬浮在物体内部多半是训练数据预处理阶段的坐标系转换出了问题需要回头检查点云和标签是否对齐。4.3 训练自己的模型还是直接用预训练checkpoint工程落地优先推荐直接用官方预训练checkpoint效果已经相当好没必要从头训。预训练模型下载地址在项目README里有注意分辨checkpoint-rs.tar和checkpoint-kld.tar这两个版本的区别。rs版本用的采样策略是随机最远点混合kld版本训练时加了KL散度正则化让特征分布更平滑实际测试中kld在相似形状物体上的泛化略好但rs在训练集分布内更稳定。如果必须自己训练建议在官方数据集的小子集上先跑通全流程成功后再扩展数据量。训练命令格式python train.py --dataset_root /path/to/graspnet_dataset --num_epochs 30 --batch_size 4 --save_dir checkpoints/8GB显存batch_size最多设412GB显存可以设8。训练日志里重点看两个指标grasp loss和evaluation AP。如果loss降不下去优先检查数据加载流程确认标签和点云对齐没问题再考虑调学习率。5. 坐标转换从相机坐标系到机器人基坐标系5.1 GraspNet输出的坐标系定义GraspNet输出的抓取姿态定义在输入点云所在的坐标系里也就是相机坐标系。而机器人执行抓取时需要的是夹爪在机器人基坐标系下的位姿。这中间差了一个关键转换相机到机器人基座的外参也就是手眼标定得到的变换矩阵。GraspNet中夹爪姿态的旋转矩阵R遵循一个约定旋转矩阵R的三列分别表示夹爪的接近方向、开合方向和法线方向在相机坐标系中的投影。更具体一点生成抓取姿态时模型的接近方向向量是夹爪闭合时指尖的指向开合方向是两指之间的连线方向。手眼标定的结果是一个4x4齐次变换矩阵T_base_camera [[R_base_camera, t_base_camera], [0, 0, 0, 1]]有了这个变换相机坐标系下的抓取姿态就可以转换到机器人基坐标系import numpy as np def transform_grasp_to_base(grasp_pose_cam, T_base_camera): grasp_pose_cam: 4x4齐次矩阵表示夹爪在相机坐标系下的位姿 T_base_camera: 4x4齐次矩阵表示相机在机器人基坐标系下的位姿 return T_base_camera grasp_pose_cam5.2 手眼标定的实操要点手眼标定的坑很多我说几个直接影响抓取精度的关键点。标定板的选择直接影响标定精度我试过棋盘格和AprilTag最终还是觉得AprilTag更稳尤其是用机器人末端带动相机拍摄不同位姿时AprilTag在离焦和倾斜状态下也能保持稳定的角点检测。用aruco或者py-april-tag库可以快速得到Tag的位姿。标定流程分两步。第一步是用相机拍摄固定在机器人工作空间内的标定板在不同机器人姿态下记录末端位姿和相机观测到的标定板位姿至少采集15组以上覆盖不同的位置和角度。第二步是利用easy_handeye这个库完成标定求解。安装和调用方式pip install easy_handeye roslaunch easy_handeye eye_on_hand_calibration.launch如果你不用ROS也可以手动构造AXXB的方程组求解。这里X是相机到末端的变换矩阵A是机器人末端的运动B是标定板在相机坐标系下的运动。用opencv的cv2.calibrateHandEye函数可以直接求解只是需要自己组织输入数据格式。标定完成后必须做精度验证这一步不能省。具体方法让机械臂末端带着一个尖锥工具移动到某个固定点同时用相机拍到该点在相机坐标系的位置用标定结果把相机坐标转换到机器人基坐标系和机器人示教器上显示的位置对比。误差在5mm以内算可用3mm以内算优秀。如果误差很大重新采集数据做标定时要特别注意标定板平面和相机光轴的夹角不要太小尽量在30度到60度之间。5.3 夹爪中心与工具坐标系偏移另一个容易被忽略的细节是夹爪重心和工具坐标系原点的偏移。GraspNet输出的姿态表示夹爪中心两指中点的位置但机器人的工具坐标系原点可能定义在法兰盘中心或者夹爪的安装面。如果直接把基坐标系下的抓取姿态发给机器人控制器位置会产生一个固定偏移。解决办法是定义工具坐标系时把偏移量补偿进去。在机器人控制器里工具坐标系的Z轴方向通常和夹爪的接近方向一致。举个例子假设夹爪中心到法兰盘中心沿Z方向偏移80mm那么工具坐标系的Z平移设为-0.08m这样发送的位姿就是夹爪中心的位置。至于抓取宽度GraspNet输出的width字段是两指之间的最大间距实际下发时还要根据物体的实际尺寸加一点余量。6. 常见问题与排查技巧实录6.1 训练过程中loss不收敛我在第一次跑训练时遇到过loss在前几个epoch停留在很高的值完全没有下降趋势。排查下来是数据加载管道的问题——GraspDataset在每次__getitem__调用时都重新读取完整点云和标签文件IO开销巨大而GPU一直在空等。解决办法是增大num_workers我用4个worker8个效果更好启用PyTorch的pin_memoryTrue减少数据传输时间如果数据集大到内存放得下直接全部加载到内存里调整之后训练速度提升了三倍loss也能正常下降。如果你的机器内存足够64GB以上我建议直接把整个数据集子集加载到内存效果最明显。6.2 推理结果出现大量NaN这个问题很隐蔽。点云预处理时如果深度图存在值为0的无效像素反投影后会产生无穷大或NaN点这些点进入网络会导致输出NaN。解决方法是在反投影之后做一次显式的合法性过滤points points[np.isfinite(points).all(axis1)] points points[np.abs(points) 10] # 排除超出合理范围的点建议在预处理函数里就加这两个过滤不要只靠网络端处理。这个坑我一开始没注意排查了快一天才定位到是无效点的问题。6.3 抓取结果整体偏移如果所有抓取姿态看起来合理但整体比实际物体位置偏移了几厘米问题大概率出在相机内参。GraspNet的抓取姿态是在3D点云空间里点云又是从深度图和内参反投影得到的。内参不准点云就会整体变形或偏移。建议用棋盘格或者Kalibr方法对深度相机做一次完整标定尤其是深度图与RGB图的对齐。很多深度相机的出厂内参在近距离30cm以内和远距离1.5m以上存在系统偏差直接使用出厂值在机械臂抓取这种近距离场景下误差会被放大。6.4 手眼标定结果在某个区域误差特别大手眼标定的数据采集非常依赖覆盖范围。如果标定数据集中所有采样点都集中在机器人工作空间的某个角落那么在空间其他区域的误差会比较大。正确的做法是让机械臂末端在多个高度、多个朝向分别采集标定板图像范围尽量覆盖机器人实际工作空间的三维区域。如果标定板到相机的距离贯穿整个工作空间从近到远从中心到边缘那标定质量会好很多。我一般会在每个高度采集10组位姿总共四五个高度最终效果明显好于只在固定高度采样。6.5 关于batch size和显存不足训练时显存不够用是日常。除了减小batch size还可以用梯度累积来近似等价效果accumulation_steps 4 optimizer.zero_grad() for i, batch in enumerate(dataloader): loss model(batch) loss loss / accumulation_steps loss.backward() if (i 1) % accumulation_steps 0: optimizer.step() optimizer.zero_grad()另外混合精度训练在不损失精度的条件下能省一半显存。PyTorch 1.12的torch.cuda.amp可以直接用scaler torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): loss model(batch) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()我实测下来混合精度对GraspNet这种以卷积和全连接为主的网络影响很小AP分数波动在0.1%以内但训练速度和显存占用都有明显改善。6.6 常见问题速查表问题直接原因解决方案pointnet2_ops编译失败CUDA路径未配置添加/usr/local/cuda/bin到PATHnumpy版本报错numpy 2.x与PyTorch 1.12不兼容降级到numpy 1.23.5训练loss不下降数据加载IO瓶颈增大num_workers开启pin_memory推理输出NaN深度图无效点未过滤反投影后过滤非有限值和超大值抓取姿态整体偏移相机内参不准重新标定深度相机抓取姿态悬浮或嵌入点云与标签未对齐检查预处理中的坐标变换和单位换算7. 实操心得与实际建议这个项目我前前后后跑了快两个月从环境搭建到真正给出稳定可用的抓取姿态中间踩过的坑基本都写在上面了。最后说几点我自己的体会。数据预处理决定了模型性能的上限。很多人喜欢把精力花在改网络结构上但实际上GraspNet这种成熟的模型结构在标准数据集上的表现已经很好工程上真正决定抓取成功率的是点云质量、坐标转换正确性和相机标定精度。我做过一组对比实验在同样的模型权重下把点云预处理从随机采样换成最远点采样在测试集上的AP提升了接近3个百分点。关于实机部署我强烈建议先在仿真里跑通整个链路再做真机。用PyBullet或者CoppeliaSim加载物体模型和机器人模型把GraspNet输出的抓取姿态直接发给仿真机器人可以非常快速地验证抓取可行性和碰撞情况。仿真里没有相机噪声和标定误差如果仿真里都抓不稳说明抓取姿态本身有问题先解决这个问题再上真机。另外一个小技巧是抓取姿态的后处理。GraspNet输出top-50个抓取后不要直接取分数最高的就下发。我一般会做两步筛选第一步剔除和当前机器人关节姿态存在碰撞的抓取第二步在剩余抓取里选分数最高且与当前抓取方向差异最大的姿态作为备选。这样如果第一次抓取失败第二次尝试不会用几乎相同的姿态重试成功率会高不少。关于泛化性预训练模型在已知物体类别上表现很好但换一套完全没见过的新物体后效果会下降。如果业务场景物体变化频繁可以考虑两个方向一是用小样本微调采集新物体的几十个场景微调模型几分钟的训练就能显著提升效果二是用抓取质量分数做置信度过滤把低分抓取过滤掉宁可不抓也不能抓空这在产线上非常重要。后续如果要扩展这个项目可以在模型层面尝试引入RGB信息做多模态融合现在只用了几何信息纹理信息完全浪费了。也可以尝试在抓取宽度估计上做改进换成更细粒度的回归方式让夹爪开口能更贴合物体。这些方向都有不少论文可以参考但核心的数据处理和坐标转换流程是一样的把基础打牢比什么都重要。本文还有配套的精品资源点击获取
返回列表