关于PointPillars模型的损失,其沿袭了SECOND的做法。在类别分类损失和box回归损失的同时还包含角度损失和方向损失。

角度损失

PointPillars中角度的编码使用真实值和Anchor的残差。但是再使用SmoothL1计算具体损失时会先计算出残差的sin值,再使用sin值来计算损失。

1.编码

class ResidualCoder(object):def __init__(self, code_size=7, encode_angle_by_sincos=False, **kwargs):super().__init__()self.code_size = code_sizeself.encode_angle_by_sincos = encode_angle_by_sincosif self.encode_angle_by_sincos:self.code_size += 1def encode_torch(self, boxes, anchors):"""Args:boxes: (N, 7 + C) [x, y, z, dx, dy, dz, heading, ...]anchors: (N, 7 + C) [x, y, z, dx, dy, dz, heading or *[cos, sin], ...]Returns:"""anchors[:, 3:6] = torch.clamp_min(anchors[:, 3:6], min=1e-5)boxes[:, 3:6] = torch.clamp_min(boxes[:, 3:6], min=1e-5)xa, ya, za, dxa, dya, dza, ra, *cas = torch.split(anchors, 1, dim=-1)xg, yg, zg, dxg, dyg, dzg, rg, *cgs = torch.split(boxes, 1, dim=-1)diagonal = torch.sqrt(dxa ** 2 + dya ** 2)xt = (xg - xa) / diagonalyt = (yg - ya) / diagonalzt = (zg - za) / dzadxt = torch.log(dxg / dxa)dyt = torch.log(dyg / dya)dzt = torch.log(dzg / dza)if self.encode_angle_by_sincos:rt_cos = torch.cos(rg) - torch.cos(ra)rt_sin = torch.sin(rg) - torch.sin(ra)rts = [rt_cos, rt_sin]else:rts = [rg - ra] #角度编码在此cts = [g - a for g, a in zip(cgs, cas)]return torch.cat([xt, yt, zt, dxt, dyt, dzt, *rts, *cts], dim=-1)

2.计算sin difference

因为sin(a - b) = sinacosb-cosasinb,这里做了一下拆分。

box_preds_sin, reg_targets_sin = self.add_sin_difference(box_preds, box_reg_targets)
@staticmethod
def add_sin_difference(boxes1, boxes2, dim=6):assert dim != -1rad_pred_encoding = torch.sin(boxes1[..., dim:dim + 1]) * torch.cos(boxes2[..., dim:dim + 1])rad_tg_encoding = torch.cos(boxes1[..., dim:dim + 1]) * torch.sin(boxes2[..., dim:dim + 1])boxes1 = torch.cat([boxes1[..., :dim], rad_pred_encoding, boxes1[..., dim + 1:]], dim=-1)boxes2 = torch.cat([boxes2[..., :dim], rad_tg_encoding, boxes2[..., dim + 1:]], dim=-1)return boxes1, boxes2

3. 计算SmoothL1 Loss

@staticmethod
def smooth_l1_loss(diff, beta):if beta < 1e-5:loss = torch.abs(diff)else:n = torch.abs(diff)loss = torch.where(n < beta, 0.5 * n ** 2 / beta, n - 0.5 * beta)return loss

应该注意到以上角度损失的计算没有考虑到预测方向和实际方向完全反向的情况,因为sin(0)和sin(k*pi)值都为0。所以,作者又补充了一个方向上的损失。

方向损失

定义了正反两个方向(num_bins=2),通过limit_period函数将角度限定再(0,2*pi)这个区间。

将朝向角[0,pi)转化为0,(pi,2*pi)转化为1,使用one-hot编码表示。

@staticmethod
def get_direction_target(anchors, reg_targets, one_hot=True, dir_offset=0, num_bins=2):batch_size = reg_targets.shape[0]anchors = anchors.view(batch_size, -1, anchors.shape[-1])rot_gt = reg_targets[..., 6] + anchors[..., 6]offset_rot = common_utils.limit_period(rot_gt - dir_offset, 0, 2 * np.pi)dir_cls_targets = torch.floor(offset_rot / (2 * np.pi / num_bins)).long()dir_cls_targets = torch.clamp(dir_cls_targets, min=0, max=num_bins - 1)if one_hot:dir_targets = torch.zeros(*list(dir_cls_targets.shape), num_bins, dtype=anchors.dtype,device=dir_cls_targets.device)dir_targets.scatter_(-1, dir_cls_targets.unsqueeze(dim=-1).long(), 1.0)dir_cls_targets = dir_targetsreturn dir_cls_targets
def limit_period(val, offset=0.5, period=np.pi):val, is_numpy = check_numpy_to_torch(val)ans = val - torch.floor(val / period + offset) * periodreturn ans.numpy() if is_numpy else ans

使用交叉熵损失来计算方向损失。

class WeightedCrossEntropyLoss(nn.Module):"""Transform input to fit the fomation of PyTorch offical cross entropy losswith anchor-wise weighting."""def __init__(self):super(WeightedCrossEntropyLoss, self).__init__()def forward(self, input: torch.Tensor, target: torch.Tensor, weights: torch.Tensor):"""Args:input: (B, #anchors, #classes) float tensor.Predited logits for each class.target: (B, #anchors, #classes) float tensor.One-hot classification targets.weights: (B, #anchors) float tensor.Anchor-wise weights.Returns:loss: (B, #anchors) float tensor.Weighted cross entropy loss without reduction"""input = input.permute(0, 2, 1)target = target.argmax(dim=-1)loss = F.cross_entropy(input, target, reduction='none') * weightsreturn loss

【OpenPCDet】PointPillars模型中的角度和方向损失?相关推荐

  1. Unity 计算角度和方向

    在UGUI中计算角度和方向 直接上代码 using System.Collections; using System.Collections.Generic; using UnityEngine;pu ...

  2. Unity使用c#开发遇上的问题(六)(3dmax围绕指定中心旋转,unity中动态调用预制体并根据模型旋转指定角度)

    文章目录 前言 一.3dmax创建子弹.炮塔及武器库 1.相关模型 2.炮塔模型引入unity,无法绕旋转球旋转,重新调整 1.3dmax中默认炮管的中心点 2.选择层次界面 3.选择编辑工作轴 4. ...

  3. add_metrology_object_generic将测量对象添加到计量模型中

    目录 add_metrology_object_generic(算子) 描述 可能的形状 测量区域的定义 通用参数 参数 add_metrology_object_generic(算子) add_me ...

  4. 使用PCL从CAD模型中提取不同视角下的点云

    使用PCL从CAD模型中提取不同视角下的点云 最近在做一个关于提取不同视角下点云的算法,看了许多关于这方面的博客,也查了许多资料. 链接:https://blog.csdn.net/qq_196009 ...

  5. PD的CDM模型中的三种实体关系

    转自:http://www.cnblogs.com/syf/articles/2480580.html PD的CDM模型中的三种实体关系 CDM是大多数开发者使用PD时最先创建的模型,也是整个数据库设 ...

  6. 【工大SCIR笔记】浅谈Transformer模型中的位置表示

    作者:哈工大SCIR 徐啸 0. 何为位置信息 首先简单谈一下位置信息.一般将位置信息简单分为绝对位置信息和相对位置信息,并且前者对句子语义的影响不大,更为重要的是后者. 以情感分析 (Sentime ...

  7. MLM模型中,是否应该按15%的比例mask?

    翻译自 Should You Mask 15% in Masked Language Modeling? 摘要 MLM模型约定俗成按照15%的比例mask,主要基于两点:更多的mask比例对于学习更好 ...

  8. PBR以及在Disney和UE渲染模型中的使用

    PBR,基于物理的渲染模型,是当前主流游戏引擎使用的真实感3D渲染模型,在游戏场景渲染中,它用更接近光学物理的方式,建立一个对全场景材质的大一统shader.大一统shader的好处包括:统一美术制作 ...

  9. 可以这样理解视觉Transformer模型中patch交互的关系

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 01 研究问题 随着计算机视觉领域的不断发展,基础视觉任务研究中受自然语言处理(NLP)的模型结构设计(Tr ...

最新文章

  1. 两边双虚线是什么意思_单黄线和双黄线有什么不同?很多人都记不对,被扣分都不知道...
  2. java如何调windows框_java – JDialog.setAlwaysOnTop(true)将所有对话框带到Windows下的前面...
  3. 【java】RMI教程:入门与编译方法 远程
  4. mysql数据库简单语句
  5. 交互进CMU后可以学计算机吗,转专业必看!申请计算机的先修课要求,以CMU为例...
  6. http协议包头分发一些理解
  7. 计算机在线考试摘要,基于WEB的网络在线考试系统-毕业论文中文摘要题目(可编辑).doc...
  8. 编程基本功:如何判断两个线段有重叠?
  9. 在队列同步器中,同步队列为什么是双向链表,而等待队列是单链表?
  10. Axure RP9 水平滑动效果制作
  11. SpringBoot学习:整合shiro(rememberMe记住我功能)
  12. GNS3导入c7200路由器
  13. 【githubshare】支持有声小说与文本小说,可下载 mobi、epub、txt 格式文本小说,兼容 Win
  14. 为什么用红墨水试验检测BGA焊接情况?我教你如何对结果预判!
  15. shell脚本:删除文本中的字母、找单词、筛选,匹配,删除,替换
  16. 怎样在手机自带的邮件服务器,如何在手机上收发学校邮箱信件
  17. 咸鱼看书之《射频与微波电子学》(3:电路学数学基础之:相量)
  18. 梦想CAD控件com接口界面控制右键弹出菜单
  19. 关于Kaggle入门
  20. 网闸——(好)物理隔离网闸——入门篇

热门文章

  1. Panasonic多方电话会议
  2. #地图故事#教程1:如何制作标准地图
  3. 树莓派RTMP直播推流
  4. 家长控制小孩电脑软件
  5. 组态王7.5的移动客户端发布
  6. nltk-同义词|反义词示范
  7. iPhone 11为何嘴上说真丑,销量却真香? | Alfred数据室
  8. busybox 安装mysql_busybox的编译、使用及安装补充
  9. 圣诞节教你如何用Html+JS+CSS绘制3D动画圣诞树
  10. 【秋招面经】超星集团前端题目总结