TorchCAM: 类激活探索器
简单的方式利用 PyTorch 中卷积层的类特异性激活。
来源: 图片来自 woopets (激活图由预训练的 Resnet-18 创建)
快速导览
设置你的 CAM
TorchCAM 利用 PyTorch 钩机制 无缝获取所有必要信息,以便产生类激活而不需要用户额外的操作。每个 CAM 对象作为你模型的一个包装器。
你可以在文档中找到支持的 CAM 方法的详尽列表,然后按如下使用:
# 定义你的模型
from torchvision.models import resnet18
model = resnet18(pretrained=True).eval()
# 设置你的 CAM 提取器
from torchcam.methods import SmoothGradCAMpp
cam_extractor = SmoothGradCAMpp(model)
请注意,默认情况下,CAM 所获取的层设置为最后一个非降维的卷积层。如果你希望研究特定的层,在构造函数中使用 target_layer
参数。
获取类激活图
一旦你设置了 CAM 提取器,只需像往常一样使用你的模型对数据进行推理。如果需要任何附加信息,提取器会自动为你获取。
from torchvision.io.image import read_image
from torchvision.transforms.functional import normalize, resize, to_pil_image
from torchvision.models import resnet18
from torchcam.methods import SmoothGradCAMpp
model = resnet18(pretrained=True).eval()
# 获取输入
img = read_image("path/to/your/image.png")
# 为你选择的模型预处理
input_tensor = normalize(resize(img, (224, 224)) / 255., [0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
with SmoothGradCAMpp(model) as cam_extractor:
# 预处理你的数据并传入模型
out = model(input_tensor.unsqueeze(0))
# 通过传递类索引和模型输出获取 CAM
activation_map = cam_extractor(out.squeeze(0).argmax().item(), out)
如果你想可视化你的热图,只需将 CAM 转化为 numpy ndarray:
import matplotlib.pyplot as plt
# 可视化原始 CAM
plt.imshow(activation_map[0].squeeze(0).numpy()); plt.axis('off'); plt.tight_layout(); plt.show()
或者如果你希望将其叠加在输入图像上:
import matplotlib.pyplot as plt
from torchcam.utils import overlay_mask
# 调整 CAM 大小并叠加
result = overlay_mask(to_pil_image(img), to_pil_image(activation_map[0].squeeze(0), mode='F'), alpha=0.5)
# 显示结果
plt.imshow(result); plt.axis('off'); plt.tight_layout(); plt.show()
安装
需要 Python 3.8(或更高版本)和 pip/conda 来安装 TorchCAM。
稳定版本
可以使用 pypi 安装最新的稳定版本包:
pip install torchcam
或使用 conda:
conda install -c frgfm torchcam
开发者安装
或者,如果你希望使用项目中尚未发布的新功能,可以从源码安装包:
git clone https://github.com/frgfm/torch-cam.git
pip install -e torch-cam/.
CAM 动物园
该项目由仓库所有者开发和维护,但实现基于以下研究论文:
- Learning Deep Features for Discriminative Localization: 原始的 CAM 论文
- Grad-CAM: GradCAM 论文,将 CAM 泛化到没有全局平均池化的模型。
- Grad-CAM++: GradCAM++ 的改进,更准确的像素级激活贡献。
- Smooth Grad-CAM++: SmoothGrad 机制结合 GradCAM。
- Score-CAM: 类激活的分数加权以获得更好的可解释性。
- SS-CAM: SmoothGrad 机制结合 Score-CAM。
- IS-CAM: 基于积分的 Score-CAM 变体。
- XGrad-CAM: 改进的 Grad-CAM,在敏感性和保持性方面表现更优。
- Layer-CAM: Grad-CAM 的替代方案,利用梯度对激活的像素级贡献。
来源: YouTube 视频 (激活图由 Layer-CAM 结合预训练的 ResNet-18 创建)
其他
文档
完整的包文档可在这里查看详细说明。
演示App
提供了一个最小的演示 App,供你试用支持的 CAM 方法!可以查看现场演示
如果你更喜欢自己运行演示,你需要一个额外的依赖项 (Streamlit) 来运行该 App:
pip install -e ".[demo]"
然后你可以通过运行以下命令轻松在默认浏览器中运行你的应用程序:
streamlit run demo/app.py
示例脚本
提供了一个示例脚本,你可以使用它在同一张图片上对多个 CAM 方法生成的热图进行基准测试:
python scripts/cam_example.py --arch resnet18 --class-idx 232 --rows 2
所有脚本参数可以通过 python scripts/cam_example.py --help
检查
延迟基准测试
你渴望美丽的激活图,但不知道它是否符合你的延迟需求?
在下表中,你将找到所有 CAM 方法的延迟基准测试(不包括前向传递):
<SOURCE_TEXT>
CAM方法 | 架构 | GPU平均值 (标准差) | CPU平均值 (标准差) |
---|---|---|---|
CAM | resnet18 | 0.11ms (0.02ms) | 0.14ms (0.03ms) |
GradCAM | resnet18 | 3.71ms (1.11ms) | 40.66ms (1.82ms) |
GradCAMpp | resnet18 | 5.21ms (1.22ms) | 41.61ms (3.24ms) |
SmoothGradCAMpp | resnet18 | 33.67ms (2.51ms) | 239.27ms (7.85ms) |
ScoreCAM | resnet18 | 304.74ms (11.54ms) | 6796.89ms (415.14ms) |
SSCAM | resnet18 | ||
ISCAM | resnet18 | ||
XGradCAM | resnet18 | 3.78ms (0.96ms) | 40.63ms (2.03ms) |
LayerCAM | resnet18 | 3.65ms (1.04ms) | 40.91ms (1.79ms) |
CAM | mobilenet_v3_large | N/A* | N/A* |
GradCAM | mobilenet_v3_large | 8.61ms (1.04ms) | 26.64ms (3.46ms) |
GradCAMpp | mobilenet_v3_large | 8.83ms (1.29ms) | 25.50ms (3.10ms) |
SmoothGradCAMpp | mobilenet_v3_large | 77.38ms (3.83ms) | 156.25ms (4.89ms) |
ScoreCAM | mobilenet_v3_large | 35.19ms (2.11ms) | 679.16ms (55.04ms) |
SSCAM | mobilenet_v3_large | ||
ISCAM | mobilenet_v3_large | ||
XGradCAM | mobilenet_v3_large | 8.41ms (0.98ms) | 24.21ms (2.94ms) |
LayerCAM | mobilenet_v3_large | 8.02ms (0.95ms) | 25.14ms (3.17ms) |
*基本的CAM方法不能够适用于具有多个全连接层的架构
该基准测试在(224, 224)输入上进行了100次迭代,以更好地反映普通用户的预期性能。硬件配置包括一台英特尔® 酷睿™ i7-10750H用于CPU,以及NVIDIA GeForce RTX 2070 with Max-Q Design用于GPU。
您可以按照如下方式在您的硬件上运行此延迟基准测试:
python scripts/eval_latency.py SmoothGradCAMpp
所有脚本参数可以使用python scripts/eval_latency.py --help
进行检查
示例笔记本
想要了解更多TorchCAM功能的示例吗? 您可以查看专为提供广泛概述而设计的Jupyter笔记本。
引用
如果您希望引用此项目,请随意使用此BibTeX引用:
@misc{torcham2020,
title={TorchCAM: class activation explorer},
author={François-Guillaume Fernandez},
year={2020},
month={March},
publisher = {GitHub},
howpublished = {\url{https://github.com/frgfm/torch-cam}}
}
贡献
想扩展CAM的可能性范围吗?或者也许是提交一篇论文实现?任何形式的贡献都非常感谢!
在CONTRIBUTING
中可以找到一份简短的指南,以帮助发展这个项目!
许可证
在Apache 2.0许可证下分发。请参阅LICENSE
以获取更多信息。