点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达

第一个卷积神经网络是Alexander Waibel在1987年提出的时延神经网络(TDNN)[5]。TDNN是应用于语音识别问题的卷积神经网络。它使用FFT预处理语音信号作为输入。它的隐藏层由两个一维卷积核组成,以提取频域中的平移不变特征[6]。在TDNN出现之前,人工智能领域在反向传播(BP)研究中取得了突破性进展[7],因此TDNN能够使用BP框架进行学习。在原作者的对比实验中,在相同条件下,TDNN的性能要优于隐马尔可夫模型(HMM),后者是1980年代语音识别的主流算法[6]。
1988年,张伟提出了第一个二维卷积神经网络转换不变人工神经网络(SIANN),并将其应用于医学图像的检测[1]。Yann LeCun还在1989年,为计算机视觉问题构建了卷积神经网络[2],即LeNet的原始版本中。LeNet包含两个卷积层,两个完全连接层,总共60,000个学习参数,其规模远远超过TDNN和SIANN,其结构非常接近现代卷积神经网络[4]。LeCun(1989)采用[2]随机梯度下降(SGD)进行随机初始化后的权值学习。后来的深度学习学院保留了这一策略。此外,LeCun(1989)在讨论其网络结构[2]时首次使用了卷积一词,并以此命名卷积神经网络。
对于深度卷积神经网络,经过多次卷积和合并后,其最后的卷积层包含最丰富的空间和语义信息。卷积神经网络中的每个卷积单元实际上都扮演着对象检测器的角色,它本身具有定位对象的能力但是其中包含的信息对于人类来说是难以理解的,并且难以以视觉方式显示。
在本文中,我们将回顾类激活映射(CAM),CAM借鉴了著名的论文《网络中的网络》(Network In Network)中的思想,用全局平均池(GAP)代替了全连接层。
所提出的CNN网络具有强大的图像处理和分类功能,同时还可以定位图片的关键部分。
卷积神经网络(CNN) ,主要是通过单个过滤器连续提取特征,从局部特征到总体特征,以便进行图像识别等功能。
假设我们需要处理尺寸为6x6像素的单通道灰度图像,将其转换为二维矩阵,如下所示:

资料来源:https : //mc.ai/my-machine-learning-diary-day-68/
图片中的数字表示该位置的像素值,像素值越大,颜色越亮。图片中间的两种颜色之间的分界线是我们要检测的边界。
我们可以设计一个过滤器(也称为kernel)来检测该边界。然后,将该过滤器与输入图片进行曲面组合以提取边缘信息,可以将图片上的卷积操作简化为以下动画:

资料来源:https : //mc.ai/my-machine-learning-diary-day-68/
我们使用此过滤器覆盖图片,覆盖与过滤器一样大的区域,将相应的元素相乘,然后求和。计算一个区域后,移至其他区域,然后计算直到覆盖原始图片的所有区域。
输出矩阵称为特征图(Feature Map),它的中间颜色较浅,两侧颜色较深,反映了原始图像中间的边界。

来源:https : //mc.ai/learning-to-perform-linear-filtering-using-natural-image-data/
卷积层主要包含两个部分,一个过滤器和一个特征图,这是数据流经CNN网络的第一个神经层,通过学习使用的过滤器越多,将自动调整CNN的过滤器矩阵,将得到更多的特征。
要设置的常规超参数包括过滤器的数量,大小和步长。
池化也称为空间池化或子采样。其主要功能是提取特定区域的主要特征并减少参数数量,以防止模型过度拟合。
这里没有我们需要学习的参数。需要指定的超参数包括池化类型,常用的方法包括Maxpooling或Averagepooling,窗口大小和步长。通常,我们更多地使用Maxpooling,并且通常采用大小为(2,2),步长为2的过滤器,因此在合并之后,输入长度和宽度将减少2倍,并且通道不会更改,如下图所示:

最大值在合并窗口内获取,并在特征图矩阵上顺序合并后生成新矩阵。同样,我们也可以使用求平均或求和的方法,但是在通常情况下,使用最大值方法获得的效果相对更好。
经过几次卷积和合并后,我们最终将多维数据展平为一维数组,然后将它们连接到完全连接层。

来源:https : //gfycat.com/fr/smoggylittleflickertailsquirrel-machine-learning-neural-networks-mnist
它的主要功能是基于通过卷积层和池化层提取的特征集对处理后的图片进行分类。
诸如GoogleNet [10]之类的全卷积神经网络避免使用全连接层,而使用全局平均池(GAP)。这样,不仅可以减少参数以避免过度拟合,而且可以创建到类别关联的特征图。
全局平均池化层(Global Average Pooling)
长期以来,完全连接的网络一直是CNN分类网络的标准结构。通常,完全连接后将具有用于分类的激活功能。但是完全连接的层具有大量参数,这会降低训练速度,并且容易过拟合。
在网络中的网络 [9]中,提出了全局平均池的概念来代替完全连接的层。

资料来源:http : //www.programmersought.com/article/1768159517/
全局平均池和局部平均池之间的区别是池窗口。局部平均池化包括对特征图中的子区域取平均值,而在全局平均池中,我们对整个特征图取平均。

来源:https : //www.machinecurve.com/index.php/2020/01/30/what-are-max-pooling-average-pooling-global-max-pooling-and-global-average-pooling/
使用全局平均池而不是完全连接的层会大大减少参数的数量。
类激活图(Class Activation Map)
当使用全局平均池化时,最后的卷积层被迫生成与我们所针对的类别数量相同数量的特征图,这将为每个特征图赋予非常清晰的含义,即类别可信度图 [11]。

来源:https : //medium.com/@ahmdtaha/learning-deep-features-for-discriminative-localization-aa73e32e39b2
从图中可以看出,在GAP之后,我们获得了最后一个卷积层的每个特征图的平均值,并通过加权和获得了输出。对于每个类别C,每个特征图k的平均值具有相应的权重w。
训练CNN模型后,我们可以获得一个热图来解释分类结果。例如,如果我们要解释C类的分类结果。我们取出与类C对应的所有权重,并找到它们对应的特征图的加权和。由于此结果的大小与特征图一致,因此我们需要对其进行过采样并将其覆盖在原始图像上,如下所示:

来源:https : //medium.com/@ahmdtaha/learning-deep-features-for-discriminative-localization-aa73e32e39b2
通过这种方式,CAM以热图的形式告诉我们,模型集中在用于确定图片的c类中的像素上。

来源:MultiCAM:用于遥感图像中飞机识别的多类激活映射
CAM的解释效果一直很好,但是有一个缺点,那就是它需要修改原始模型的结构,从而导致需要重新训练模型,这极大地限制了它的使用场景。如果模型已经在线,或者培训成本很高,那么我们几乎不可能对其进行再培训。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

