transformer和BEV
-
相关文章HDMapNet,BEVDet,BEVFormer,PersFormer,BEVFusion
-
2D -> 3D left splat shoot(LSS)原始文章,Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D, LLS,博客1,博客2,视频讲解
a、首先提取图像特征为24x512x8x22,【24就是BxCamN,就是batch=4,CamN 6个相机视角】,再一层卷积得到 24x105x8x22,105维,前41维为D,41个深度值的概率分布,后64维是每个位置的64维特征向量,然后这41维度和64维度进行外积,得到64x41维度的特征,这样每个特征像素位置都有一个64x41维度的特征feature,这样最终的特征维度维 4x6x64x41x8x22[BxcamNxCxDxHxW],再维度的调换,变成 4x6x64x8x22x41,这个东西被看做是点云的特征,即 4x6x(41x8x22)x64,每个点是64维的特征向量。b、手工设计一个3D点云,深度方向为[4m-45m],每隔1m一个点,并利用外参将点云转到车辆坐标系,这样得到 4x6x(41x8x22)x3的点云,最后的3代表[x,y,z]三个维度
b、接下来是对点云进行降为到 bev 200 x 200的格子内,可以理解为池化,具体有一套自己的方法,这里我并没有太理解【解释】,猜测大概意思就是画一个网格,落在网格内的元素进行求平均值,这样就得到了bev特征
-
self-attention,视频讲解
-
self-attention中Q,K,V必须同源,cross-attention中Q和V不同源,K和V同源,也就是说self-attention的QKV是一个句子内部的单词之间的相似度,而cross-attention的Q,来自句子A【图像A】, KV来自另外一个句子B【图像B】,计算A中每个单词与B中每个单词的相似度关系
-
Q,K,V怎么得到呢,直接通过三个矩阵Wq Wk,Wv乘以原始的embedding向量得到
-
lidar点云的3d检测:centerPoint的anchor free+SA-SSD的点云辅助loss+体素的backbone结合可以把检测做的更好
-
bevformer的一些解释:
a、bevformer中的history bev=None,并不使用
b、模型里的query,开始都是手工nn.Embeding(bev_h*bev_w,embed_dims)申请的一个grid,可以认为是随机初始化网格矩阵特征
c、attention里面的weight和offset都是query经过一个卷积层得到,是隐式的
d、self-attention里并不是经典的q,k,v,他没有q,直接value = q【如果有history q就再cat上hist q,没有就cat自己】,然后value和weight【w=q经过卷积得到】相乘就是最终的结果,
e、cross-attention里也没有经典attention的q,k,v,这次同样手工定义个grid坐标系,根据这个坐标系进行采样,和self-attention不同的是,这次采样是在图像上的feature上采样【grid经过外参和内参投影到图像上】,self-attention是在自身value【grid尺寸的,value=query】上进行采样,采样后的特征作为value,和weigh相乘,所以self-attention和cross-attention的相似之处都是value*weight,只是self-attention的value是query采样得到,cross-attention的value是图像feature采样得到,采样的坐标都是手工设计的那个grid坐标,加上query卷积出一个offset,生成新的grid采样坐标。也就是说value的生成一个是采样query得到,一个是采样图像feature得到,而weight都是通过query通过卷积得到,offset也都是query通过卷积得到,而query开始是直接手工embeding出来的,经过多层后,就把输出的query当作输入,多次循环
- selfattention的一些解释:
a、所谓self,值得是同一个句子内部,同一个图像内部的token的q,k,v进行计算相似度,这个需要再查询一下?
- FPN
bevformer中也有FPN,FPN的作用是为了解决多尺度问题,提升小物体检测性能,可以简单的理解为类似Unet漏斗结构的特征提取,在漏斗的后半部分进行预测
deformable attention
博客1接近原文,博客2公式以及公式解释,不一样的deformable attention没有了QK相乘,而是直接将QK替换成了一个线性层
deformable attention, ViT, Swin transformer, DERT
multi-head-attention和single-head-attention的区别【参考】
举个例子:原来Q, K, V的shape = 2 x 5 x 512[ batch x seq_len x embeding_len],multi-head-attention 头个数为8, 看起来是将tensor的最后一维按照头的个数进行了reshape = 2 x 5 x [8 x 64],因此在做QK相乘得到score时,原来Q*K为 (2 x 5 x 512) * (2 x 512 x 5) = 2 x 5 x 5,embedding_len乘没了,剩下5个词和5个词的相似度[5 x 5],而多头注意力机制相乘后是 (2 x 8 x 5 x 64) * (2 x 8 x 64 x 5) = 2 x 8 x 5 x 5,变成了有8个head的[5 x 5]的相似度,这样做我的理解是从一个头有5个词和5个词的相似度变成了8个头都有了5个词和5个词的相似度,造成8个头都有相似度这样的现象是计算每个相似度时,参加计算的embeddding的长度变短了,变成了原来的 1/8,也就是原来的一个embedding_len是切成了好几段,每一段都计算对应段的相似度,然后再拼接起来,直觉上时粒度更细一些
Swin transformer【参考】
- Patch Merging:swin transformer中的Patch Merging层就是将特征图先2x2的画网格,每个2x2内的相同位置的像素进行拼接成新的特征图,相当于在每个2x2的图像块相同位置进行采样,拼接成新的特征图,2x2四个位置,就变成了4个特征图,然后再进行全连接层,变成2个特征图的输出。
- swin transformer主要作为backbone使用,检测,分类,分割等
DETR End-to-end object detection with transformers【参考】
- 流程比较简单,就是图片经过一个cnn的bockbone,然后再经过多个transformer【比传统的transformer稍微变了一下形】,最后经过一个FNN全连接的头,就可以得到最终的检测框了
- 有个超参,就是要预测多少个物体,比如100,是手工设置,一般一副图像不会超过100个物体
- 训练的时候,这个100个box和label做匈牙利匹配,选出最匹配的两个label【假如真值是两个物体】,然后计算这两个物体的loss,预测的时候,预测出100个box,然后使用置信度阈值,过滤置信度最大的两个
- 博客里的loss解释,也没有说的很细节,但是可以作为大概理解用
Deformable DETR【参考】
- 相对于DETR修改的地方,1.backbone里提取特征从只用最后一层,改为提供多个层的特征,以期望解决小物体检测问题,2.transformer中的self-attention改为deformable-attention【有些细节,有的改了,有的没改】
- deformable DETR相对于DERT会收敛快和参数量也会更小,因为deformable DETR中的Q只会和周围的几个像素进行计算相似度,而DETR会和所有的像素进行相似度计算。
todo:
deformable attention, ViT, Swin transformer, DERT 这几个需要看一下论文和博客,自己想一想,看视频看的太快了,看不出细节
maskforermer
vectorNet
Layer norm batch norm 区别
gt是怎么生成的,loss是什么含义
现在建图
HDMapNet:
- 对于环视,他并没有什么特殊的处理,只是将它简单的叠加起来,比如6个camera,输入时的特征图就是 B x N x C x H x W 那就 (BxN) x C x H x W后送入 cnn网络,我自己倒是觉得,B x (N x C) x H x W 这样送入网络比较合适,因为第一个维度B代表batch szie, 第二个维度代表特征, 6个camera,这6个视角同样可以理解为不同的特征,范围将6乘到B上有点不合理,因为B这个维度在进行卷积操作的时候,B之间是不进行交互的,将6合并到B上后,相当于6个camera也不进行交互,这有点不合理。
- 在处理图像网络分支时,前向视角的图像特征转bev特征,将特征H和W维度reshape成H*W个长度,然后一个MLP,输入一个BH*HW长度的向量,然后再reshape BH x BW尺寸的bev特征,简单粗暴,并且是6个视角分别进行这样的操作,相互不受影响,也就是B x N x C x (H*W), 对N进行循环,B x C x (H*W)进行MLP操作,它的BEV解释为camera坐标系下的特征,然后用外参进行IPM转到地面BEV,我觉得这个步骤有点多余
- 最终的任务头就是普通的卷积操作,实例分割,instance分割,方向预测,方向其实也是一张特征图,每个像素预测一个类别,它将方向360度分成了36个类别,每10度一个类别,这样方向预测转换成了类别预测,方向的定义其实就是gt中车道线的前一个像素(x,y)减去后一个像素的(x,y)得到的向量再tan得到的方向,没有方向的不预测方向,所以最后的任务头就是完全是图像的分割任务,
- 加上雷达的点云,点云的操作其实就是先进行体柱话,x,y方向画个网格,把落在网格内的点进行处理成相同维度的向量,不够的就补充为0,多的就删掉,固定每个格子里面是N个点,特征是C为,论文中是9维[9维解释],这样就得到类似图像的规则的特征,接着就可以使用cnn进行卷积,论文中使用的事PointPillar,最终得到的lidar特征和6个camera的图像的特征直接在C通道cat一下,送入下一个bev decoder网络
- 关于gt的问题,nuSences数据集生成gt的方式时,nuScences是有自己的数据组织方式和数据格式的,要想使用它必须首先pip安装官方提供的一些库,然后,再在此基础上调用它的接口,封装成自己想要的样子,比如它的车道线是向量点,你要变成网络模型可以使用的图片gt,就要根据这些点坐标进行自己生成gt的分割图,instance图,direction图等,所以你就要熟悉它的接口返回的到底是什么,需要学习它的官方文档或者博客。nuSences的介绍,介绍2,介绍3,介绍4
todo,losss的含义,模型的结构要理解
地面重建
RoadBev,和视差共用backbone提取特征,视差任务和地面重建任务一起训练可以提升效果,roadBev和视差的loss直接加起来即可,或者做个加权
focal loss
focal loss是交叉熵cm的改进,主要改进的方面是对难分的样本和容易分的样本的损失比例进行调整,也就是提高 难分的样本的loss/容易分的样本的loss的比例,这样相当于让网络强制更在乎难分的样本,什么叫难分的样本就是预测概率是0.5左右的样本,而对于预测错误的样本【例如:标签为1的样本,应该预测为p=0.999,但实际预测为0.1】,这样的样本也减轻了惩罚loss,这相当于对预测错误的样本也进行了一定程度的容忍,个人觉得这是个副作用