Efficient-AI-Backbones
Efficient-AI-Backbones copied to clipboard
ViG如何将节点构成特征向量
您好,我在阅读ViG的论文中看到这句话——对于大小为H×W×3的图像,我们将其划分为N个patch。通过将每个patch转换为一个特征向量xi∈RD。 请问具体是怎么将每个patch转换成维特征向量的,还有每个patch的特征向量的维度是[1,D]吗?
最简单的做法:每个patch的尺寸为KxKx3
,拉直成一个向量变成3K^2
长,然后通过全连接层转化成长度为D
的向量。
也可以用几层卷积来做,效果会更好一些。
你的回答让我醍醐灌顶,真的十分感谢!
您好我又遇到了一个问题,DenseDilatedKnnGraph类中返回的张量维度为[2, batch_size, num_points, k]。num_points和k我理解成当前节点与哪k个节点连接,那么2的物理含义是什么呢?
不好意思,我还想请教一下。论文中写道:ViG网络可以通过其内容和语义信息逐步连接节点。 1.请问邻接矩阵是如何初始化的? 2.连接的边具体是如何更新的? 真的不好意思,我是个初学者。可能问题多一点
- 初始化是根据节点特征之间的K近邻做连接。
- 每次forward都去找K近邻。
我看代码里的DeepGCN类中,我使用配置pvig_ti_224_gelu 在定义Grapher类时,您将dilation设置为min(idx//4+1, max_dilation)。 然后我调试了代码,令K=9,发现实际上它找的是18或27个近邻。 请问这样做的用意是什么?也就是说近邻是会改变的吗?
这是DeepGCN论文(https://arxiv.org/abs/1904.03751)提出的dilated graph convolution,可以看看这个论文。
谢谢您的耐心解答。我还是对于初始节点嵌入有点疑惑: 在代码中,输入图片先是进入了Stem类,而Stem类完成的是一个4倍下采样的操作,请问Stem类有什么意义吗? 还有具体的图像切块代码在哪里呢? 真的很抱歉,一直打扰您。
您好,我看到论文中你将ViG用于Mask-RCNN的框架中。但是我看您的代码只公开了用于图像分类任务,如果将ViG用于Mask-RCNN中该如何修改呢?
请问图像切割具体在哪部分与Stem类的作用您知道了吗?
stem里的卷积的滑窗,就是切块的作用。
stem里的卷积的滑窗,就是切块的作用。
您好,我还有点疑惑。 比如input=[1,3,224,224] output=Stem(input)=[1,768,56,56] 这里相对于输出通道768维,每个特征图56*56,每个特征图应该是整幅图的特征而不是切片图本身的特征 感觉就不是每个图节点对于一张图像切片的意思了,请问这里该怎么理解呢?
stem的操作也可以分为2步:
- 224x224的图片切分成56*56个15x15的patch(每个patch有一定的重叠);
- 对每个7x7的patch进行stem卷积操作输出1个768维的向量。
stem的操作也可以分为2步:
- 224x224的图片切分成56*56个15x15的patch(每个patch有一定的重叠);
- 对每个7x7的patch进行stem卷积操作输出1个768维的向量。
x = self.stem(inputs) + self.pos_embed 那我可以理解为源码的实现思路其实是将每个56*56特征图视为节点然后add对应的位置编码吗
对
对
明白了 感谢大佬!
您好,请问ViG作为主干对小目标的检测或分割的效果好吗。因为我使用ViG作为Mask_RCNN的主干对于小目标的检测和分割的效果都不好。可能是我自己复现出现了问题,所以想问一下。
@Idiom1999 整体的mAP怎么样?
我们在COCO数据集的设定:以mmdet为框架,Pyramid ViG-S和Retinanet为例子。参数设定如下: (1) 将backbone的bn换成mmdet的sybn; (2) Img_per_gpu=4, gpu=8, lr=1.2e-4, wd:0.2, drop_path=0.15, k=15; (3) 预训练的checkpoint就用imagenet上的224x224的vig-s的就行,面对检测的1333x800的输入,把checkpoint中的相对位置编码直接bicubic/bilinear插值即可;
整体mAP很不好,就不好意思展示了。。。 是因为我代码有问题,我没有使用ViG-S的预训练模型,直接是从0开始训练所以效果不好。 最近在修改代码使能用上预训练模型,十分感谢您的回复。
stem的操作也可以分为2步:
- 224x224的图片切分成56*56个15x15的patch(每个patch有一定的重叠);
- 对每个7x7的patch进行stem卷积操作输出1个768维的向量。
论文中的Table 2,是不是可以这么理解: Output size为节点的个数,D为节点特征向量长度?
可以
@Idiom1999 @iamhankai is VIG used for segmentation activities can you share the weights
stem的操作也可以分为2步:
- 224x224的图片切分成56*56个15x15的patch(每个patch有一定的重叠);
- 对每个7x7的patch进行stem卷积操作输出1个768维的向量。
作者您好,感谢您的优秀工作!作为一名图卷积初学者,有一个疑问困扰着我,期待您的回复。 eg:输入(1,3,224,224)经过Stem四倍下采样之后输出为(1,768,14,14),表示一张图有14×14个节点,768表示一个patch大小输入Stem卷积输出1个768维向量,这里的patch大小具体是多少呢,怎么得到的
stem的操作也可以分为2步:
- 224x224的图片切分成56*56个15x15的patch(每个patch有一定的重叠);
- 对每个7x7的patch进行stem卷积操作输出1个768维的向量。
作者您好,感谢您的优秀工作!作为一名图卷积初学者,有一个疑问困扰着我,期待您的回复。 eg:输入(1,3,224,224)经过Stem四倍下采样之后输出为(1,768,14,14),表示一张图有14×14个节点,768表示一个patch大小输入Stem卷积输出1个768维向量,这里的patch大小具体是多少呢,怎么得到的
768=(16×16)×3,因为最后特征图的尺寸为14×14,所以对于输入224×224来说,Stem将输入分为了16×16个通道数为3的patch。