exiawsh / StreamPETR

[ICCV 2023] StreamPETR: Exploring Object-Centric Temporal Modeling for Efficient Multi-View 3D Object Detection
Other
586 stars 63 forks source link

Segmentation task will be supported in the near future? #12

Closed pianogGG closed 1 year ago

exiawsh commented 1 year ago

Recently, we have no plan to support segmentation tasks in this repo (because the repo of PETR have supported it https://github.com/megvii-research/PETR/blob/main/projects/configs/petrv2/petrv2_BEVseg.py). We are trying to support vectorization map, as VectormapNet does.

pianogGG commented 1 year ago

Can I directly migrate the segmentation query and the corresponding head of PETRV2 to streamPETR to do the segmentation task?

exiawsh commented 1 year ago

I haven't tried it in StreamPETR yet, but your idea works well in the original PETR and PETRv2 framework. There are two possible impacts. First, the 2d detection head integration in StreamPETR may affect the performance of seg task. Secondly, stream training is unstable (relying on query denosing or 2d supervised), which may affect the convergence.

pianogGG commented 1 year ago

Hi,I am a novice,想请教一下: 1.这里说的stream training是指用连续帧来做训练,这样相关帧的关联性比较强,所以当前帧可以融合历史帧的信息进行训练,推理?streamPETR的话就是memory bank去储存历史帧的信息,这个利用等时间间隔或者等空间间隔去采样是不是都是为了说这个历史帧和我当前帧有强关联性,当前帧可以从历史帧中学到靠谱的信息?这边所说的stream training不稳定是不是就是指当前帧或许不能从历史帧中学到靠谱的信息?

  1. 时序模型的问题,当当前帧与历史信息强相关那么当前帧就可以从历史帧中得到正反馈,获得比较好的信息,当当前帧与历史信息弱相关时,历史信息的引入可能会对当前帧的判断有负反馈的作用,这个应该是时序模型的共同需要克服的难题? 3.streamPETR中需要获得data['lidar2img'],data['intrinsics'],data['timestamp'],data['ego_pose_inv'],data['ego_pose']和self.memory_velo,我看到velosity的获得是从这边rec_velo = all_bbox_preds[..., -2:][-1]也就是不是实时直接获取的,还有这两个data['lidar2img'],data['intrinsics']应该是可以得到的,data['timestamp'],data['ego_pose_inv'],data['ego_pose']是可以实时获得的吗?
  2. query denosing or 2d supervised是指?
exiawsh commented 1 year ago

1.Stream training与之相对的概念是sliding window训练。两者的区别在于:memory bank里的特征是复用的前面iteration的(stream training)还是说根据当前iteration参数重新计算的(sliding window)。Sliding window方式训练时间更长,因为需要对前面帧的特征重复计算。而Stream training由于复用前面iteration特征,训练时间短5-6倍,但是收敛稳定性差一些,所以需要query denosing或者2D监督去辅助收敛。关于这两种训练方式,你可以去看solofusion(stream training)和BEVFormer(sliding window)的代码。 2.针对于StreamPETR时序方面,在实际应用中一个还没有解决的问题是时间PE的插值和外推性能,比如训练的时间间隔是0.5秒,而测试是0.1秒,模型的泛化性很差。因为一般都是在关键帧进行训练,而实际应用时在要考虑频率更高的非关键帧,而这个问题其实也比较好解决,就是写一个略微复杂点的memory bank逻辑,把memory bank里的特征根据时间间隔分组,在每一帧推理时,本帧query只跟0.5秒左右时间间隔的memory做交互。 3.都是可以实时获得的,首先,data['timestamp'], rec_velo是实时获取的时间信息以及推理得到的速度信息,直接可以获取。你所提到的data['ego_pose_inv'],data['ego_pose'],在实际应用中可能会获取不到,但是他们的绝对值是没有意义的,但是你自己看一下我们算法的处理逻辑,其实我们需要的是两帧之间的相对pose信息,这是根据ego_pose_inv和ego_pose相乘得到的。 4.query denosing对应代码里perpare_for_dn部分,具体的你可以去参考DN-DETR;2d-supervised是指Focal-Head,也就是2D检测分支。