rayleizhu / BiFormer

[CVPR 2023] Official code release of our paper "BiFormer: Vision Transformer with Bi-Level Routing Attention"
https://arxiv.org/abs/2303.08810
MIT License
461 stars 36 forks source link

对BiFormer的理解 #23

Closed guixuef closed 1 year ago

guixuef commented 1 year ago

q_win, k_win = q.mean([2, 3]), kv[..., 0:self.qk_dim].mean([2, 3]) # window-wise qk, (n, p^2, c_qk), (n, p^2, c_qk)

这段代码的作用是什么?把这两个维度做了平均目的是什么呢?

rayleizhu commented 1 year ago

q_win, k_win = q.mean([2, 3]), kv[..., 0:self.qk_dim].mean([2, 3]) # window-wise qk, (n, p^2, c_qk), (n, p^2, c_qk)

这段代码的作用是什么?把这两个维度做了平均目的是什么呢?

为了得到region-level queries and keys。有了region-level queries and keys才能计算region-level affinity.

guixuef commented 1 year ago

非常感谢您的解答。 我对BiFormer其中的前半部分有些不理解。输入的x经过padding和分割,分成了7x7份,然后求x的q 与kv,再把q和kv的两个维度求了平均。我不清楚第一次粗略的筛选是怎么实现的,难道是先用每个区域的x都去计算qk根据大小取前几个构建邻接矩阵吗?您能结合关键的代码描述一下您的思路吗?以便我们更加清晰的理解您的优秀的作品。

rayleizhu commented 1 year ago
  1. 粗略的筛选是通过区域级别的表示(region-level queries & keys)计算的。
  2. 重构的版本可能方便理解一些。

https://github.com/rayleizhu/BiFormer/blob/1697bbbeafb8680524898f1dcaac10defd0604be/ops/bra_nchw.py#L75

https://github.com/rayleizhu/BiFormer/blob/1697bbbeafb8680524898f1dcaac10defd0604be/ops/bra_nchw.py#L82

guixuef commented 1 year ago

感谢您提供的代码。 我用YOLO5s加BiFormer,检测数据集NEU-DET,效果不是很好,跟YOLO5s相比没有提升。是BiFormer参数需要调整吗?

[from, number, module, args]

[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2 [-1, 1, Conv, [128, 3, 2]], # 1-P2/4 [-1, 3, C3, [128]], [-1, 1, Conv, [256, 3, 2]], # 3-P3/8 [-1, 6, C3, [256]], [-1,1,nchwBRA,[]], [-1, 1, Conv, [512, 3, 2]], # 5-P4/16 [-1, 9, C3, [512]], [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32 [-1, 3, C3, [1024]], [-1, 1, SPPF, [1024, 5]], # 9 ]

image
rayleizhu commented 1 year ago

不太了解YOLO5s, 也不理解你发的表格和截图的意义。也许你可以试试调整number of regions和topk。