Reverse Attention的代码理解

本文解析了OSFormer中ReverseAttention和边缘注意力模块(REA)的代码实现,包括特征融合、边缘预测和DiceLoss计算。重点讨论了特征图上采样、边缘标签生成和与其他模块的交互。

前言

通过溯源Reverse Attention的论文,对反向注意力机制有了初步的了解。但是,仅仅通过论文很多细节的东西是没办法看到的,还是有很多疑问,这就需要阅读代码去理解。

  • 输入REA模块的不同层级的特征图(T4、T3、C2)是否和之前的Reverse Attention一样经过了上采样?
  • REA模块的输出边缘特征图 F e F_e Fe最终输出到了哪里?是否和之前的Reverse Attention一样与不同层级的REA输出相加到了一起?
  • 通过侵蚀实例掩码标签来获得边缘标签是怎么实现的?
  • Edge loss是怎么进行计算的?原论文中3.5节提到, L e d g e = ∑ j = 1 J L d i c e ( j ) L_{edge}=\sum_{j=1}^{J}L_{dice}^{(j)} Ledge=j=1JLdice(j)。那么, L d i c e L_{dice} Ldice又是什么?是V-Net论文中提到的Dice loss吗?那Dice loss有什么特别之处呢?这与之前的Reverse Attention所用的损失函数有什么区别?

在这里插入图片描述
OSFormer模型的搭建代码一共由4个类组成:OSFormer()、CISTransformerHead()、C2FMaskHead()、ReverseEdgeSupervision()。其中,涉及到反向边缘注意力的主要是C2FMaskHead()和ReverseEdgeSupervision()。

1. REA模块的代码实现

class ReverseEdgeSupervision(nn.Module):
    def __init__(self, chn):
        super().__init__()

        self.edge_pred = nn.Conv2d(
            chn, 1,
            kernel_size=3, stride=1,
            padding=1, bias=False)
        self.conv1 = nn.Conv2d(2, 1, kernel_size=7, padding=3, bias=False)

    def forward(self, feat_fuse, feat_high):
        avg_high = torch.mean(feat_high, dim=1, keepdim=True)
        max_high, _ = torch.max(feat_high, dim=1, keepdim=True)
        x = torch.cat([avg_high, max_high], dim=1)
        x = 1 - self.conv1(x).sigmoid()

        fuse = feat_fuse * x
        return self.edge_pred(fuse)

通过forward()前向传播函数可以看到,参数feat_high代表输入的特征图Input Features。对于feat_high先按照行求平均值,返回形状(行数,1);再对feat_high按照行求最大值,返回形状(行数,1)。将二者通过torch.cat()函数按行拼接,得到形状(行数,2)的tensor向量。然后使用(输入通道数=2,输出通道数=1,卷积核大小= 7 × 7 7 \times 7 7

.子程序 _窗口透明化, , 公开 .参数 临时句柄, 整数型 .参数 临时透明度, 字节型 .参数 临时透明色, 整数型 .参数 鼠标穿透, 逻辑型, 可空 .子程序 _监视热键, , 公开 .参数 响应事件, 子程序指针, , 注明:响应事件(热键标识,其它...),事件参数数目不限!如果再次监视热键将响应事件!。 .参数 键代码, 整数型, , 注明:触发事件的基本键,事件在基本键按下时触发,负数为放开时触发,1鼠标左键,2鼠标右键,更多查询相关帮助 .参数 功能键状态, 整数型, 可空, 注明:1 Alt 2 Ctrl 4 Shitf 8 Win 若要两个或以上的状态键,则把它们的值相加. .子程序 _进程是否存在, 逻辑型, 公开 .参数 进程名, 文本型 .子程序 变火箭筒, , 公开, _时钟_周期事件 写入 .子程序 超级武器, , 公开, _时钟_周期事件 写入 .参数 武器, 整数型, , 1~300 .子程序 穿墙, , 公开, _时钟_周期事件 写入 .子程序 单机点射, , 公开, _时钟_周期事件 写入 .子程序 遁地, , 公开, _时钟_周期事件 写入 .子程序 高空直走, , 公开, _时钟_周期事件 写入 .子程序 高空自杀, , 公开, _时钟_周期事件 写入 .子程序 救世主准星, , 公开, _时钟_周期事件 写入 .子程序 狙击连发, , 公开, _时钟_周期事件 写入 .子程序 快刀, , 公开, _时钟_周期事件 写入 .子程序 快速任务, , 公开, _时钟_周期事件 写入 .子程序 雷达显敌, , 公开, _时钟_周期事件 写入 .子程序 零秒换弹, , 公开, _时钟_周期事件 写入 .子程序 驱动安装, 逻辑型, 公开 .参数 强行安装, 逻辑型, 可空 .子程序 去除天空, , 公开, _时钟_周期事件 写入 .子程序 人体免疫, , 公开, _时钟_周期事件 写入 .子程序 人物去重, , 公开, _时钟_周期事件 写入 .子程序 人物自杀, , 公开, _时钟_周期事件 写入 .子程序 生化加血, , 公开, _时钟_周期事件 写入 .子程序 时钟读人物基址, , 公开, _时钟_周期事件 写入 .参数 人物基址, 整数型 .子程序 锁住准星, , 公开, _时钟_周期事件 写入 .子程序 无敌卡空, , 公开, _时钟_周期事件 写入 .子程序 无敌钻地, , 公开, _时钟_周期事件 写入 .子程序 无后坐力, , 公开, _时钟_周期事件 写入 .子程序 无限暴走, , 公开, _时钟_周期事件 写入 .子程序 无限飞天, , 公开, _时钟_周期事件 写入 .子程序 无限瞬移, , 公开, _时钟_周期事件 写入 .子程序 无限子弹, , 公开, _时钟_周期事件 写入 .子程序 隐身, , 公开, _时钟_周期事件 写入 .子程序 远程拆包, , 公开, _时钟_周期事件 写入 .子程序 重刀秒杀, , 公开, _时钟_周期事件 写入 .子程序 准星换色, , 公开, _时钟_周期事件 写入 .子程序 子弹加速, , 公开, _时钟_周期事件 写入 .声音 Go, 公开 .声音 Oo, 公开
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值