0%

TPAMI2021 Affinity Attention Graph Neural Network

Affinity Attention Graph Neural Network for Weakly Supervised Semantic Segmentation 亲和力与图卷积神经网络的结合

将弱监督转换为semi-supervised(部分点是有标注的)

Introduction

图神经网络GNN可以可以直接在不同节点之间建立长距离关系(边),聚合多个连接节点的信息,从而抑制标签噪声的负面影响,在标签有限的半监督任务中GNN也表现良好。

GraphNet的缺点:

  • GraphNet通过阈值构建了一个未加权的邻接图(邻接矩阵A)作为输入,会丢失一些信息,这样的图不能准确地提供足够的信息,因为它平等地对待所有边,边权重为 0 或 1,尽管实际上并非所有连接的节点都期望相同的亲和力。(邻接图中所有的边都是0或1,并不能很好的体现亲和力)
  • GraphNet仅使用初始的标签节点进行训练,这使得当输入的初始节点特征不准确时,会导致不正确的特征聚合,只使用交叉熵损失,不能减轻不正确的节点、边和标签的影响。

作者设计了一个 Affinity Attention Graph Neural Network (A2GNN) 来解决上述问题。具体来说,作者提出了一种新的亲和力CNN来将图像转换为加权图,而不是使用传统方法来构建未加权图。加权图比未加权图更合适,因为它可以为不同的节点对提供不同的亲和力。之前的方法如GraphNet只考虑局部连接的节点,构建了一个基于超像素的未加权图,而本文同时考虑了局部和长距离边,构建的加权图将一个像素视为一个节点。

image-20220518201510961

特点:

  • soft edge
  • pixel as node
  • local and long distance

为了产生准确的伪标签,作者设计了一个新的 GNN 层,其中应用了注意力机制和边缘权重,以确保准确的传播。因此,具有弱/无边缘连接或低注意力的成对节点之间的特征聚合可以显着下降,从而相应地消除不正确的传播。随着训练的进行,节点注意力会动态变化。

Read more »

MM2018 Graphnet

Graphnet: Learning image pseudo annotations for weakly-supervised semantic segmentation

通过考虑图像 CNN 特征和图像空间分区之间的双重约束来构建图像上的图。这样的图不仅结合了图像低级局部相关线索和高级语义内容,而且表征了原始图像的自然结构化表示。GraphNet 将类别信息从标记像素传播到未标记像素。

  • WSSS
  • GCN

Methodology

image-20220518171553332

Read more »

AAAI2020 Reliability Does Matter: An End-to-End Weakly Supervised Semantic Segmentation Approach

Introduction

单阶段精度不如两阶段算法,两阶段往往先产生高质量的分割掩码,然后使用伪标注作为全卷积语义分割网络的训练标签进行训练。但两阶段方法为产生高质量伪标注掩码,往往比较复杂。

本文提出端到端方法Reliable Region Mining (RRM),包括两个分支,一个生成伪标注,另一个生成语义分割结果。与以往方法中发掘更完整的物体区域不同,RRM选取高置信度的物体、背景区域,然后通过CRF获取更可靠的区域,作为语义分割分支的监督。在有限像素作为监督的情况下,本文提出了一种称为密集能量损失的正则损失,它与逐像素交叉损失配合来优化过程。

Methodology

RRM分为两个平行分支,分类分支和语义分割分支,共享一个backbone,同时更新网络。

  • 分类分支:生成可靠的语义分割掩码
  • 语义分割分支:使用联合损失函数,包括交叉熵损失和密集能量损失。交叉熵损失主要考虑标记像素,而密集能量损失则通过充分利用RGB颜色和像素位置来考虑所有像素

image-20220513105709337

Read more »

流畅的python

第1章 Python数据模型

如何使用特殊方法

len getitem

python中所有集合类型都可以使用len()函数查看集合长度,使用len(obj)而不是obj.len(),也不是obj. len (),如果是自定义类的对象,python会自己调用类中实现的 len 方法

魔法方法/特殊方法/双下方法,使用len()的形式调用

Read more »

深度学习常用操作

tools

with open

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with open('filename.txt', 'r') as f:
content = f.read(f) #文件的读操作

with open('data.txt', 'w') as f:
f.write('hello world') #文件的写操作
r: # 以只读方式打开文件。文件的指针将会放在文件的开头。这是**默认模式**。
rb: # 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+: # 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+: # 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w: # 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb: # 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+: # 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+: # 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a: # 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab: # 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+: # 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+: # 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

计时

python 实现计时器(不同实现方式)

1
2
3
4
5
6
import time
time_start = time.time() #开始计时
#要执行的代码,或函数
time_end = time.time() #结束计时
time_c= time_end - time_start #运行所花时间
print('time cost', time_c, 's')
Read more »

CVPR2018 AffinityNet

Learning Pixel-level Semantic Affinity with Image-level Supervision for Weakly Supervised Semantic Segmentation

使用图像级监督学习像素级语义亲和度的弱监督语义分割

github

Abstract

分割标签的不足是进行语义分割的主要障碍之一,在弱监督设定下,训练模型可以分割局部判别部分而不是整个对象区域,本文提出将响应传播到属于同一语义实体的附近区域。提出AffinityNet,预测一对相邻图像坐标之间的语义亲和力。然后通过随机游走将语义传播。

  • 各类型的弱监督
  • 图像级标签的弱监督:一些方法将判别定位技术给出的分割种子与超像素等额外的线索结合,估计物体形状。
  • 学习像素级亲和力
  • 使用合成标签学习

Methodology

整个框架基于三个DNN,第一个网络用于生成CAM,第二个网络用于预测亲和力即AffinityNet,第三个网络是全监督的分割模型,使用合成标签进行训练。

image-20220506111027887

Read more »

CVPR2022 从注意力中学习亲和力

Learning Affinity from Attention: End-to-End Weakly-Supervised Semantic Segmentation with Transformers

(从注意力中学习亲和力:使用 Transformers 的端到端弱监督语义分割)
github

Abstract

WSSS目前的方法主要基于卷积神经网络,无法正确探索全局信息,因此通常会导致对象区域不完整。在本文中,为了解决上述问题引入了Transformer,它自然地整合了全局信息,为端到端的 WSSS 生成更完整的初始伪标签。受Transformers中的self-attention和语义亲和力之间的内在一致性的启发,作者提出了Affinity from Attention (AFA)模块来从Transformers中的多头自注意力(MHSA)中学习语义亲和力。然后利用学习到的亲和力来细化初始伪标签以进行分割。此外,为了有效地导出可靠的亲和标签来监督 AFA 并确保伪标签的局部一致性local consistency,作者设计了一个像素自适应细化模块,该模块结合了低级图像外观信息来细化伪标签。

Introduction

WSSS方法通常采用多阶段框架,也就是先训练一个分类模型,然后生成类激活图CAM作为伪标签。细化后,伪标签被用来训练一个独立的语义分割网络作为最终模型。

多阶段训练流程复杂缓慢,不够高效。现有的一些端到端的解决方案基本是基于CNN的,CNN对全局特征的获取能力较差。

首先使用Transformer生成CAM作为初始伪标签,以避免CNN的内在缺陷,由于 MHSA 中的语义亲和性很粗糙,作者提出Affinity from Attention (AFA) 模块,旨在导出可靠的伪亲和力标签来监督从Transformer中的 MHSA 学习的语义亲和性。然后使用学习到的亲和力通过随机游走传播来修改初始伪标签,这可以扩散对象区域并抑制错误激活的区域。为了使AFA 导出高度可信的伪亲和标签并确保传播的伪标签的局部一致性,我们进一步提出了一个像素自适应细化模块 (PAR)。PAR 有效地整合了局部像素的 RGB 和位置信息以细化伪标签,从而更好地与低级图像外观对齐。

  • 端到端WSSS
  • AFA, Affinity from Attention
  • PAR, 像素自适应细化模块
  • WSSS
    • Multi-stage
    • End-to-End
  • Transformer in Vision
    • 第一个用于WSOL的方法 TS-CAM

Methodology

使用 Transformer 主干作为编码器来提取特征图。初始伪标签是用CAM生成的,然后用提出的 PAR 进行细化。在 AFA 模块中,我们从 Transformer 块中的 MHSA 导出语义亲和性。 AFA 使用源自精炼标签的伪亲和标签进行监督。接下来利用学习到的亲和力通过随机游走传播来修改伪标签。传播的标签最终用PAR作为分割分支的伪标签进行细化。

image-20220506165237627

Read more »

CVPR2018 Learning Superpixels with Segmentation-Aware Affinity Loss

利用亲和力学习超像素 PAN SEAL

Abstract

超像素分割算法主要基于手工设计的特征,通常无法保留较弱的对象边界,本文利用深度神经网络从图像中提取超像素,提出了用于超像素分割的分割感知亲和学习方法。具体来说,提出了一种新的loss,将分割误差考虑在内进行亲和力学习。

image-20220505105546794

Read more »

贝叶斯公式

$\mathrm{P}(\mathrm{A} \mid \mathrm{B})=\frac{\mathrm{P}(\mathrm{B} \mid \mathrm{A}) \mathrm{P}(\mathrm{A})}{\mathrm{P}(\mathrm{B})}$

B按全概率公式展开

$\mathrm{P}(\mathrm{A} \mid \mathrm{B})=\frac{\mathrm{P}(\mathrm{B} \mid \mathrm{A}) \mathrm{P}(\mathrm{A})}{\mathrm{P}(\mathrm{B} \mid \mathrm{A}) \mathrm{P}(\mathrm{A})+\mathrm{P}(\mathrm{B} \mid \bar{\mathrm{A}}) \mathrm{P}(\bar{\mathrm{A}})}$

$\bar{\mathrm{A}}$代表非A

极大似然估计MLE

Maximum likelihood estimation

https://zhuanlan.zhihu.com/p/26614750

最大后验概率估计MAP

Maximum a posteriori estimation

特征工程

特征归一化 Normalization

目的是消除量纲影响,使不同指标之间具有可比性。

常用方法:

  • 线性函数归一化Min-Max Scaling,将数据映射到0-1之间: $X_{norm} = \frac{X-X_{min}}{X_{max}-X_{min}}$
  • 零均值归一化 Z-Score Normalization,将原始数据映射到均值为0,标准差为1的分布上:$Z = \frac{x-\mu}{\sigma}$
Read more »

OpenCV常用操作

OpenCV

cv的输入数据类型不能是tensor,需要转换为ndarray

cv2.resize()

参考

1
2
3
4
5
6
7
8
9
10
11
# 变为14*14*1的ndarray, 因为cv.resize不能处理tensor
cam_map_ = cam_map_.detach().cpu().numpy().transpose(1, 2, 0)
# Resize and Normalize CAM
cam_map_ = resize_cam(cam_map_, size=(crop_size, crop_size))
def resize_cam(cam, size=(224, 224)):
# resize,使用默认的双线性插值
cam = cv2.resize(cam, (size[0], size[1]))
# Normalize
cam_min, cam_max = cam.min(), cam.max()
cam = (cam - cam_min) / (cam_max - cam_min)
return cam
Read more »