PyTorch图像分类全流程实战--图像分类可解释性06

教程

  1. 同济子豪兄 https://space.bilibili.com/1900783

  2. 代码运行云GPU平台:https://featurize.cn/?s=d7ce99f842414bfcaea5662a97581bd1

  3. DFF https://jacobgil.github.io/pytorch-gradcam-book/Deep Feature Factorizations.html

可解释性分析方法

1. torch-cam工具包、torch-grad-cam工具包,热力图

使用torchcam算法库,对图像进行各种基于CAM的可解释性分析。

from torchcam.methods import SmoothGradCAMpp 
# CAM GradCAM GradCAMpp ISCAM LayerCAM SSCAM ScoreCAM SmoothGradCAMpp XGradCAM

cam_extractor = SmoothGradCAMpp(model)
#生成可解释性分析热力图
activation_map = cam_extractor(pred_id, pred_logits)
activation_map = activation_map[0][0].detach().cpu().numpy()

最后得到一个热力图,盖在原图上显示,得到高亮的区域,即为分类特征区域。

from torchcam.utils import overlay_mask

result = overlay_mask(img_pil, Image.fromarray(activation_map), alpha=0.7)

2. DFF图像子区域可解释性

concept 个数对应图块颜色个数
top_k 每个概念展示几个类别

3. Captum 遮挡可解释性分析(PyTorch官方出品)

可以进行图像分类、自然语言处理、数据集鲁棒性测试。

遮挡可解释性分析,用小滑块遮挡图像上不同的区域,观察哪个区域遮挡后会显著影响分类决策。

可以调整的超参数:滑块尺寸、移动步长。

颜色越深表示:遮挡此区域之后,分类效果显著降低。

以上,可以看出挡住脖子区域对分类效果影响最大,所以学习的特征主要是天鹅的脖子。

4. Integrated Gradients

加入高斯噪声后,使用smoothgrad_sq平滑,可以实现图像分割的效果。

5. GradientShap可解释性分析

是一种线性模型可解释性分析方法,使用多张参考图像解释模型预测结果。

类似上个方法,也可以继续用高斯噪声平滑,效果会更加明显

6. Fearure Ablation特征消融可解释性分析

根据实例分割标注图,分别去除图像中不同语义分组区域,观察对模型预测结果的影响。

实例分割标注图中,每个类别被划为一类feature group,根据feature group 特征分组, Fearure Ablation就是分析每个feature group存在或不存在的影响。

特征消融:把这个特征组从图片上抹去,看有何影响。

绿色最深的区域是酒瓶,抹掉对模型影响最大。显示器为红色,抹掉是对模型预测为white_bottle有正面积极影响。

7. shap工具包

基于博弈论的Shapley值实现机器学习可解释性分析,计算每个数据、每个特征,对模型每类预测结果的Shapley值,反映边际贡献(特征重要度)。对Pytorch预训练ImageNet图像分类模型、自己训练得到的30类水果图像分类模型,进行可解释性分析,可视化指定预测类别的shap值热力图。


可以看出,模型浅层输出的显著性分析图,虽然具有细粒度、高分辨率,但不具有类别判别性。而模型深层输出的显著性分析图,虽然分辨率低,但具有类别判别性。
所以现在的研究热点主要是如何既保证分辨率,又具有类别判别性。如下图,但是代价是消耗更多的计算资源。

8. lime可解释性工具包


把待测样本生成许多邻域样本,也放入模型进行预测,把邻域样本做一个简单的线性模型进行拟合,在局部拟合出原模型的行为,并可以反映待测样本的重要度以及对模型的贡献。所以LIME生成的领域图像个数越多,拟合出的结果越准。

主要思路:定量评估出某个样本、某个特征(图块),对模型预测为某个类别的贡献影响。

文本数据:


可以看出模型为啥预测为good,哪些特征有助于预测为good,哪些不利于预测为good。
黄色的更认为是good,蓝色的更认为是bad。

图像数据:


表示绿色区域对预测为牧羊犬的类别有很大的正向贡献,红色的是负向贡献。

无监督学习(unsupervised learning):已知数据不知道任何标签,按照一定的偏好,训练一个智能算法,将所有的数据映射到多个不同标签的过程。
弱监督学习(weakly supervised learning): 已知数据和其一一对应的弱标签,训练一个智能算法,将输入数据映射到一组更强的标签的过程。标签的强弱指的是标签蕴含的信息量的多少,比如相对于分割的标签来说,分类的标签就是弱标签,如果我们知道一幅图,告诉你图上有一只猪,然后需要你把猪在哪里,猪和背景的分界在哪里找出来,那么这就是一个已知若标签,去学习强标签的弱监督学习问题。
什么是监督学习、无监督学习、强化学习、弱监督学习、半监督学习、多示例学习

视频每帧画面处理思路

  1. 先定义一个每一帧的图像处理函数
  2. 用mmcv.VideiReader处理每一帧,调用图像处理函数
  3. 把每一帧串成视频文件
  4. 删除临时文件夹

摄像头实时画面处理思路

  1. 在本地运行,因为要调用摄像头(使用本地cpu)
  2. 选择快的算法:CAM
  3. 用摄像头拍摄一帧画面,转为RGB再转PIL
# 获取摄像头,传入0表示获取系统默认摄像头
cap = cv2.VideiCapture(1)
...
#BGR转RGB
img_rgb = cv2.cvtColor(img_bgr,cv2.COLOR_BGR2RGB)
#转Pil
img_pil = Image.fromarray(img_rgb)
  1. 执行前向预测
  2. 画热力图
  3. 把3-5封装成单帧的函数,从摄像头循环获取图像,并执行单帧函数

posted on 2023-01-28 23:35  琢磨亿下  阅读(1190)  评论(0编辑  收藏  举报

导航