新書推薦:
《
双城史
》
售價:NT$
505.0
《
冯友兰和青年谈心系列:不是问题的问题(哲学大师冯友兰和年轻人谈心,命运解读)
》
售價:NT$
254.0
《
月与蟹(青鲤文库)荣获第144届直木奖,天才推理作家经典作品全新译本。一部青春狂想曲,带你登上心理悬疑之巅。
》
售價:NT$
230.0
《
索恩丛书·盛清统治下的太监与皇帝
》
售價:NT$
403.0
《
透过器物看历史(全6册)
》
售價:NT$
2234.0
《
我在台北故宫博物院读名画
》
售價:NT$
500.0
《
尼罗河往事:古埃及文明4000年
》
售價:NT$
347.0
《
一个人·谁也不是·十万人(诺贝尔文学奖得主反思自我的巅峰之作)
》
售價:NT$
250.0
編輯推薦:
《深度学习计算机视觉实战 卷积神经网络、Python、TensorFlow和Kivy》将深度学习应用部署到生产环境中。读者将学习使用卷积神经网络CNN深度学习模型和Python编写计算机视觉应用。本书从解释传统的机器学习流程开始介绍,分析了一个图像数据集。接下来,读者将学习人工神经网络ANN,使用Python从头开始构建一个ANN,然后使用遗传算法GA优化这个神经网络。
为了使过程自动化,本书强调了采用传统手工方式为计算机视觉选择特征的局限性,重点阐明了CNN深度学习模型是*的解决方案的原因,并从头开始讨论CNN,演示了CNN与完全连接的ANN相比的与众不同之处;而且说明CNN更有效率,还使用Python实现CNN,使读者对这个模型有一个透彻的理解。
在巩固了基础之后,读者可以使用TensorFlow构建实践中使用的图像识别应用,并且使用Flask使得预训练的模型在互联网上可访问;使用Kivy和NumPy,可以用较低的开销创建跨平台的数据科学应用。
本书有助于读者从基础开始应用深度学习和计算机视觉的概念,一步一步地从概念走向生产。
內容簡介:
主要内容 ● 理解ANN和CNN的工作机制 ● 使用Python从头创建计算机视觉应用和CNN ● 使用TensorFlow从概念到生产学习深度学习项目 ● 与Kivy配合使用NumPy构建跨平台的数据科学应用
關於作者:
Ahmed Fawzy Gad是一名助教,来自埃及,2015年在埃及梅努菲亚大学计算机与信息学院获得信息技术荣誉理学学士学位,2018年获得硕士学位。Ahmed对深度学习、机器学习、计算机视觉和Python饶有兴趣。他曾担任机器学习项目的软件工程师和顾问。通过分享著作并在YouTube频道上录制教程,为数据科学界添砖加瓦是Ahmed的奋斗目标。
Ahmed发表了多篇研究论文,撰写了TensorFlow: A Guide to Build Artificial Neural Networks Using Python Lambert,2017一书。Ahmed一直希望在其所感兴趣的领域与其他专家分享经验。
目錄 :
第1章 计算机视觉识别1
1.1 图像识别步骤2
1.2 特征提取3
1.2.1 颜色直方图4
1.2.2 GLCM9
1.2.3 HOG14
1.2.4 LBP28
1.3 特征选择和缩减30
1.3.1 过滤器方法30
1.3.2 包装器方法31
1.3.3 嵌入式方法32
1.3.4 正则化33
第2章 人工神经网络35
2.1 人工神经网络简介36
2.1.1 线性模型是人工神经网络的基础36
2.1.2 绘制人工神经网络40
2.2 调整学习率来训练ANN43
2.2.1 过滤器示例44
2.2.2 学习率47
2.2.3 测试网络49
2.3 使用向后传播优化权重49
2.3.1 无隐藏层神经网络的向后传播49
2.3.2 权重更新公式52
2.3.3 为什么向后传播算法很重要53
2.3.4 前向传递与后向传递53
2.3.5 具有隐藏层的神经网络的向后传播59
2.4 过拟合68
2.4.1 基于回归示例理解正则化70
2.4.2 模型容量复杂性72
2.4.3 L1正则化74
2.5 设计ANN76
2.5.1 示例1:无隐藏层的ANN76
2.5.2 示例2:具有单个隐藏层的ANN79
第3章 使用具有工程化特征的人工神经网络进行识别83
3.1 Fruits 360数据集特征挖掘83
3.1.1 特征挖掘83
3.1.2 特征缩减89
3.1.3 使用ANN进行过滤91
3.2 ANN实现93
3.3 工程化特征的局限性99
3.4 工程化特征并未终结100
第4章 人工神经网络的优化101
4.1 优化简介101
4.2 GA104
4.2.1 选择最佳亲本106
4.2.2 变化算子107
4.2.3 示例的Python实现109
4.3 NSGA-II119
4.3.1 NSGA-II步骤119
4.3.2 支配度121
4.3.3 拥挤距离126
4.3.4 竞赛选择128
4.3.5 交叉129
4.3.6 突变129
4.4 使用GA优化ANN130
第5章 卷积神经网络143
5.1 从人工神经网络到卷积神经网络143
5.1.1 深度学习背后的直觉144
5.1.2 卷积的推导147
5.1.3 设计CNN156
5.1.4 池化操作159
5.1.5 卷积操作示例160
5.1.6 最大池化操作示例162
5.2 使用NumPy从头开始构建CNN163
5.2.1 读取输入图像163
5.2.2 准备过滤器164
5.2.3 卷积层165
5.2.4 ReLU层170
5.2.5 最大池化层171
5.2.6 堆叠层172
5.2.7 完整代码174
第6章 TensorFlow在图像识别中的应用183
6.1 TF简介183
6.1.1 张量184
6.1.2 TF Core184
6.1.3 数据流图185
6.1.4 使用TB的图可视化195
6.1.5 线性模型197
6.2 构建FFNN203
6.2.1 线性分类204
6.2.2 非线性分类211
6.3 使用CNN识别CIFAR10216
6.3.1 准备训练数据216
6.3.2 构建CNN218
6.3.3 训练CNN222
6.3.4 保存已训练模型226
6.3.5 构建和训练CNN的完整代码226
6.3.6 准备测试数据236
6.3.7 测试已训练的CNN模型237
第7章 部署预训练模型239
7.1 应用概述239
7.2 Flask介绍240
7.2.1 route装饰器241
7.2.2 add_rule_url方法243
7.2.3 变量规则243
7.2.4 端点245
7.2.5 HTML表单246
7.2.6 上传文件248
7.2.7 Flask应用内的HTML250
7.2.8 静态文件254
7.3 部署使用Fruits 360数据集训练过的模型256
7.4 部署使用CIFAR10数据集训练过的模型263
第8章 跨平台的数据科学应用277
8.1 Kivy简介278
8.1.1 使用BoxLayout的基本应用278
8.1.2 Kivy应用的生命周期279
8.1.3 部件尺寸282
8.1.4 网格布局284
8.1.5 更多部件285
8.1.6 部件树287
8.1.7 处理事件289
8.1.8 KV语言291
8.2 P4A295
8.2.1 安装Buildozer295
8.2.2 准备buildozer.spec文件296
8.2.3 使用Buildozer构建Android应用298
8.3 Android上的图像识别300
8.4 Android上的CNN305
附录A 使用pip安装程序安装自制项目包313
內容試閱 :
人工智能Artificial Intelligence,AI是将人类思维嵌入计算机的一个领域。换句话说,就是创建模仿生物大脑功能的人工大脑。现在,人们需要将使用智能可做的所有事情转移到机器中。第一代AI专注于人类可以规范描述的问题。进行智能操作的步骤以机器必须遵循的指令形式来描述。机器遵循人类给出的步骤,而不做任何改变。这些是第一代AI的特征。
人类可以完整描述一些简单问题,如井字游戏甚至是国际象棋,但无法描述更复杂的问题。在国际象棋中,将棋盘表示为88大小的矩阵可以简单地解释问题,描述每个棋子及其走法。机器将仅限于完成人类规范描述的那些任务。通过编写此类指令,机器可智能地下棋,此时机器智能是人工的。机器本身不是智能的,但人类能以几条静态代码行的形式将其智能传递给机器。所谓静态,这表示在所有情况下机器行为都是相同的。
这种状况下,机器与人类紧密相连,不能单独工作。这就像是主仆关系。人类是主人,机器是仆人,后者仅遵循人类的指令,而不能做其他事情。
将智能行为嵌入代码块并不能处理人类的所有智能行为。一些简单任务如排序数字可以由人类描述,然后交由机器处理,它们具有100%的人类智能。但某些复杂任务,例如语音转文本、图像识别、情感分析等,不能仅通过代码来解决。此类问题无法像国际象棋那样被人类描述。我们不可能编写代码识别猫等图片对象。由于不存在分类物体的单一规则,因此此类识别物体的智能行为不能简单地使用静态代码解决。例如,不存在识别猫的规则。即使某条规则能够成功创建,可以识别某个环境中的猫,但当应用到另一个环境中时,也必然失败。那么,对于此类任务,我们如何使机器拥有智能呢?这就要实现机器学习Machine Learning,ML,即由机器学习规则。
为了使机器能够识别对象,我们可以按照机器可理解的方式提供来自专家的先验知识。这种基于知识的系统构成第二代AI。此类系统的其中一个挑战在于如何处理不确定性和未知知识。人类可以在不同的复杂环境中识别对象,能够智能地处理不确定性和未知知识,但机器不能。
在ML中,人类负责完成研究数据的复杂任务,要找出哪些类型的特征能够准确地对对象进行分类。遗憾的是,找到最佳类型的特征是一项艰巨的任务。这是研究人员针对不同应用正尝试进行回答的问题。例如,为诊断疾病,专业人士首先要收集患者和未患病者的数据,对这些数据进行正确标记,然后找到可以明确区分他们的某些类型的特征。这类特征可能是年龄、性别、血糖和血压。数据集越大,人类找到适用于所有样本的特征的难度就越大,因此这是一项非常具有挑战性的任务。
但如今,我们可以训练ML模型来了解如何区分不同的类别。ML算法可以找到合适的数学函数,在输入和输出之间建立最健壮的关系。
机器学习算法并不能解决所有问题。关键的智能仍然存在于人类专家的头脑中,而非机器中。人类收集和标记数据,提取最合适的特征,并选择最佳的ML算法。在这之后,机器学习算法仅学习人类所讲的内容。在寻找将输入映射到输出的规则的过程中,机器仍然起着重要的作用。
通常,使用来自特定环境的数据进行训练的ML算法不能用在其他环境中。这是一个关键的限制。整个世界存在着大量数据,数据每天都在增加,传统的机器学习技术不适合对其进行处理。例如,使用一组工程化的特征描述图像是非常复杂的,这是因为即使在同一环境中,情况也是富于变化的。我们应该重复这项工作即特征工程,以使ML算法能够适用于其他环境。
随着类别数量的增加,人类找到好的区别性特征的能力会降低,因此我们不应该依赖于人类,而要将这些工作留给机器。机器本身会尝试探索数据,找到合适的特征,以区分不同的类别。我们仅需要提供数据给机器即可。这就是深度学习Deep Learning,DL。人们正趋于使用卷积神经网络CNN这个DL模型处理大量图像。
DL领域着重于学习如何从原始数据中得出结论,而无须进行特征工程之类的中间步骤。这就是实际上DL可以被称为自动化特征工程的原因。它对处理器和内存的要求比较高,可能需要数周的时间区分不同的类别。
《深度学习计算机视觉实战》针对的是未来的数据科学家,这些科学家正逐步开始了解DL的基本概念,以用于计算机视觉。读者应该对图像处理和Python有一个基本了解。以下是各章内容的概述。
第1章基于计算机视觉中一些常用特征描述子的介绍,选择了最适合的特征集对Fruits 360数据集进行分类。此类特征使用Python实现。通过在预处理步骤中过滤此类特征,可以使用最少数目的特征进行分类。该章得出的结论是,传统的手工特征不适用于复杂问题。DL是处理大量样本及类别的替代方法。
第2章讨论人工神经网络Artificial Neural Network,ANN,这是DL模型的基础。它首先解释了ANN仅是线性模型的组合。我们通过指定最佳层数和神经元为一些简单示例设计ANN架构。基于数值示例和Python示例,我们可以清楚地知道ANN如何进行前向和后向传递。
第3章使用第2章中的特征集实现ANN,对Fruits 360 数据集的子集进行分类。由于在实现过程中未使用任何优化技术,因此分类正确率较低。
第4章简单介绍单目标和多目标优化技术。它使用基于随机技术的遗传算法优化ANN权重。这将分类正确率提高到97%以上。
第5章讨论识别多维信号的CNN。该章从强调全连接神经网络FCNN和CNN之间的差别以及CNN如何从FCNN中衍生出来开始。基于数值示例,CNN中的两个基本操作即卷积和池化的概念将逐渐变得清晰。我们可以使用NumPy实现CNN层,从而详细了解CNN如何工作。
第6章介绍DL库TensorFlow,我们使用这个库构建用于并行和分布式处理大量数据的DL模型。通过构建简单的线性模型和模拟XOR门的ANN等示例,我们讨论了TensorFlow占位符、变量、数据流图和TensorBoard。在该章结束时,使用tensorflow.nn 模块创建了CNN,用于分类CIFAR10数据集。
第7章将训练过的模型部署到Web服务器上,以便让互联网用户使用Web浏览器进行访问。我们使用Flask微框架创建Web应用,使用HTML、CSS和JavaScript构建前端页面来访问Web服务器。HTML页面发送带有一张图像的HTTP请求到服务器,服务器使用预测类别对请求进行响应。
第8章使用Kivy开源库构建跨平台应用。通过将Kivy链接到NumPy,我们可以构建数据科学应用,不作任何改变地在不同平台上进行工作。这消除了对特定平台自定义代码的开销。我们创建了一个Android应用,它读取图像并执行第5章中使用NumPy实现的CNN。
为了让他人从所创建的项目中受益,我们可以将其在线发布。附录A讨论了如何打包Python项目,将它们发布到Python包索引PyPI仓库。
在开始学习之前,让我们先简单了解《深度学习计算机视觉实战》中使用的Python环境。
《深度学习计算机视觉实战》中的所有代码都使用Python实现。由于使用原生Python处理图像的工作非常复杂,因此我们在各章中使用了多个库帮助生成高效的实现。
首先,我们可以从www.python.orgdownloads这个链接下载原生Python代码。《深度学习计算机视觉实战》使用Python 3请安装适用于你的系统的Python版本。下一步是准备《深度学习计算机视觉实战》需要的所有库。我们不建议单独安装各个库,而推荐使用Anaconda Python发行版可以通过链接www.anaconda.comdownload进行下载。它支持Windows、Mac和Linux并打包了超过1400个的数据科学库。我们可以从https:repo.anaconda. compkgs这个页面访问所有受支持的软件包的列表。只要在计算机上安装了Anaconda,所有支持的库就都可以使用。这有助于快速准备好Python环境。
《深度学习计算机视觉实战》所需的库为NumPy、SciPy、Matplotlib、scikit-image、scikit-learn、TensorFlow、Flask、werkzeug、Jinja、pickle、Pillow和Kivy。除了Kivy外,Anaconda支持所有这些库。在《深度学习计算机视觉实战》的各个章节中,我们可以看到各个库的函数。注意,此类库很容易安装。在安装了原生Python后,可使用pip安装程序下载并安装库,所基于的指令为pip install 。我们仅需要输入库的名称。有些安装并不简单,可能随着系统的改变而改变。因此,我们无法涵盖不同的安装。出于这个原因,比起分别安装各个库,Anaconda是更好的选择。让我们继续讨论所需的库。
Python支持许多内置的数据结构:列表、元组、字典、集合和字符串。但在数据科学应用中,没有一种数据结构可提供灵活性。
这些数据结构支持同时使用不同的数据类型工作。相同的数据结构可能包含数字、字符、对象等。字符串是个例外,它只支持字符。此外,字符串和元组是不可变的,这意味着在创建后,我们不可能改变它们的值。使用字典保存图像像素要求为每个像素添加键,但这会增大所保存数据的量。集合仅限于集合操作,而图像不限于此类操作。
谈到图像,这是《深度学习计算机视觉实战》的主要内容,列表是合适的数据结构。这是一种可变的数据类型,能够存放矩阵。不过,使用列表会使过程变得复杂。由于不同的数值数据类型可以保存在相同的列表中,因此我们必须确定每一项都是某一特定类型的数值类型。为应用简单的操作如将一个数字加到图像上,我们必须写一个循环访问每个元素,单独地应用此种操作。在数据科学应用中,我们推荐使用工具让操作变得简单。在构建应用时,我们需要克服一些富有挑战性的任务,而在编写此类任务时,我们没有必要增加另一个挑战。
出于这种原因,我们使用了NumPy库。它的基本作用是在Python语言中支持一种新的数据结构,即数组。使用NumPy数组比使用列表简单。例如,在将图像转换为NumPy数组后,仅使用加法操作,我们就可以将某个数字添加到图像中的每个元素上。许多其他的库也有相应函数接收并返回NumPy数组。
虽然在NumPy数组内部支持某些操作,但这不意味着要应用这些操作。SciPy库支持NumPy数组中的相同操作。它也支持使用scipy.ndimage子模块处理n维NumPy数组例如图像。对于有关图像的更多高级操作,我们使用scikit-image库。例如,使用此库可以提取图像特征。
在读取图像并应用一些操作后,我们使用Matplotlib显示图像。我们仅将其用于2D可视化,但是它也支持一些3D特征。
在读取图像、提取特征并进行可视化后,我们可以使用scikit-learn库构建ML模型。它支持备用的不同类型的模型。只需要提供输入、输出及其参数,即可获得已训练的模型。
训练完ML模型后,可使用pickle库将其保存,供以后使用。pickle库可以序列化和反序列化对象。此时,我们可构建和保存ML模型。然后,我们可以转向使用TensorFlow构建和保存DL模型。这是最常使用的DL库,它支持不同的API,可同时满足专业人士和初学者的需求。TensorFlow用自己的方式保存已训练的模型。
Flask是用于构建Web应用程序的微框架,我们使用它部署已训练的模型。通过将已训练的模型部署到Web服务器上,客户端可以使用Web浏览器进行访问。它们可以上传测试图像到服务器,接收类别标签。Flask使用Jinja2模板引擎和WSGI构建应用。因此,我们必须安装Jinja和werkzeug库。
为构建可以在设备上运行的数据科学移动应用,我们要使用Kivy。这是支持Python代码跨平台运行的Python库。在《深度学习计算机视觉实战》中,我们使用Kivy构建适用于Android设备的丰富数据科学应用。在市面上,我们可以使用Kivy生成的APK,它与通常使用Android Studio创建的APK一模一样。
Kivy使用python-for-android打包器,它允许添加所需的依赖包到Android应用程序中。由于scikit-image不支持python-for-android,因此我们使用Pillow读取图像,这个库支持在Android设备上运行。