Hunyuan-DiT

  • Paper: Hunyuan-DiT : A Powerful Multi-Resolution Diffusion Transformer with Fine-Grained Chinese Understanding

  • Authors: Zhimin Li, Jianwei Zhang, Qin Lin, Jiangfeng Xiong, Yanxin Long, Xinchi Deng, Yingfang Zhang, Xingchao Liu, Minbin Huang, Zedong Xiao, Dayou Chen, Jiajun He, Jiahao Li, Wenyue Li, Chen Zhang, Rongwei Quan, Jianxiang Lu, Jiabin Huang, Xiaoyan Yuan, Xiaoxiao Zheng, Yixuan Li, Jihong Zhang, Chao Zhang, Meng Chen, Jie Liu, Zheng Fang, Weiyan Wang, Jinbao Xue, Yangyu Tao, Jianchen Zhu, Kai Liu, Sihuan Lin, Yifu Sun, Yun Li, Dongdong Wang, Mingtao Chen, Zhichao Hu, Xiao Xiao, Yan Chen, Yuhong Liu, Wei Liu, Di Wang, Yong Yang, Jie Jiang, Qinglin Lu

  • Code & Pretrained Model: GitHub

背景

  • 现有一些基于 Diffusion 的文生图模型,如 DALL-E、SD 和 Pixart 缺乏对中文提示词的理解,而 AltDiffusion、PAI-Diffusion 和 Taiyi 这一类具有中文理解能力的模型则仍有进步空间

基于 DiT 的模块改进

Hunyuan-DiT

图像编码器

使用预训练 VAE 提取图像编码用于学习数据分布,SDXL 中的 VAE 相比于 SD1.5 中的 VAE 有较大的提升

文本编码器

使用预训练中英双语 CLIP 模型以及多语种 T5 模型提取文本编码

混元 DiT

  • 按照的大小分块
  • 为了提升模型在细粒度文本条件表现,在特征提取模块使用交叉注意力层融合文本特征
  • Transformer 块包含编码块和解码块,块中包含了自注意力-交叉注意力-FFN
  • 在解码块增加了与编码块之间的跳层链接
  • 训练时使用 v-prediction 的方式具有更好的表现

v-predition 相关资料 在使用 v-prediction 方法时,模型不直接预测噪声 ε,而是预测了一个加权后的量 v,这个量结合了噪声 ε 和原始数据 x 的信息,能在采样步骤较少的情况下提供有效的信号来指导采样过程

位置编码和多分辨率图像生成

两种位置编码可视化
  • 使用二维 RoPE 对绝对位置和相对位置进行编码
  • 为了实现多分辨率图像生成,尝试了两种类型的编码
    • Extended Positional Encoding,随着宽高的不同,编码结果也会有巨大的差异
    • Centralized Interpolative Positional Encoding,定义边界为编码结果变化的范围,且以图像中心为编码 0 点

提升训练稳定性

  • 使用 QK-Norm,在计算 Q、K 和 V 之前增加归一化层
  • 在跳层模块后增加归一化层,从而避免梯度爆炸
  • 使用 FP32 进行训练避免溢出

数据流

数据收集与筛选

图像重标注

多轮对话增强提示

DEADiff

  • Paper: DEADiff: An Efficient Stylization Diffusion Model with Disentangled Representations

  • Authors: Tianhao Qi, Shancheng Fang, Yanze Wu, Hongtao Xie, Jiawei Liu, Lang Chen, Qian He, Yongdong Zhang

  • Code & Dataset: GitHub

研究背景

  • 基于扩散模型的文本-图像生成模型(T2I)的发展,一些工作尝试引入参考图像作为生成模型的状态,风格图像就是其中一种
  • 利用T2I的已有工作
    • 基于本文转换的方法,将风格图像编码为文本嵌入空间的编码,这种图像到文本的模态转换容易导致信息的丢失
    • 针对风格微调参数的方法容易导致过拟合,且在现实生产中不具有实用性
    • 通过图像编码器提取风格图像特征
      • T2IAdapter-Style 和 IP-Adapter 使用 Transformer 作为图像编码器,以 CLIP 图像嵌入作为输入,并通过 U-Net 交叉注意层利用提取的图像特征
      • BLIP-Diffusion 通过 Q-Former 将图像嵌入转化为文本嵌入空间,作为扩散模型文本编码器的输入

研究方法

参考资料

Querying Transformer(Q-Former)

  • 由 Image Transformer 和 Text Transformer 组成,共享 Self-Attention 层参数
  • Image Transformer 提取与本文内容最相近的视觉特征
    • 输入:图像特征和可学习 Queries
    • 由于共享 Self-Attention 层参数,Queries 可同时与图像特征和文本特征进行交互
  • Text Transformer 作为输入文本的编码器和解码器

提取风格特征和内容特征

解耦风格特征与内容特征提取

DEADiff
  • STRE(Style Representation Extraction)
    • 使用风格相同的图像作为扩散模型的风格图像和输出目标
    • CLIP 提取的风格图像特征作为Q-Former输入的图像特征,文本“Style”提取特征作为Q-Former的文本特征,内部做交叉注意力,输出与文本相关的图像特征作为风格特征
  • SERE(Content Representation Extraction)
    • 使用主体相同但风格不同的图像作为扩散模型的风格图像和输出目标
    • CLIP 提取的风格图像特征作为Q-Former输入的图像特征,文本“Content”提取特征作为Q-Former的文本特征,内部做交叉注意力,输出与文本相关的图像特征作为内容特征

Disentangled Conditioning Mechanism(DCM)分离条件机制

在使用Diffusion模型去噪的过程中,提取的风格特征和语义特征将作为交叉注意力层的状态输入,从而引导模型更有效地分离风格特征和语义特征

模型使用Stable Diffusion v1.5作为文本-图像生成模型,将16个交叉注意力层编号为0-15,其中,4-8层为Coarse层,其余为Fine层

Disentangled Conditioning Mechanism
  • 输入
    • 风格信息将作为高分辨率Fine层的状态输入,使得提取的风格特征更注重笔画、纹理和颜色等细节信息
    • 语义信息将作为低分辨率Coarse层的状态输入
  • 网络结构 Text-image Crossattention Layer
    • 1)计算图像特征的Key和Value
    • 2)固定参数计算文本特征的Key和Value
    • 3)计算Query
    • 4)分别拼接图像和文本的Key以及图像和文本的Value
    • 5)计算交叉注意力

构建成对数据

准备主体词列表和风格词列表,组合得到相同主体或相同风格的提示词对,利用Text-to-images模型生成图像

  1. 构建文本提示词
    • 1)主体词:人物、动物、物体和场景四种类别,12000
    • 2)风格词:艺术风格、艺术家风格、笔触等,650
    • 3)1个主体词对应约14个风格词构成提示词组合,160000
  2. Midjourney生成图像 1个提示词生成4张分辨率为的图像,上采样到后,构建文本-图像对,1060000
  3. 成对图像选择
    • 1)风格特征学习:随机选择相同提示词生成的图像构成图像对
    • 2)内容特征学习:随机选择主体词相同但风格不同的提示词对应的图像对

Img-Diff

  • Paper: Img-Diff: Contrastive Data Synthesis for Multimodal Large Language Models

  • Authors: Qirui Jiao, Daoyuan Chen, Yilun Huang, Yaliang Li, Ying Shen

  • Code & Dataset: GitHub

  • Application: 提出的组件和端到端构建工作流程在 Data-Juicer 中作为数据处理算子和可配置文件来实现

专业名词

  • Multimodal Large Language Models (MLLMs)
  • Visual Question Answering (VQA)
  • Image Difference Captioning (IDC) 专注于图像之间的细微差别而不仅仅是物体描述

背景

  • 提升多模态大语言模型的表现通常有两种路径,一种是提升模型架构,另一种则是提升数据质量

  • 多数多模态大语言模型进行两阶段训练,第一阶段训练实现图像-文字数据对的模态对齐,第二阶段则注重通过 Instruction Tuning 数据集微调提升模型的问答能力

  • 通过提升图像-文字数据对的数量可以提升模型的语义对齐能力,但有可能影响模型的问答能力,因此更多工作集中于研究 Instruction Tuning 数据集的增强

  • 提出方法与 InstructPix2Pix 类似,采用 Prompt-toPrompt 技术以及生成模型 Stable-Diffusion-XL 来生成相似图像对,在生成阶段结合了多个筛选阶段来确保数据质量,强调模型关注特定区域而不是整个图像的差异

数据合成方法

利用对比学习的原理来生成 MLLM 图像-文本数据。该方法侧重于替换图像对中的对象,引导 MLLM 识别特定区域的相似性和差异

  • Step1. 创建相似图像并形成图像对,这些图像对之间的唯一区别是图中的对象
  • Step2. 提出差异区域生成器(Difference Area Generator),提取包含图像对之间的对象差异的边界框
  • Step3. 提出差异描述生成器,通过 MLLM 为具有对象差异的区域生成描述性文本,并创建问答对,例如“该区域中哪些对象发生了变化?”

过程中应用的大模型

  • Vicuna-1.5-13B 魔塔

    由 LMSYS 研发的,基于 Llama 2 微调的 Transformer 架构自回归语言模型

  • Stable-Diffusion-XL Hugging Face

    由文字生成图像的潜在空间扩散模型:1)UNet 的大小是原来的 3 倍,引入文本编码器编码器(OpenCLIP ViT bigG/14)与原始文本编码器相结合;2)引入大小和裁剪条件,以防止训练数据被丢弃,并更好地控制生成的图像应如何裁剪;3)引入两阶段模型过程,基础模型(也可以作为独立模型运行)生成图像作为优化模型的输入,该模型添加了额外的高质量细节

  • CLIP Github

    CLIP (Contrastive Language-Image Pre-Training) ,一个在图像-文字数据对上预训练的模型,可以通过给定图片判断最相关的文字片段

  • FastSAM Github

    SAM 作者提出的具有更快推理速度的分割模型

  • BLIP

    BLIP(Bootstrapping Language-Image Pre-training),一个统一视觉语言理解与生成的预训练模型,可以通过图像生成图像标注

  • LLaVA-NEXT Github

    多模态大模型

全流程梳理

流程图

模块一:创建相似数据对

Image Pairs Generation
  1. 从 MS COCO 获取 118K 图像描述
  2. 使用 Vicuna-1.5-13B 替换图像描述中的对象
    • 输入 Prompt:“这里有一个句子:‘INPUT’。请仅将这句话中的一个宾语替换为另一个宾语。”
    • INPUT 为原始描述,LLM 生成替换后的描
  3. 使用生成的描述文本对,利用图像生成模型 Stable-Diffusion-XL 和图像编辑技术 Prompt-to-Prompt 生成仅替换少量对象的图像对

模块二:差异区域生成器(Difference Area Generator)

该模型用于识别图像对之间对象差异的位置 由于预训练的目标检测模型有检测类别的限制,所以生成器基于分割方法和图像相似度比较识别差异位置,如下图所示

Difference Area Generator
  1. 通过 Image Similarity Filter 获得相似度高但不完全相同的图像对
  2. 使用 FastSAM 分割每张图像
  3. 根据分割获得的边界框信息裁剪图像,并使用 Image-text Matching Filter 判断裁剪后的子图像是否存在有效对象
  4. 使用 Difference Detector 来确定图像对的边界框区域之间是否确实存在差异,并进行 IoU 过滤以去除重叠的边界框,最终获得有效的边界框信息

Filter1:Image Similarity Filter

根据图像相似度过滤图像对

  • 计算流程

    • 该模块首先使用 CLIP 提取图像特征,然后计算特征间的余弦相似度
    • 若余弦相似度在预设阈值内,则图像对将被视为有效
  • 应用阶段

    • 在使用 FastSAM 进行分割之前,使用该模块来确保图像对高度相似但不完全相同
    • 在 Difference Detector 阶段,根据边界框信息裁剪子图像后,使用该模块过滤子图像对并仅保留不同的子图像对

Filter2:Image-text Matching Filter

确定图像是否包含有效对象(即已替换或正在替换的对象)

  • 计算流程

    • 该模块首先使用 BLIP 提取图像特征,然后将其与对象名称的文本特征进行比较
    • 当图文匹配分数落在预设阈值内时,则认为图像包含有效对象
  • 应用阶段

    • 根据分割信息进行子图像裁剪后,使用该模块来确定子图像是否包含有效对象并获得相应的有效边界框

Filter3:Difference Detector

确定图像对的边界框区域之间是否存在差异

  • 计算流程

    • 根据边界框从图像 A 和 B 中裁剪两个子图像
    • 通过 Image Similarity Filter 过滤子图像对,仅当差异足够显著时才认为边界框有效
    • 处理完所有边界框后,使用 IoU 方法过滤重叠的边界框,仅保留差异程度较高的边界框,最终输出所有有效边界框

模块三:差异描述生成器(Difference Captions Generator)

获得有效的边界框区域后,使用 Difference Captions Generator 生成有关这些区域内容的差异描述 图像对可能包含多个差异,而单个描述无法完全捕获所有差异,因此每个描述仅关注一个图像对中的一个边界框

该模块分为两个阶段,如下图所示

Difference Captions Generator
  1. 第一阶段,模型为边界框区域生成内容描述,然后使用 Image-text Matching Filter 和 Captions Similarity Filter 筛选带内容描述的边界框
  2. 第二阶段,模型使用内容描述和用红框标注的图像生成差异描述

阶段一:对象标注和筛选

  • 对于每个图像对,首先选择图像之间相似度最低的 N 个边界框区域(本项目中 N 设置为 5)作为候选区域
  • 对于每个边界框,我们使用 MLLM LLaVA-NEXT 来描述其相应的区域
  • 第一个筛选过程,通过 Image-text Matching Filter 检查区域与描述是否对应
  • 第二个筛选过程,通过 Captions Similarity Filter 评估描述之间是否存在差异,使用 CLIP 来获取文本特征并计算它们之间的余弦相似度,当分数足够低时,可认为两个标题不同
  • 筛选完成后,获得的有效的边界框和描述将用于后续的差异描述生成

阶段二:差异描述生成

对于每个图像对的各个有效边界框生成差异描述

  • 根据边界框信息在图像中绘制两个红色框,突出显示差异以便于定位
  • 为 MLLM LLaVA-NEXT 提供边界框区域的描述,并引导模型根据内容描述和红色框生成差异描述

BiFormer

  • Paper: BiFormer: Vision Transformer with Bi-Level Routing Attention

  • Authors: Lei Zhu, Xinjiang Wang, Zhanghan Ke, Wayne Zhang, Rynson Lau

  • Code: GitHub

  • Framework: BiFormer

Transformer

优势

  • long-range dependency
  • inductive-bias-free
  • high parallelism

劣势

  • 计算量大

  • 内存占用大

  • 现有方案:引入稀疏性

    • 局部窗口
    • 轴向注意力
    • 空洞注意力
  • 存在问题

    • 筛选 key/value 时没有区分 query

Bi-level Routing Attention (BRA)

Sparsity

  • 利用稀疏性来节省计算量和内存,同时只包含 GPU 友好的稠密矩阵乘法

Query-aware

  • 为各个 Query 筛选语义最相关的 Key-Value 对

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# input: features (H, W, C). Assume H==W.
# output: features (H, W, C).
# S: square root of number of regions.
# k: number of regions to attend.

# patchify input (H, W, C) -> (Sˆ2, HW/Sˆ2, C)
x = patchify(input, patch_size=H//S)

# linear projection of query, key, value
query, key, value = linear_qkv(x).chunk(3, dim=-1)

# regional query and key (Sˆ2, C)
query_r, key_r = query.mean(dim=1), key.mean(dim=1)

# adjacency matrix for regional graph (Sˆ2, Sˆ2)
A_r = mm(query_r, key_r.transpose(-1, -2))
# compute index matrix of routed regions (Sˆ2, K)
I_r = topk(A_r, k).index
# gather key-value pairs
key_g = gather(key, I_r)
# (Sˆ2, kHW/Sˆ2, C)
value_g = gather(value, I_r)
# (Sˆ2, kHW/Sˆ2, C)
# token-to-token attention
A = bmm(query, key_g.transpose(-2, -1))
A = softmax(A, dim=-1)
output = bmm(A, value_g) + dwconv(value)
# recover to (H, W, C) shape
output = unpatchify(output, patch_size=H//S)

Bi-VAEGAN

  • Paper: Bi-directional Distribution Alignment for Transductive Zero-Shot Learning

  • Authors: Zhicai Wang, Yanbin Hao, Tingting Mu, Ouxiang Li, Shuo Wang, Xiangnan He

  • Code: GitHub

  • Framework: Bi-VAEGAN

Zero-shot Learning (ZSL)

Hugo Larochelle, Dumitru Erhan, and Yoshua Bengio. Zerodata learning of new tasks. In AAAI, volume 1, page 3, 2008. 1

  • 目标

    解决训练时缺少例子或标签的问题

  • Conventional ZSL / Inductive ZSL

    • 核心挑战

      在存在Class Relevance的条件下,使得分类器能从 Seen Classes 提取信息迁移到 Unseen Classes 当中

    • Class Relevance 通常作为 Auxiliary Data 提供

    • Auxiliary Data 可以为人工标注、文字描述、知识图谱或 Formal Description of Knowledge(如嵌入向量)

    • Domain Shift Problem

      仅从 Auxiliary Data 学习容易导致 Unseen Classes 的真实分布与其建模分布之间存在差异

  • Proposed: Transductive ZSL (TZSL)

    • 允许在训练中额外加入为目标类别收集的无标签示例

Generative Models

作用

  • Synthesize Examples 合成样本
  • Learn the Unseen Data Distribution 学习 unseen 数据分布

分类

  • Unconditional Generation
  • Conditional Generation Auxiliary 信息是信息量更丰富的类标签,通过 Auxiliary 信息作为 Condition,可以学习到 Data-Auxiliary 联合分布,这连接了 Visual 空间和 Auxiliary 空间,使得生成器具有信息迁移的能力

难点

将 seen classes 所学迁移到 unseen classes

f-VAEGAN

提出方法

  1. Transductive Regressor
  2. Normalization
  3. Class Prior Estimation (CPE)

架构

  1. VAE 编码器,得到维隐藏表征向量
  2. 条件生成器,以类别属性为条件,从正态分布采样维向量用于视觉特征生成
  3. Wasserstein GAN(WGAN)的判别器,用于 seen classes
  4. WGAN 的判别器,用于 unseen classes
  5. 映射视觉空间到特征空间的 Regressor
  6. WGAN 的判别器,用于特征判别

Workflow

Alt text
  1. Level-1

    对抗性训练

  2. Level-2

    对抗性训练

ANCL

Auxiliary Network Continual Learning (ANCL)

  • Paper: Achieving a Better Stability-Plasticity Trade-off via Auxiliary Networks in Continual Learning

  • Authors: Sanghwan Kim ; Lorenzo Noci ; Antonio Orvieto ; Thomas Hofmann

  • Code: https://github.com/kim-sanghwan/ANCL

  • Framework:

Continual Learning (CL) 持续学习

  • 符号定义

    • PT:Previous Task
    • CT:Current Task
  • 含义

    保留 PT 信息的同时,继续在 CT 中进行学习

  • 难点:Catastrophic Forgetting 灾难性的遗忘

    对于梯度更新学习的模型,在学习 CT 的过程中更倾向于覆盖 PT 学习的梯度

    换而言之,Stability-Plasticity Dilemma

    Martial Mermillod, Aur ́ elia Bugaiska, and Patrick Bonin. The stability-plasticity dilemma: Investigating the continuum from catastrophic forgetting to age-limited learning effects, 2013. 1

    • Stability: 在 PT 具有较好的泛化能力
    • Plasticity: 在 CT 学习新概念

    所以,如何平衡 Stability 和 Plasticity是研究的重点

  • 任务分类

    类别增量学习(Class-Incremental Learning)的前世今生、开源工具包

    • Task Incremental Learning (TIL):训练和测试阶段均为模型提供当前任务标识
    • Domain Incremental Learning (DIL):测试阶段不提供当前任务标识
    • Class Incremental Learning (CIL):测试阶段自动识别当前任务标识和分类

    学习难度逐渐增加,ANCL 在 TIL 和 CIL 设置中进行了评估

相关工作

增加 Auxiliary Network 或 Extra Module

Active Forgetting with synaptic Expansion-Convergence (AFEC) 超参控制新旧参数的融合

当前工作

框架化使用 Auxiliary Network 的 CL,使得 Auxiliary Network 插件化

通过调整正则化项

局限

  • 不同方法依赖于不同的超参

参考

[1] 类别增量学习(Class-Incremental Learning)的前世今生、开源工具包

Code of Pixel-to-Prototype Constrast

Generate CAMs

  • Feature map
  • Class feature map
  • Score of class
  • CAMs

Pixel-to-Prototype Contrast

  • Pseudo mask
  • Pixel-wise projected feature
  • Pixel-to-prototype contrast
    • Prototype set
    • Temperature
    • Contrast 像素特征与原型的相似度

Prototype Estimation in Batch

  • Top K pixels of class c
    • CAM as confidences
    • Estimate prototypes from pixel-wise feature embeddings that are with the top K confidences
  • Prototype

Loss

  • Cross Prototype Contrast

  • Cross CAM Contrast

  • Intra-view Contrast

    • Strategy to slove the matter of in accurate pseudo label [50]
      • Semi-hard prototype mining
      • Hard pixel sampling

Code

归一化

归一化

  • 作用
    • 保证所有元素之和为 1
    • 将向量转换为概率分布

归一化

1
2
3
4
# 按通道执行L2归一化
v = v / (torch.norm(v, dim=1, keepdim=True) + 1e-5)
# or
v = torch.nn.functional.normalize(v, dim=1)
  • 作用
    • 方向不变性:向量的方向不变,长度变为 1,使得向量表示不再依赖于其大小
    • 数值稳定性:将向量的大小规范在一个相对较小的区间
    • 减小特征尺度的差异
    • 便于执行相似性度量

Max 归一化

  • 归一化后向量的最大值为 1

Max-Min 归一化

  • 归一化后向量值范围为[0, 1]

Forward

  • cam

    1
    2
    3
    4
    # fea是最后一层输出的特征图
    self.fc8 = nn.Conv2d(4096, 21, 1, bias=False)
    cam = self.fc8(fea)
    cam = torch.nn.functional.interpolate(cam, (H, W), mode='bilinear', align_corners=True)
  • cam_rv_down

    • 清洗 CAM

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      with torch.no_grad():
      cam_d = torch.nn.functional.relu(cam.detach())
      # max norm
      cam_d_max = torch.max(cam_d.view(n, c, -1), dim=-1)[0].view(n, c, 1, 1)+1e-5
      cam_d_norm = torch.nn.functional.relu(cam_d - 1e-5) / cam_d_max
      # 计算保留概率值最大分类,反相为背景概率,其余分类置0
      cam_d_norm[:, 0, :, :] = 1 - torch.max(cam_d_norm[:, 1:, :, :], dim=1)[0]
      cam_max = torch.max(cam_d_norm[:,1:,:,:], dim=1, keepdim=True)[0]
      cam_d_norm[:,1:,:,:][cam_d_norm[:,1:,:,:] < cam_max] = 0

    • 增强 CAM

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      # 根据像素相似度调整CAM
      cam_rv_down = self.PCM(cam_d_norm, f)

      # PCM
      def PCM(self, cam, f):
      n,c,h,w = f.size()
      cam = torch.nn.functional.interpolate(cam, (h,w), mode='bilinear', align_corners=True).view(n,-1,h*w)
      # 多尺度特征融合
      f = self.f9(f)
      f = f.view(n, -1, h*w)
      # 特征按通道L2归一化
      f = f / (torch.norm(f, dim=1, keepdim=True) + 1e-5)
      # 计算像素相似度矩阵
      aff = torch.nn.functional.relu(torch.matmul(f.transpose(1, 2), f), inplace=True)
      # 相似度矩阵L1归一化
      aff = aff/(torch.sum(aff, dim=1, keepdim=True) + 1e-5)
      # CAM加权
      cam_rv = torch.matmul(cam, aff).view(n, -1, h, w)

      return cam_rv
  • cam_rv

    1
    cam_rv = torch.nn.functional.interpolate(cam_rv_down, (H,W), mode='bilinear', align_corners=True)
  • f_proj

    1
    2
    self.fc_proj = torch.nn.Conv2d(4096, 128, 1, bias=False)
    f_proj = torch.nn.functional.relu(self.fc_proj(fea), inplace=True)
  • prototype

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    f_proj1 = torch.nn.functional.interpolate(f_proj1, size=(128 // 8, 128 // 8), mode='bilinear', align_corners=True)
    cam_rv1_down = torch.nn.functional.interpolate(cam_rv1_down, size=(128 // 8, 128 // 8), mode='bilinear', align_corners=True)
    cam_rv2_down = cam_rv2_down

    with torch.no_grad():
    fea1 = f_proj1.detach()
    c_fea1 = fea1.shape[1]
    cam_rv1_down = torch.nn.functional.relu(cam_rv1_down.detach())
    # CAM Max-min归一化
    n1, c1, h1, w1 = cam_rv1_down.shape
    max1 = torch.max(cam_rv1_down.view(n1, c1, -1), dim=-1)[0].view(n1, c1, 1, 1)
    min1 = torch.min(cam_rv1_down.view(n1, c1, -1), dim=-1)[0].view(n1, c1, 1, 1)
    cam_rv1_down[cam_rv1_down < min1 + 1e-5] = 0.
    norm_cam1 = (cam_rv1_down - min1 - 1e-5) / (max1 - min1 + 1e-5)
    cam_rv1_down = norm_cam1
    # 设置背景阈值
    cam_rv1_down[:, 0, :, :] = args.bg_threshold
    # 根据图像级标签保留相应的类别
    scores1 = torch.nn.functional.softmax(cam_rv1_down * label, dim=1)

    # 计算伪标签
    pseudo_label1 = scores1.argmax(dim=1, keepdim=True)
    n_sc1, c_sc1, h_sc1, w_sc1 = scores1.shape
    scores1 = scores1.transpose(0, 1)
    fea1 = fea1.permute(0, 2, 3, 1).reshape(-1, c_fea1)

    # 获取各个分类CAM值最高的值与索引
    top_values, top_indices = torch.topk(cam_rv1_down.transpose(0, 1).reshape(c_sc1, -1), k=h_sc1 * w_sc1 // 8, dim=-1)
    prototypes1 = torch.zeros(c_sc1, c_fea1).cuda() # [21, 128]
    # 遍历各个分类
    for i in range(c_sc1):
    # 获取k个像素对应的特征
    top_fea = fea1[top_indices[i]]
    # CAM值加权平均k个特征得到分类原型
    prototypes1[i] = torch.sum(top_values[i].unsqueeze(-1) * top_fea, dim=0) / torch.sum(top_values[i])
    # 各个原型L2归一化
    prototypes1 = torch.nn.functional.normalize(prototypes1, dim=-1)
  • prototype similarity

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    n_f, c_f, h_f, w_f = f_proj1.shape
    # [N, H, W, C] -> [N x H x W, C]
    f_proj1 = f_proj1.permute(0, 2, 3, 1).reshape(n_f * h_f * w_f, c_f)
    # 特征L2归一化
    f_proj1 = torch.nn.functional.normalize(f_proj1, dim=-1)
    pseudo_label1 = pseudo_label1.reshape(-1)
    positives1 = prototypes2[pseudo_label1]
    negitives1 = prototypes2

    # for target
    n_f, c_f, h_f, w_f = f_proj2.shape
    f_proj2 = f_proj2.permute(0, 2, 3, 1).reshape(n_f * h_f * w_f, c_f)
    f_proj2 = torch.nn.functional.normalize(f_proj2, dim=-1)
    pseudo_label2 = pseudo_label2.reshape(-1)
    positives2 = prototypes1[pseudo_label2]
    negitives2 = prototypes1
    A1 = torch.exp(torch.sum(f_proj1 * positives1, dim=-1) / 0.1)
    A2 = torch.sum(torch.exp(torch.matmul(f_proj1, negitives1.transpose(0, 1)) / 0.1), dim=-1)
    loss_nce1 = torch.mean(-1 * torch.log(A1 / A2))

    A3 = torch.exp(torch.sum(f_proj2 * positives2, dim=-1) / 0.1)
    A4 = torch.sum(torch.exp(torch.matmul(f_proj2, negitives2.transpose(0, 1)) / 0.1), dim=-1)
    loss_nce2 = torch.mean(-1 * torch.log(A3 / A4))

    loss_cross_nce = 0.1 * (loss_nce1 + loss_nce2) / 2

p