新書推薦:
《
镜中的星期天
》
售價:HK$
76.2
《
世界前沿技术发展报告2024
》
售價:HK$
188.2
《
可转债——新手理财的极简工具
》
售價:HK$
65.0
《
新加坡教育:神话与现实
》
售價:HK$
96.3
《
“口袋中的世界史”第一辑·冷战中的危机事件
》
售價:HK$
291.2
《
绝美的奥伦堡蕾丝披肩编织
》
售價:HK$
177.0
《
狂飙年代:18世纪俄国的新文化和旧文化(第二卷)
》
售價:HK$
177.0
《
万有引力书系 纳粹亿万富翁 德国财富家族的黑暗历史
》
售價:HK$
109.8
|
編輯推薦: |
《OpenCV 4.0 Python机器学习与计算机视觉实战》首先阐述了图像滤镜和特征匹配之类的概念,并介绍了如何使用诸如Kinect深度传感器之类的自定义传感器、如何在3D模式下重建和可视化场景、如何对齐图像以及如何将多幅图像组合为一幅图像等。
在本书的高级项目部分,你将学习到如何通过神经网络识别交通标志和面部情绪,以及如何使用神经网络检测和跟踪视频流中的对象。
学习完本书之后,你将获得实际编程经验,并能熟练地根据特定的业务需求开发自己的高级计算机视觉应用程序。本书还探索了多种机器学习和计算机视觉模型,例如支持向量机(SVM)和卷积神经网络等,这些都有助于你开发自己的实际问题解决方案。
|
內容簡介: |
《OpenCV 4.0 Python机器学习与计算机视觉实战》详细阐述了机器学习与计算机视觉相关的基本解决方案,主要包括滤镜、深度传感器和手势识别、通过特征匹配和透视变换查找对象、使用运动恢复结构重建3D场景、在OpenCV中使用计算摄影、跟踪视觉上的显著对象、识别交通标志、识别面部表情、对象分类和定位、检测和跟踪对象等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。
|
目錄:
|
第1章 滤镜 1
1.1 准备工作 2
1.2 规划应用程序 2
1.3 创建黑白铅笔素描 3
1.3.1 了解使用减淡和加深技术的方法 4
1.3.2 使用二维卷积实现高斯模糊 6
1.3.3 应用铅笔素描变换效果 7
1.3.4 使用高斯模糊的优化版本 9
1.4 生成暖调和冷调滤镜 10
1.4.1 通过曲线平移使用颜色操作 11
1.4.2 使用查找表实现曲线滤镜 11
1.4.3 设计暖调和冷调效果 12
1.5 创建图像卡通化效果 15
1.5.1 使用双边滤镜 16
1.5.2 检测并强调突出的边缘 17
1.5.3 组合颜色和轮廓以创建卡通效果 19
1.6 综合演练 20
1.6.1 运行应用程序 20
1.6.2 映射GUI基类 21
1.6.3 了解GUI构造函数 22
1.6.4 了解基本的GUI布局 23
1.6.5 处理视频流 24
1.6.6 创建自定义滤镜布局 25
1.7 小结 27
1.8 许可 28
第2章 深度传感器和手势识别 29
2.1 准备工作 30
2.2 规划应用程序 30
2.3 设置应用程序 31
2.3.1 访问Kinect 3D传感器 31
2.3.2 使用与OpenNI兼容的传感器 32
2.3.3 运行应用程序和主函数例程 34
2.4 实时跟踪手势 35
2.5 了解手部区域分割 36
2.5.1 找到图像中心区域突出的深度 36
2.5.2 应用形态学闭合操作平滑蒙版 38
2.5.3 在分割蒙版中查找连接的组件 39
2.6 执行手形分析 41
2.6.1 确定分割之后手部区域的轮廓 41
2.6.2 查找轮廓区域的凸包 41
2.6.3 寻找凸包的凸缺陷 42
2.7 执行手势识别 43
2.7.1 区分凸缺陷的不同原因 44
2.7.2 根据伸出的手指数对手势进行分类 45
2.8 小结 47
第3章 通过特征匹配和透视变换查找对象 49
3.1 准备工作 50
3.2 列出应用程序执行的任务 50
3.3 规划应用程序 52
3.4 设置应用程序 52
3.4.1 运行应用程序 52
3.4.2 显示结果 53
3.5 了解处理流程 54
3.6 学习特征提取 56
3.6.1 特征检测 56
3.6.2 使用SURF检测图像中的特征 57
3.6.3 使用SURF获取特征描述子 58
3.7 了解特征匹配 59
3.7.1 使用FLANN算法匹配图像特征 60
3.7.2 执行比率检验以消除异常值 60
3.7.3 可视化特征匹配 61
3.7.4 映射单应性估计 64
3.7.5 扭曲图像 67
3.8 了解特征跟踪 69
3.9 理解早期异常值检测和剔除 69
3.10 研究算法原理 72
3.11 小结 74
3.12 许可 75
第4章 使用运动恢复结构重建3D场景 77
4.1 准备工作 77
4.2 规划应用程序 78
4.3 了解相机校准知识 81
4.3.1 了解针孔相机模型 81
4.3.2 估算相机内参 83
4.3.3 定义相机校准图形用户界面 84
4.3.4 初始化相机校准算法 84
4.3.5 收集图像和对象点 86
4.3.6 寻找相机矩阵 87
4.4 设置应用程序 88
4.4.1 理解main例程函数 89
4.4.2 实现SceneReconstruction3D类 90
4.5 从一对图像估计相机的运动 92
4.5.1 使用丰富特征描述子应用点匹配 93
4.5.2 使用光流进行点匹配 94
4.5.3 查找相机矩阵 97
4.5.4 应用图像校正 99
4.6 重建场景 101
4.7 了解3D点云可视化 102
4.8 了解运动恢复结构 105
4.9 小结 105
第5章 在OpenCV中使用计算摄影 107
5.1 准备工作 107
5.2 规划应用程序 107
5.3 了解8位问题 108
5.3.1 了解RAW图像 110
5.3.2 使用伽玛校正 111
5.4 了解高动态范围成像 115
5.4.1 探索改变曝光度的方法 118
5.4.2 快门速度 119
5.4.3 光圈 119
5.4.4 ISO感光度 120
5.4.5 使用多重曝光图像生成HDR图像 120
5.4.6 从图像中提取曝光强度值 122
5.4.7 估计相机响应函数 123
5.4.8 使用OpenCV编写HDR脚本 124
5.4.9 显示HDR图像 125
5.5 了解全景拼接 126
5.5.1 编写脚本参数并过滤图像 126
5.5.2 计算相对位置和终图片尺寸 128
5.5.3 查找相机参数 128
5.5.4 为全景图创建画布 129
5.5.5 将图像合并在一起 129
5.5.6 改善全景拼接 131
5.6 小结 131
5.7 延伸阅读 131
5.8 许可 132
第6章 跟踪视觉上的显著对象 133
6.1 准备工作 133
6.2 了解视觉显著性 134
6.3 规划应用程序 135
6.4 设置应用程序 136
6.4.1 实现main函数 136
6.4.2 了解MultiObjectTracker类 137
6.5 映射视觉显著性 138
6.5.1 了解傅里叶分析 140
6.5.2 了解自然场景统计 142
6.5.3 使用频谱残差法生成显著图 145
6.5.4 检测场景中的原型对象 148
6.6 了解均值漂移跟踪 149
6.7 自动跟踪足球场上的所有球员 151
6.8 了解OpenCV跟踪API 154
6.9 综合演练 157
6.10 小结 158
6.11 数据集许可 158
第7章 识别交通标志 159
7.1 准备工作 160
7.2 规划应用程序 160
7.3 监督学习概念简介 161
7.3.1 训练过程 161
7.3.2 测试过程 163
7.4 探索GTSRB数据集 164
7.5 解析数据集 166
7.6 了解数据集特征提取 169
7.6.1 理解常见的预处理 170
7.6.2 了解灰度特征 171
7.6.3 理解色彩空间 172
7.6.4 使用SURF描述子 172
7.6.5 映射HOG描述子 173
7.7 关于SVM 175
7.7.1 使用SVM进行多类分类 176
7.7.2 训练SVM 177
7.7.3 测试SVM 178
7.7.4 准确率 179
7.7.5 混淆矩阵 180
7.7.6 精确率 181
7.7.7 召回率 183
7.8 综合演练 185
7.9 使用神经网络改善结果 187
7.10 小结 188
7.11 数据集许可 189
第8章 识别面部表情 191
8.1 准备工作 191
8.2 规划应用程序 192
8.3 了解人脸检测 194
8.3.1 了解基于Haar的级联分类器 194
8.3.2 理解预训练的级联分类器 195
8.3.3 使用预先训练的级联分类器 196
8.3.4 理解FaceDetector类 198
8.3.5 在灰度图像中检测脸部 199
8.3.6 预处理检测到的脸部 200
8.3.7 检测眼睛部位 201
8.3.8 变换脸部 202
8.4 收集数据 203
8.4.1 收集训练数据集 203
8.4.2 运行应用程序 204
8.4.3 实现数据收集器的图形用户界面 205
8.4.4 扩充基本布局 206
8.4.5 处理当前帧 208
8.4.6 存储数据 208
8.5 理解面部表情识别 210
8.5.1 处理数据集 210
8.5.2 了解PCA 211
8.5.3 理解MLP 213
8.5.4 理解感知器 213
8.5.5 了解深度架构 215
8.5.6 制作用于面部表情识别的MLP 217
8.5.7 训练MLP 219
8.5.8 测试MLP 220
8.5.9 运行脚本 220
8.6 综合演练 221
8.7 小结 224
8.8 参考资料 224
8.9 许可 225
第9章 对象分类和定位 227
9.1 准备工作 228
9.2 规划应用程序 228
9.3 准备推理脚本 228
9.4 准备数据集 230
9.4.1 下载并解析数据集 230
9.4.2 创建一个TensorFlow数据集 233
9.5 使用卷积神经网络分类 236
9.5.1 理解卷积神经网络 236
9.5.2 了解迁移学习 237
9.5.3 准备宠物类型和品种的分类器 239
9.5.4 训练和评估分类器网络 240
9.6 使用卷积神经网络进行定位 242
9.6.1 准备定位器模型 243
9.6.2 理解反向传播算法 245
9.6.3 训练模型 247
9.7 推理的实际应用 248
9.8 小结 249
9.9 数据集许可 249
第10章 检测和跟踪对象 251
10.1 准备工作 252
10.2 规划应用程序 252
10.3 准备主脚本 252
10.4 使用SSD模型检测对象 254
10.5 使用其他检测器 257
10.6 了解对象检测器 260
10.6.1 单对象检测器 260
10.6.2 滑动窗口方法 260
10.6.3 单遍检测器 261
10.6.4 了解交并比 263
10.6.5 训练SSD和YOLO式网络 264
10.7 跟踪检测到的对象 265
10.7.1 实现SORT跟踪器 267
10.7.2 理解卡尔曼滤波器 267
10.7.3 结合使用边界框跟踪器和卡尔曼滤波器 271
10.7.4 将边界框转换为观察值 272
10.7.5 实现卡尔曼滤波器 273
10.7.6 将检测结果与跟踪器关联在一起 276
10.7.7 定义跟踪器的类 277
10.8 查看程序的实际应用效果 279
10.9 小结 280
附录A 应用程序性能分析和加速 281
A.1 用Numba加速 282
A.2 通过CPU加速 284
A.3 理解Numba、CUDA和GPU加速 286
附录B 设置Docker容器 289
B.1 定义Dockerfile 289
B.2 使用GPU 293
|
內容試閱:
|
本书的目的是让你能够使用版本的OpenCV 4.0框架和Python 3.8语言,亲身接触各种中级或高级项目,而不仅仅是像理论课那样介绍计算机视觉的核心概念。
本书已经是第二版,增加了使用OpenCV解决问题的概念的深度。它将指导你完成独立的实践项目,这些项目侧重于基本的计算机视觉概念,例如图像处理、3D场景重建、对象检测和对象跟踪。它还通过实际示例讨论了统计学习和深度神经网络。
本书首先阐述了图像滤镜和特征匹配之类的概念,并介绍了如何使用诸如Kinect深度传感器之类的自定义传感器、如何在3D模式下重建和可视化场景、如何对齐图像以及如何将多幅图像组合为一幅图像等。
在本书的高级项目部分,你将学习到如何通过神经网络识别交通标志和面部情绪,以及如何使用神经网络检测和跟踪视频流中的对象。
学习完本书之后,你将获得实际编程经验,并能熟练地根据特定的业务需求开发自己的高级计算机视觉应用程序。本书还探索了多种机器学习和计算机视觉模型,例如支持向量机(SVM)和卷积神经网络等,这些都有助于你开发自己的实际问题解决方案。
本书读者
本书主要针对使用OpenCV和其他机器学习库开发高级实际应用程序的计算机视觉领域爱好者,以帮助他们掌握相应技能。
本书读者应该具备基础编程技能和Python编程知识。
内容介绍
本书共分为10章,另外还包括两个附录。具体介绍如下。
第1章“滤镜”,探讨了若干比较有趣的图像滤镜(如黑白铅笔素描、暖调/冷调滤镜和卡通化效果等),并可将这些滤镜应用于网络摄像头的实时视频流。
第2章“深度传感器和手势识别”,可帮助你开发应用程序,以使用深度传感器(如Microsoft Kinect 3D Sensor或华硕Xtion)的输出实时检测和跟踪简单的手势。
第3章“通过特征匹配和透视变换查找对象”,可帮助你开发一个应用程序,以检测摄像头视频流中的任意感兴趣的对象,即使从不同角度或距离,甚至是部分遮挡观察对象的情况下也可以正常工作。
第4章“使用运动恢复结构重建3D场景”,展示了如何通过从摄像头运动中推断场景的几何特征来重建和可视化3D场景。
第5章“在OpenCV中使用计算摄影”,可以帮助你开发命令行脚本,将图像作为输入并生成全景或高动态范围(HDR)图像。本章脚本将对齐图像以使其具有像素之间的对应关系,或者将其拼接在一起以创建全景图像,这是图像对齐的有趣应用。
第6章“跟踪视觉上的显著对象”,可以帮助你开发一个应用程序,以跟踪一个视频序列中的多个视觉显著对象(例如足球比赛中场上的所有球员)。
第7章“识别交通标志”,向你展示了如何训练支持向量机,以识别来自德国交通标志识别基准(GTSRB)数据集中的交通标志。
第8章“识别面部表情”,可以帮助你开发一个应用程序,以实时检测人脸并在网络摄像头的视频流中识别其面部表情。
第9章“对象分类和定位”,将引导你开发使用深度卷积神经网络进行实时对象分类的应用程序。你将修改分类器网络,以使用自定义类别在自定义数据集上进行训练。你还将学习如何在数据集上训练Keras模型,以及如何序列化Keras模型并将其保存到磁盘。你将看到如何使用加载的Keras模型对新输入图像进行分类,如何使用图像数据训练卷积神经网络,以获得良好的分类器和非常高的准确率。
第10章“检测和跟踪对象”,将指导你开发使用深度神经网络进行实时对象检测的应用程序,并可将其连接到跟踪器。你将学习对象检测器的工作原理及其训练方法,实现一个基于卡尔曼滤波器的跟踪器,使用对象的位置和速度来预测可能的位置。完成本章的示例后,你将能够构建自己的实时对象检测和跟踪应用程序。
附录A“应用程序性能分析和加速”,介绍了如何使用Numba在应用程序中发现性能瓶颈并实现现有代码的基于CPU和GPU的加速。
附录B“设置Docker容器”,将引导你复制用于运行本书代码的环境。
充分利用本书
本书所有的代码都使用Python 3.8,可在各种操作系统(如Windows、GNU Linux和macOS等)上使用。我们已尽量仅使用这3个操作系统上可用的库,并且详细介绍了所使用的每个依赖项的确切版本,可以使用pip(Python的依赖项管理系统)进行安装。如果你仍然无法使这些依赖项正常工作,则可以使用本书提供的Dockerfile,我们已对本书中的所有代码进行了测试,这些内容在附录B“设置Docker容器”中有详细介绍。
表P-1提供了本书使用的依赖项列表,以及相应的章节。
表P-1 本书使用的依赖项列表
需要的软件 版 本 章 节 下 载 链 接
Python 3.8 全部 https://www.python.org/downloads/
OpenCV 4.2 全部 https://opencv.org/releases/
NumPy 1.18.1 全部 http://www.scipy.org/scipylib/download.html
wxPython 4.0 1、4、8 http://www.wxpython.org/download.php
matplotlib 3.1 4、5、6、7 http://matplotlib.org/downloads.html
SciPy 1.4 1、10 http://www.scipy.org/scipylib/download.html
rawpy 0.14 5 https://pypi.org/project/rawpy/
ExifRead 2.1.2 5 https://pypi.org/project/ExifRead/
TensorFlow 2.0 7、9 https://www.tensorflow.org/install
为运行代码,你需要一台普通的笔记本电脑或个人计算机。有些章节要求使用网络摄像头,这可以是笔记本电脑的嵌入式摄像头,也可以是外部摄像头。第2章“深度传感器和手势识别”还需要深度传感器,这可以是Microsoft 3D Kinect传感器,也可以是 libfreenect库或OpenCV支持的任何其他传感器(如华硕Xtion)。
本书代码已经在Ubuntu 18.04上使用Python 3.8和Python 3.7进行了测试。
如果你的计算机上已经装有Python,则可以在终端上运行以下命令:
$ pip install -r requirements.txt
上述requirement.txt在本书项目的GitHub存储库中有提供,并且包含以下内容(这其实就是表P-1中的依赖项列表):
wxPython==4.0.5
numpy==1.18.1
scipy==1.4.1
matplotlib==3.1.2
requests==2.22.0
opencv-contrib-python==4.2.0.32
opencv-python==4.2.0.32
rawpy==0.14.0
ExifRead==2.1.2
tensorflow==2.0.1
或者,你也可以按照附录B“设置Docker容器”中的说明进行操作,以使所有代码都可以在Docker容器中运行。
下载示例代码文件
读者可以从www.packtpub.com下载本书的示例代码文件。具体步骤如下:
(1)注册并登录www.packtpub.com。
(2)在页面顶部的搜索框中输入图书名称OpenCV 4 with Python Blueprints(不区分大小写,也不必输入完整),即可看到本书,单击打开链接,如图P-1所示。
图P-1 搜索图书名
(3)在本书详情页面中,找到并单击Download code from GitHub(从GitHub下载代码文件)按钮,如图P-2所示。
提示:
如果你看不到该下载按钮,可能是没有登录packtpub账号。该站点可免费注册账号。
图P-2 单击下载代码的按钮
(4)在本书GitHub源代码下载页面中,单击右侧的Code(代码)按钮,在弹出的下拉菜单中选择Download ZIP(下载压缩包),如图P-3所示。
下载文件后,请确保使用版本解压缩或解压缩文件夹:
? WinRAR/7-Zip(Windows系统)。
? Zipeg/iZip/UnRarX(Mac系统)。
? 7-Zip/PeaZip(Linux系统)。
你也可以直接访问本书在GitHub上的存储库,其网址如下:
https://github.com/PacktPublishing/OpenCV-4-with-Python-Blueprints-Second-Edition
如果代码有更新,则也会在现有GitHub存储库上更新。
图P-3 下载GitHub存储库中的代码压缩包
下载彩色图像
我们还提供了一个PDF文件,其中包含本书中使用的屏幕截图/图表的彩色图像。可以通过以下地址下载:
http://static.packt-cdn.com/downloads/9781789801811_ColorImages.pdf
本书约定
本书中使用了许多文本约定。
(1)CodeInText:表示文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄等。以下段落就是一个示例:
你可以在以下GitHub存储库中找到本章介绍的代码:
https://github.com/PacktPublishing/
OpenCV-4-with-Python-Blueprints-Second-Edition/tree/master/chapter3
(2)有关代码块的设置如下所示:
import argparse
import cv2
import numpy as np
from classes import CLASSES_90
from sort import Sort
(3)任何命令行输入或输出都采用如下所示的粗体代码形式:
$ python chapter8.py collect
(4)术语或重要单词采用中英文对照形式,在括号内保留其英文原文。示例如下:
在计算机视觉中,在图像中找到感兴趣区域的过程称为特征检测(Feature Detection)。在后台,对于图像中的每个点,特征检测算法都会确定图像点是否包含感兴趣的特征。OpenCV提供了范围广泛的特征检测算法。
(5)对于界面词汇将保留英文原文,在括号内添加其中文翻译。示例如下:
其具体思路是,单击6个单选按钮之一以指示你要录制的面部表情,然后将头部放在边界框内,再单击Take Snapshot(拍摄快照)按钮。
(6)本书还使用了以下两个图标。
表示警告或重要的注意事项。
表示提示或小技巧。
关于作者
Menua Gevorgyan博士是一位经验丰富的研究人员,具有信息技术和服务行业的长期工作经历。他精通计算机视觉、深度学习、机器学习和数据科学,并且在OpenCV和Python编程方面拥有丰富的经验。他对机器感知和机器理解问题感兴趣,并有意探索让机器像人类一样感知世界。
“感谢Rosal Colaco为提高本书质量所做的辛苦努力,也感谢Sandeep Mishra对于本书的良好建议。”
Arsen Mamikonyan是一位经验丰富的机器学习专家,曾在硅谷和伦敦工作,还曾在亚美尼亚美国大学(奥克兰)任教。他精通应用机器学习和数据科学,并使用Python和 OpenCV等构建了现实应用程序。他拥有麻省理工学院的工程学硕士学位,专攻人工智能。
“感谢我的妻子Lusine,以及我的父母Gayane和Andranik,他们在我写作这本书的过程中不断鼓励我。还要感谢我的合著者Menua,他在忙碌的工作日程中始终与我保持紧密联系,并在我们从事这个项目的过程中保持了很高的积极性。”
Michael Beyeler是华盛顿大学神经工程和数据科学的博士后研究员,他正在研究仿生视觉的计算模型,以改善植入视网膜假体(仿生眼)的盲人的知觉体验。
他的工作处于神经科学、计算机工程、计算机视觉和机器学习的交叉领域。他还是多个开源软件项目的积极贡献者,并且在Python、C/C 、CUDA、MATLAB和Android等方面拥有专业的编程经验。Michael拥有加州大学尔湾分校的计算机科学博士学位,以及瑞士苏黎世联邦理工学院的生物医学工程理学硕士学位和电气工程理学学士学位。
关于审稿人
Sri Manikanta Palakollu是一名在JNTUH SICET攻读计算机科学与工程学士学位的本科生。他是他所在大学的OpenStack开发人员社区的创始人。
他已经开始了自己的职业程序员生涯。他喜欢解决与数据科学领域有关的问题。他的兴趣包括数据科学、应用程序开发、Web开发、网络安全和技术写作。他在Hacker Noon、freeCodeCamp、Towards Data Science和DDI等出版物上发表了许多有关数据科学、机器学习、编程和网络安全的文章。
|
|