Adapting Grad-CAM for Embedding Networks
TL;DR
- 基于 grad-cam 修改得到一种适配embedding网络的可视化方法,可以用于人脸识别、reid等任务
- 基于度量学习中常用的 triplet loss 代替分类任务中的类别激活值来进行反向求导
- 对训练集提前提取特征与反传梯度,在测试阶段采取复用训练集中的梯度来避免在测试阶段的反向求导过程
Introduction
-
传统的 grad-cam 基于对某类别的得分( y c y^{c} yc ),求取对某层特征( A k A^{k} Ak )的梯度后得到该层特征的权重值
-
直接在 embedding 网络中使用 grad-cam 有以下挑战:
- 对于 embedding 网络,不管在训练还是测试阶段网络的输出并不是类别得分
- 测试阶段,对于单张输入图片难以计算对于某层特征的梯度,因为一张图片既没有配对图片也没有标签
-
所以作者修改 grad-cam 用于对 embedding 网络可视化
Dataset/Algorithm/Model/Experiment Detail
实现方式
-
使用 triplet loss 来计算对某层特征的梯度,根据梯度计算特征的加权权重
-
作者尝试了距离损失和配对损失的效果都不如 triplet loss,怀疑是与训练阶段对齐的 loss 会效果更好
-
取多个 triplet 对的平均能提升效果,取梯度最大(平均)的50个channel也能提升效果
-
weight transfer 用于使测试阶段无需计算单张图片的反传梯度也能进行可视化
- 首先需要提前提取训练阶段的样本的 embedding feature 和对选定特征层的反传梯度
- 测试阶段基于最近邻方式找到测试图片的 embedding feature 在训练集中最匹配的样本,基于该样本的反传梯度作为测试样本的反梯度,作者解释是相同 id 的样本送进网络后激活的卷积核应该比较类似
实验结果
-
CUB200 中因为有bounding box 和 segmentation 标注,可以采用激活区域位于bounding box 或 segmentation 的比例来判断预测精度,可以看出 gradcam++ 在不加作者提出的trick时也有不错的效果了(gradcam++消除了负梯度的影响)
-
只使用 top1 的 channel 能取得超过使用所有 channel 的结果,可能是 top1 的 channel 中保存了鸟类的特定信息
Thoughts
- 对于 embedding 网络的可视化对于理解度量学习等过程还是有一定意义的,这里的激活区域也许也能类似grad-cam++那样作为蒸馏的标签
- 因为需要离线提处理特征和梯度库,实际使用上会有很多不便的地方,比如难以直接整合到工具链中对客户模型进行可视化