无法深入理解的事物,就不能更好地去发掘与应用
0.引子
为什么要写这个文章?
之前关注过笔者的朋友,应该知道笔者目前是一名深度学习算法工程师,主要的工作与研究方向是CV。最近在做目标检测任务的算法开发与优化,在某些目标检测的任务中遇到目标误检严重的问题。基于笔者经验的分析,数据的样本与多样化不够,无法让网络学习到真正目标的特征。
但这个分析仅仅是笔者经验之谈,并无佐证,且分析也过于笼统,也未发掘其本质问题。其实以笔者愚见目前深度学习还是处于一个黑盒状态,仅通过输入数据输出结果与模型结构很难量化出学到哪些具体特征。目前已经出现了一些针对卷积网络特征可视化分析方法,一定程度上阐明了卷积网络学到的内容,所未完全揭示其本质,但也极大推动了深度学习可解释性的发展。
谈回目标检测任务方面,与单纯卷积神经分类网络有交集,但也存在很大不同。笔者参考卷积神经可视化分析方法,针对目标检测的任务进行迁移分析,从而试图更接近问题的本质。
如果对您有用的话,请不吝赞同鼓励,有其他高见也欢迎评论交流。。
1.CNN可视化分析
首先来看看CNN中有哪些可视化分析方法:
- 可视化中间特征图。
- 可视化卷积核。
- 可视化图像中类激活的热力图。
1.1可视化中间特征图
这种方法是最简单,输入一张照片,然后把网络中间某层的输出的特征图按通道作为图片进行可视化展示即可。
代码:
import
上图为在某个卷积网络输入一张小猫照片后特征图可视化的结果,总共有四组图,分别代表conv5-8,每组图的个数(其实就是卷积通道数目)分别为16,32,64,64。
我们可以发现这几个问题:
1.越靠近底层(输入层)的特征图越关注具体细节纹理特征,所有有些特征图还可以看到猫脸形状信息。越远离底层的特征图越关注语义信息,其实就是更在意抽象信息,如猫的耳朵鼻子特征等。
2.每组特征图之间的特征会有相似性,如conv5中,有几张猫脸特征图十分相似。这一方面说明了某些卷积是冗余的,这是模型剪枝的理论依据;另一方面也是轻量网络GhostNet理论理论基础,通过某些简易计算(见下图Φi的操作)来获取特征图来降低参数的正确性。
3.可以发现有些特征图是缺失了,表现在图上就是深蓝的方格,为什么会出现这样情况。根据热力图(上面可视化就是通过matplotlib热力图来展示的)的原理,那些深蓝的方格就是输出特征全为零。为什么会出现这个情况呢,一部分原因是Relu激活函数(max(0,x)操作)使得小于零的特征被限制到了0,这也说明经过学习某些特征图已经失去了作用,冗余理论再次出现。
2.可视化卷积核。
想要观察卷积神经网络学到的过滤器,一种简单的方法是获取每个过滤器所响应的视觉模式。我们可以将其视为一个优化问题,即从空白输入图像开始,将梯度上升应用于卷积神经网络的输入图像,让某个过滤器的响应最大化,最后得到的图像是选定过滤器具有较大响应的图像。
核心代码如下所示(利用Keras框架):
def
将输入图片张量转换回图片后进行可视化,可以得到与下述类似的图片:
随着层数的加深,卷积神经网络中的过滤器变得越来越复杂,越来越精细。模型第一层( block1_conv1 )的过滤器对应简单的方向边缘和颜色,高层的过滤器类似于自然图像中的纹理:羽毛、眼睛、树叶等。
3.可视化图像中类激活的热力图
即显示原始图片的不同区域对某个CNN输出类别的“贡献”程度,如下面图片所示:
可以看到,大象头部对“大象”这个类别的“贡献”程度较高,而且这种方法似乎可以在一定程度上进行无监督的目标检测。
下面是书中原文,可能有点绕口。
我们将使用的具体实现方式是“Grad-CAM: visual explanations from deep networks via gradient-based localization”这篇论文中描述的方法。这种方法非常简单:给定一张输入图像, 对于一个卷积层的输出特征图,用类别相对于通道的梯度对这个特征图中的每个通道进行加权。直观上来看,理解这个技巧的一种方法是,你是用“每个通道对类别的重要程度”对“输入图像对不同通道的激活强度”的空间图进行加权,从而得到了“输入图像对类别的激活强度”的空间图。
这里谈一下我的理解,给定线性函数
代码如下所示:
african_elephant_output
得到的热力图如下所示:
经下述代码处理后,可以得到本节开始时的图片。
import
以上部分内容参考:CNN的一些可视化方法 - yishun的文章 - 知乎 https:// zhuanlan.zhihu.com/p/53 683453
2.目标检测可视化分析
总结完CNN的可视化分析内容,现在要进入本文主题,对目标检测的可视化分析。
CNN中主要可视化分析方法有以下三种:
- 可视化中间特征图。
- 可视化卷积核。
- 可视化图像中类激活的热力图。
方法1,2操作起来较为简单,但是对于分析目标检测误检情况帮助不大的,因为CNN一般只是作为目标检测的Backbone,抽取图片整体的特征。而目标检测网络,Head分类与回归任务也是很重要的一部分内容,这关乎到目标检测最终的输出部分。故最终笔者选取了方法3,来可视化对应目标检测结果的图片激活热力图,来分析网络所习得的特征。
针对CNN的方法3中,是针对于输出类别对某层网络输出梯度来计算热力图。而目标检测的任务较单独的分类就复杂很多。既有CNN作为backbone,还有FPN结构,同时分类和回归两个输出来。所以在目标检测方法3的计算时,需要去考虑两个分类和回归输出对于CNN与FPN的梯度,来配合分析。
目前笔者还没有理清如何来较为简便地实现这个功能,也欢迎各位大牛提出宝贵建议。
在下篇实践文章中,笔者将通过对YoloV5特征可视化分析来演示整个流程。
演示图类似下面
-1.参考内容
1.CNN的一些可视化方法 - yishun的文章 - 知乎 https://zhuanlan.zhihu.com/p/53683453
2.https://blog.csdn.net/cl2227619761/article/details/106577306/