cfzd / FcaNet

FcaNet: Frequency Channel Attention Networks
MIT License
510 stars 100 forks source link

c2wh = dict([(64,56), ( 128,28), (256,14) ,(512,7)]) 是否需要改动问题 #21

Open Lewis0427 opened 3 years ago

Lewis0427 commented 3 years ago

我的输入尺寸是(64,48,48)若使用原始c2wh = dict([(64,56), ( 128,28), (256,14) ,(512,7)]) ,再用adaptive_avg_pool2d() 由48变为56(小尺寸变大尺寸),会不会损害性能呢,应该怎么处理较好呢?麻烦赐教

cfzd commented 3 years ago

@Lewis0427 根据我们的经验,分辨率不会影响结果,因为对于不同大小的分辨率,我们提取频率的时候总会在一个固定的7x7频谱上进行提取,相关的代码可以参看这个地方: https://github.com/cfzd/FcaNet/blob/aa5fb63505575bb4e4e094613565379c3f6ada33/model/layer.py#L38-L39 上述代码的想法很简单,假设输入为n x n,那么其总共有n x n个频谱。但其实在一张14x14的特征图上的(2,2)频率分量他的绝对频率是和一张7x7的特征图上的(1,1)分量是一致的。因此我们为了保证不同stage(也即不同分辨率)的频率都是一致的,我们做了这样的归一化,这就导致分辨率不会影响结果。即使在COCO这种本身图像大小不一的数据集上也能work。

我们设置这个c2wh主要还是为了在固定分辨率和网络结构的情况下(一般是分类网络),提前确定好大小并预先生成对应频谱的DCT 权重,而不用每次都resize,这样应该会快一点。

cfzd commented 3 years ago

@Lewis0427 如果你的尺寸可以确定的话,那你完全可以按照你的尺寸去修改c2wh, 这样还可以省去adaptive_avg_pool2d

Lewis0427 commented 3 years ago

@Lewis0427 如果你的尺寸可以确定的话,那你完全可以按照你的尺寸去修改c2wh, 这样还可以省去adaptive_avg_pool2d

我不是7的倍数的尺寸写到c2wh中,不会影响吗?还请赐教

cfzd commented 3 years ago

@Lewis0427 不会影响,这个其实和分辨率大小没什么关系。

Lewis0427 commented 3 years ago

万分感谢您!

CaptainPrice12 commented 2 years ago

你好,感谢你的分享!其实我关于c2wh setting那里有一些疑问。我看大多数类似的提问是关于如果feature size不是正好7X7这样的话c2wh该怎么设置。我看你的回复是adaptive_avg_pool2d那里做resize应该不会影响性能。不过那些问题都是基于feature map的H和W相等的情况。如果我的feature size的W和H不相等,比如input size是200X80这个大小的,如果最后的feature map size是25X8这样的话,DCT那里继续做adaptive_avg_pool2d的resize是否会影响最后的结果呢?顺便问下对于input size是变化的的情况(不同batch的input size不同),FCA的resize这个效果如何呢?谢谢!

cfzd commented 2 years ago

@CaptainPrice12 即使宽和高不一样,也是一样的,我们在COCO上的实验不仅宽高不一样,输入分辨率还会变化,这样我们的方法依然能够很好的工作。

CaptainPrice12 commented 2 years ago

@cfzd 感谢你的回复!其实对channel分组我还有个疑问。如果不对channel做split成n组,而是每个DCT filter都对所有的channel做一次运算的话,就像issue#14讨论过的https://github.com/cfzd/FcaNet/issues/14, 这么做的话运算量确实会大一些,效果会怎么样呢?如果不同的DCT filter对每个channel都做运算的话,是不是最终应该对每个channel上不同DCT filter(e.g., top16)的运算结果再求一次平均从而得到最后这个channel的结果呢?