为什么用sin/cos编码抓取角度?深入理解GG-CNN的4通道输出设计
为什么用sin/cos编码抓取角度深入理解GG-CNN的4通道输出设计【免费下载链接】ggcnnGenerative Grasping CNN from Closing the Loop for Robotic Grasping: A Real-time, Generative Grasp Synthesis Approach (RSS 2018)项目地址: https://gitcode.com/gh_mirrors/gg/ggcnnGG-CNNGenerative Grasping CNN生成式抓取卷积神经网络是机器人抓取领域的经典轻量级网络它从一张深度图像一次性预测出每个像素处的抓取质量与位姿。而它最巧妙的设计之一正是用 sin/cos 两个通道来编码抓取角度grasp angle encoding而不是直接回归角度值。本文带你从零理解这套 4 通道输出设计背后的数学动机帮你在做机器人抓取、姿态估计类项目时避开头号坑。一、先认识 GG-CNN 的 4 个输出通道GG-CNN 是一个全卷积网络输入一张 300×300 的深度图输出四张同样大小的特征图。每个通道各管一件事通道含义值域Qquality抓取质量该像素作为抓取中心有多好0 ~ 1cos抓取角度的余弦分量 cos(2θ)-1 ~ 1sin抓取角度的正弦分量 sin(2θ)-1 ~ 1width抓取宽度夹爪张开长度归一化0 ~ 150 像素四个输出头定义在 models/ggcnn.py 的pos_output、cos_output、sin_output、width_output四个卷积层中第 23~26 行结构升级版的 GG-CNN2 同样沿用这套设计见 models/ggcnn2.py。推理时的流程非常直观在 Q 图上找局部峰值峰值位置就是抓取中心再从该像素读出角度和宽度拼成一个完整的抓取矩形。这个逻辑实现在 utils/dataset_processing/grasp.py 的detect_grasps函数中。二、直接回归角度到底有什么坑很多同学第一反应是角度是个数直接输出一个 θ 不就行了问题出在角度是环形量而神经网络擅长学直线量。1. 边界不连续-89° 和 89° 会被误伤抓取角度定义在 [-90°, 90°) 区间内。一个接近 -89° 的抓取和一个 89° 的抓取在实际几何上几乎只差 2°翻转一下就重合了但如果直接回归角度并用 MSE 损失训练两者数值上相差约 178°损失会认为这是巨大错误——梯度方向完全错误训练在边界附近剧烈震荡。2. 抓取本身具有 180° 翻转对称性夹爪抓住物体的时候正着抓和倒着抓中心不变、方向旋转 180°是同一个抓取。代码里GraspRectangle.angle属性utils/dataset_processing/grasp.py 第 208~214 行用% np.pi把角度压缩到以 π 为周期的区间就是在显式处理这种对称性。直接回归角度时这个θ 和 θπ 等价的性质很难被 MSE 损失自然吸收。3. 评估指标对角度误差同样环形项目用 IoU 衡量抓取矩形是否命中其中角度容差判断GraspRectangle.iou函数angle_threshold参数也是按环形距离算的。也就是说训练目标、评估目标都天然环形只有直接回归角度这个环节是直线的三者不匹配。三、sin/cos 编码把角度映射到单位圆上解决办法来自一个经典技巧用 (cos, sin) 两个值表示角度相当于把角度扔上单位圆。训练端标签如何生成在 utils/data/grasp_data.py 的__getitem__中第 91~92 行标签是这样构造的cos self.numpy_to_torch(np.cos(2 * ang_img)) sin self.numpy_to_torch(np.sin(2 * ang_img))注意这里的2θ它不是笔误正是为了上面的 180° 对称性cos(2θ) 和 sin(2θ) 的周期是 π所以 θ 和 θ π 落在单位圆的同一个点上翻转等价性被自动满足角度在 ±90° 边界绕过去时sin/cos 值是平滑连续的MSE 损失不会再在边界处被撕裂两个分量各自值域都是 [-1, 1]尺度均匀有利于收敛。网络对 cos、sin 两个通道分别用 MSE 计算损失见 models/ggcnn.py 中compute_loss第 47~70 行四个通道的损失简单相加作为总损失训练脚本 train_ggcnn.py 就是逐 batch 地优化这个标量。推理端如何用 atan2 还原角度预测完成后的解码只有一行在 models/common.py 的post_process_output函数第 15 行ang_img (torch.atan2(sin_img, cos_img) / 2.0).cpu().numpy().squeeze()atan2(sin, cos)能稳健地还原出 [-π, π] 内的角度不会像arctan(y/x)那样丢失象限信息再除以 2 就得到真实抓取角度随后对 Q、角度、宽度三张图分别做高斯滤波平滑。 一句话总结这个设计把环形的角度问题转成直线的回归问题——训练时对 sin、cos 两个分量做 MSE推理时用 atan2 一步还原。这正是角度编码angle encoding在机器人抓取中的标准做法GG-CNN 是它的教科书级实现。四、4 通道如何协同从输出图到最终抓取把前面三块拼起来完整的推理链路是深度图送入 GG-CNN得到 Q / cos / sin / width 四张图post_process_outputmodels/common.py用 atan2 还原角度图并做平滑detect_graspsutils/dataset_processing/grasp.py在 Q 图上做局部极大值检测峰值间隔 ≥ 20 像素、阈值 0.2取 Top-N 峰值每个峰值处读取角度与宽度构造Grasp(center, angle, length)抓取矩形评估时用 IoU 判断是否命中真值抓取矩形utils/dataset_processing/evaluation.py 中calculate_iou_matchIoU 0.25 且角度差 30° 记为成功。你也可以跑一下 eval_ggcnn.py加--vis参数即可看到 RGB 图、深度图、Q 热图和角度热图四联可视化直观感受 4 通道各自在预测什么。五、总结这套设计值得抄作业 如果你在为自己的抓取网络、机械臂位姿预测设计输出层记住这三点角度类输出永远优先 sin/cos 编码配合 MSE 损失 atan2 解码天然规避环形不连续问题存在翻转对称性时用 2θ 编码周期 π 代替 2π让等价姿态映射到同一点多通道分解质量Q、角度cos/sin、宽度width各走一个输出头任务解耦、训练稳定。GG-CNN 凭借这个轻量 单遍前向的生成式设计实现了实时闭环抓取——而 4 通道输出设计正是它又准又快的重要底层原因。想动手实验可按 README.md 的说明安装依赖、加载 Cornell 预训练权重用 train_ggcnn.py 和 eval_ggcnn.py 走通完整的训练与评估流程。【免费下载链接】ggcnnGenerative Grasping CNN from Closing the Loop for Robotic Grasping: A Real-time, Generative Grasp Synthesis Approach (RSS 2018)项目地址: https://gitcode.com/gh_mirrors/gg/ggcnn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考