关于loss计算的multiscale_supervision函数
同学你好,关于你们loss计算函数multiscale_supervision,我有点看不懂,我的理解这是用来生成多尺度gt,应该用插值啊,看到代码中的这个部分有点不太理解(https://github.com/weiyithu/SurroundOcc/tree/main/projects/mmdet3d_plugin/surroundocc/loss/loss_utils.py),因此过来请教一下。
原始的gt是最高分辨率的,所以要得到低分辨率的标签需要进行pooling下采样而不是插值,但简单的average pooling和max pooling显然不适合occupancy gt的下采样。理论上的做法应该是对比如2x2x2的格子里取众数得到下采样的gt,但取众数这个操作比较难以批量化处理且速度较慢,因此采用了近似方法。
优雅,实在太优雅了!
同学你好,有两个问题想追问一下,望不吝赐教,1. 我还是不太看得懂你这个近似求众数的方法,请问有没有什么相关相关的博文或者paper推荐一下; 2. 如果这个地方采用average pooling,对性能的影响会很大嘛,请问你们有没有做过相关实验?
- 我们这里没有求众数,原始的gt是个Nx4的tensor,N表示N个点,4维向量分别是最高分辨率的xyz坐标和相应的semantic label。我们需要将N个点的信息通过索引的方式嵌入到HxWxZ的tensor里。对于最高分辨率的tensor,我们直接索引就行了,但对于低分辨率的,我们首先需要对xyz坐标进行下采样再去索引。
- semantic label不能直接取平均的。例如原始2x2x2的格子里有4个格子的label是4,有4个是0,那取完平均就变成了2,label完全不对了啊。
好的,明白了,感谢解答
这种方法进行下采样,理论上下采样的坐标点会对应原始HxWxZ的tensor里的多个点,但由于采用取整操作,实际会被最后赋予取整后最靠近的一个点,比如下采样的(0,0,0)坐标会对应上采样的(0,0,0),(0,1,0),(1,0,0),(0,0,1),(1,1,0),(1,0,1),(0,1,1),(1,1,1),实际赋值会是最后一个(1,1,1),这样的话感觉换成最近邻域插值也可以额
嗯嗯是的,同学你的理解是对的~
@torch.no_grad() def multiscale_supervision(gt_occ, ratio, gt_shape): start = int(ratio // 2) gt = gt_occ[:, start::ratio, start::ratio, start::ratio] return gt