第三章:超越基础——图像中的特征检测

上一篇《揭开计算机视觉的神秘面纱,原来机器是这样“看图”的!》

本篇序言:上一篇我们实现并训练了一个神经网络,成功让计算机“看懂”了图像。可以说,我们已经一只脚跨进了AI研发的大门。不过,虽然我们迈入了AI这个神秘的领域,实际上,我们还只是站在门槛边缘。这里面有太多复杂的东西,连2024年AI领域的诺贝尔人工智能奖得主都无法完全搞明白,因为神经网络实在太复杂了,一个人的能力根本无法解析它所学到的知识。今天这一篇,大家只需要记住两个关键概念:“卷积”和“池化”。“卷积”是神经网络自己用来从图片中抽取关键信息的一种方法,而“池化”则是人类为了减小计算量和降低硬件负担,专门设计来进一步缩小“卷积”处理后图像的大小。只要弄懂这两个概念,后面的一切就会清晰许多。

(点击关注作者,及时获取人工智能领域的核心知识更新。本文作者拥有长达8年的人工智能实际经验,能为您带来平时学不到的独特知识。)

在上一篇中,我们通过创建一个简单的神经网络,利用Fashion MNIST数据集的输入像素将图像与10个标签匹配,每个标签代表一种类型(或类别)的衣物。虽然 我们创建的网络在识别衣物类型方面做得不错,但还是有一个明显的不足。

我们的神经网络是在一些小的单色图像上进行训练的,每张图像中只包含一件衣物,并且那件衣物都位于图像中心。如果要进一步提升模型的能力,我们需要让它学会检测图像中的特征。比如,不再只是看图像中的原始像素,而是想办法把图像分解成它的基本元素。与其匹配原始像素,匹配这些元素会帮助我们更有效地识别图像中的内容。

回想一下我们在上一篇用到的Fashion MNIST数据集——在识别鞋子时,神经网络可能是因为看到图像底部聚集的许多深色像素,才判断那是鞋底的。但是,如果鞋子不再居中,或没有填满整个画面,这种逻辑就不适用了。

其中一种用来检测图像特征的方法,源自摄影和图像处理。如果你曾用过Photoshop或GIMP这样的工具来锐化图片,你实际上是在使用一种对图像像素进行操作的数学滤波器。这种滤波器的另一个叫法就是“卷积”,而当你将这些卷积应用于神经网络时,就得到了大名鼎鼎的卷积神经网络(CNN)了。

在这一篇中,我们将学习如何使用卷积来检测图像中的特征,然后更深入地研究如何基于这些特征进行图像分类。我们还会探索通过图像增强来提取更多特征,使用迁移学习借鉴其他人训练好的特征,最后简单看看如何用“dropout”技术来优化你的模型。

卷积

简单来说,卷积就是一个权重滤波器,它会把一个像素与其周围的像素进行运算,得到一个新的像素值。举个例子,回想Fashion MNIST中的那张踝靴图像,看看图像中像素的数值变化,如图3-1所示。

                                  图3-1:带卷积处理的踝靴图像

假设我们现在看的是一个图像中间的像素,它的值是192(记住Fashion MNIST的数据集是单色图像,像素值范围从0到255)。中间这个像素上面的像素值是0,左上角的是64,依此类推。

接着,我们定义一个3×3的滤波器,如下面展示的那样,滤波器的每个格子都有一个对应的值。我们要做的就是,把选中的像素和它周围的像素值分别乘以对应的滤波器值,然后把结果加起来,这个新的总和就是我们要替换的像素值。这个步骤会重复到图像中的每一个像素。

比如,当前像素的值是192,用滤波器处理后,新的像素值会是:

new_val = (-1 * 0) + (0 * 64) + (-2 * 128) +

(.5 * 48) + (4.5 * 192) + (-1.5 * 144) +

(1.5 * 142) + (2 * 226) + (-3 * 168)

结果是577,这就是新的像素值。用这个方法处理整张图像后,我们就得到了一个经过滤波器处理的图像。

接下来我们看看如果对一个更复杂的图像应用这个滤波器会有什么效果,比如SciPy自带的那个两个人爬楼梯的512×512的灰度图。用左边负值、右边正值的滤波器处理后,图像中大部分信息都会被移除,只有垂直线条保留下来。你可以看到图3-2的结果。



图3-2:使用滤波器提取垂直线条

类似地,如果稍微调整滤波器,能突出图像中的水平线条,如图3-3所示。

                                          图3-3:使用滤波器提取水平线条

这些例子告诉我们,使用滤波器不仅能提取出图像中的特征,还能减少图像中的冗余信息。随着时间的推移,我们可以学习到更适合匹配输入输出的滤波器。

池化(Pooling)

池化就是在保留图像内容的语义信息的同时,去掉一些像素。这个过程更容易通过视觉示例来理解。图3-4展示了最大池化的概念。



图3-4:展示最大池化

在这个例子里,左边的框代表单色图像中的像素。我们把这些像素分成2×2的小块,也就是把16个像素分成了四个2×2的小数组,称为“池”。然后,我们从每个小块里挑出最大值,再把这些最大值组合成一张新的图像。这样,左边的像素数量就减少了75%(从16个像素减少到4个),新图像由每个池的最大值构成。

图3-5展示了在应用最大池化后,图3-2中的Ascent图像,垂直线条得到了增强。



图3-5:经过垂直滤波和最大池化处理的Ascent图像

注意,经过滤波器处理的特征不仅得到了保留,而且还得到了进一步增强。另外,图像的尺寸从512×512缩小到了256×256,只有原来的四分之一大小。

此外,还有其他的池化方法,比如最小池化,它选择每个池中的最小像素值;还有平均池化,它取每个池的像素平均值。

本篇最讲了机器学习中的两个重要的概念:卷积和池化,下一篇我们将实现一个卷积神经网络以及探索它各层的功能。

搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)的更多相关文章

  1. tensorflow卷积神经网络-【老鱼学tensorflow】

    前面我们曾有篇文章中提到过关于用tensorflow训练手写2828像素点的数字的识别,在那篇文章中我们把手写数字图像直接碾压成了一个784列的数据进行识别,但实际上,这个图像是2828长宽结构的,我 ...

  2. Expo大作战(六)--expo开发模式,expo中exp命令行工具,expo中如何查看日志log,expo中的调试方式

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...

  3. UFLDL深度学习笔记 (六)卷积神经网络

    UFLDL深度学习笔记 (六)卷积神经网络 1. 主要思路 "UFLDL 卷积神经网络"主要讲解了对大尺寸图像应用前面所讨论神经网络学习的方法,其中的变化有两条,第一,对大尺寸图像 ...

  4. 老猿学5G扫盲贴:中移动的5G计费架构中Nchf'服务化接口以及CHF中的AGF

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.关于Nchf' 在中移动企标中出现了在3GPP ...

  5. 第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么

    第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么 Sigma协议 Sigma协议是Alice想要向Bob证明一些东西的协议(Alice知道一些秘密).他们有下面的一般范式:Al ...

  6. 轻松搞定RabbitMQ(六)——主题

    转自 http://blog.csdn.net/xiaoxian8023/article/details/48806871 翻译地址:http://www.rabbitmq.com/tutorials ...

  7. 无障碍开发(六)之ARIA在HTML中的使用规则

    ARIA使用规则一 如果你使用的元素( HTML5 )具有语义化,应该使用这些元素,而不应该重新定义一个添加ARIA的角色.状态或属性的元素. 浏览器的语义化标签已经默认隐含ARIA语义,像nav,a ...

  8. 一文搞懂 Python 的模块和包,在实战中的最佳实践

    最近公司有个项目,我需要写个小爬虫,将爬取到的数据进行统计分析.首先确定用 Python 写,其次不想用 Scrapy,因为要爬取的数据量和频率都不高,没必要上爬虫框架.于是,就自己搭了一个项目,通过 ...

  9. salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type)

    本篇引用以下三个链接: http://www.tgerm.com/2012/01/recordtype-specific-picklist-values.html?m=1 https://github ...

  10. salesforce 零基础学习(四十六)动态美观显示列表中记录的审批状态

    项目中,申请者申请某些事项以后,常常需要在申请列表中查看当前申请的记录所在的审批状态,动态美观的显示状态可以使UI更符合客户要求,比如下面这样. 以Goods__c表为例,申请者申请的一些采购以前需要 ...

随机推荐

  1. centos 7 安装 flask

    最近 Python 特别火,尤其是在人工智能和大数据分析方面,更是如火如荼.正好放假有空就简单看了下Python 先从熟悉的地方入手,那就从web框架开始学学吧. 首先,官方给了安装方法:http:/ ...

  2. 线性dp:编辑距离

    编辑距离 本题与力扣72.编辑距离题意一样,阅读完本文可以尝试leetcode72. 力扣题目链接 题目叙述 输入两个字符串a,b.输出从字符串a修改到字符串b时的编辑距离 输入 NOTV LOVER ...

  3. dig 使用

    dig dig(Domain Information Groper)是一个用于 DNS 查询的命令行工具,广泛用于查看域名系统的相关信息. 基本用法 # 查询域名的 A 记录(IPv4 地址): di ...

  4. 【Python + yaml】之yaml文件数据驱动(包括DDT驱动)

    写自动化测试代码中,数据驱动传递参数比较方便一些,也便于后期维护,下面介绍两种数据驱动: 下面是test.yaml文件: start_HRApp: ip: 127.0.0.1 port: 4723 i ...

  5. C# 模拟http请求出现 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作[windows服务器]

    系统里面用到C#模拟Http请求,上线到服务器后,发现日志中大量出现"由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作" 或"通常每个套接字地址(协议/网络地址/ ...

  6. C++ std::shared_ptr自定义allocator引入内存池

    当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低.当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分 ...

  7. 技术解析 | ZEGO 移动端超分辨率技术

    ​ 即构超分追求:速度更快.效果更好.码率更低.机型更广. 超分辨率(Super Resolution, SR)是从给定的低分辨率(Low Resolution, LR)图像中恢复高分辨率(High ...

  8. 【基础知识】【转】彻底搞懂 async & defer

    普通 script 先来看一个普通的 script 标签. <script src="a.js"></script> 浏览器会做如下处理 停止解析 docu ...

  9. Angular Material 18+ 高级教程 – CDK Accessibility の Focus

    介绍 CDK Focus 是对原生 DOM focus 的上层封装和扩展. Focus Origin 原生 DOM focus 我们只能知道 element 被 focus 了,但是无法知道它是怎么被 ...

  10. 游览器 reflow

    refer: https://juejin.im/post/5a9372895188257a6b06132e reflow 伤性能. 所以要闪. 有几个频密触发的东西要留意. 1. scroll 2. ...