第 一篇基础知识
第 1章 神经网络的原理/3
1.1 神经网络/4
1.1.1 神经元的结构/4
1.1.2 生物神经元与计算机中神经元模型结构的相似性/6
1.1.3 生物神经元与计算机神经元模型工作流程的相似性/6
1.1.4 神经网络的形成/6
1.2 神经网络与深度学习的关系/7
1.3 全连接神经网络/7
1.3.1 全连接神经网络的结构/7
1.3.2 实例分析:全连接神经网络中每个神经元的作用/8
1.3.3 全连接神经网络的拟合原理/10
1.3.4 全连接神经网络的设计思想/10
1.4 生物界的视觉处理系统/11
1.4.1 大脑对视觉信号的处理流程 /11
1.4.2 大脑对神经信号的分级处理 /12
1.5 离散微积分/12
1.5.1 离散微分与离散积分/12
1.5.2 计算机视觉中的离散积分/13
1.6 卷积神经网络/13
1.6.1 卷积的过程/14
1.6.2 1D卷积、2D卷积和3D卷积/14
1.6.3 实例分析:Sobel算子的原理/15
1.6.4 深度神经网络中的卷积核/17
1.6.5 反卷积/18
1.7 卷积分/18
1.8 卷积神经网络与全连接神经网络的关系/19
第 2章 搭建开发环境/21
2.1 准备硬件环境/22
2.2 下载及安装Anaconda/22
2.2.1 下载Anaconda开发工具/22
2.2.2 安装Anaconda开发工具/23
2.2.3 安装Anaconda开发工具时的注意事项/23
2.3 使用Anaconda安装TensorFlow/24
2.3.1 查看TensorFlow的版本/24
2.3.2 使用Anaconda 安装TensorFlow/24
2.3.3 TensorFlow的安装指南/25
2.4 测试显卡及开发环境的一些常用命令/25
2.4.1 使用nvidia-smi命令查看显卡 信息/25
2.4.2 nvidia-smi命令失效的解决 办法/26
2.4.3 查看CUDA 的版本/27
2.4.4 查看cuDNN 的版本/27
2.4.5 用代码测试安装环境/28
2.5 使用Python虚环境实现多个 TensorFlow版本共存/28
2.5.1 查看当前的Python虚环境及Python版本/28
2.5.2 创建Python虚环境/29
2.5.3 在Python虚环境中安装TensorFlow 1.x版本/31
2.5.4 进行界面配置/31
2.5.5 使用PyCharm编辑器切换虚环境/33
2.6 安装Docker/35
2.6.1 Docker简介/35
2.6.2 在Dabian系列的Linux系统中安装Docker/35
2.6.3 在Red Had系列的Linux系统中安装Docker/36
2.6.4 安装NVIDIA Docker/38
2.7 安装TF_Serving模块/38
2.7.1 在Linux系统中使用apt-get命令安装TF_Serving模块/38
2.7.2 在Linux系统中使用Docker安装TF_Serving模块/39
第3章 在网络侧搭建图片分类器/41
3.1基础概念/42
3.1.1 ResNet50模型与残差网络/42
3.1.2 tf.keras接口/43
3.2 代码环境及模型准备/44
3.2.1 获取预训练模型/44
3.2.2 在本地进行模型部署/45
3.3 代码实现:用ResNet50模型识别图片所属类别/45
3.4 使用模型时如何预处理输入图片/48
3.4.1 最近邻法/48
3.4.2 调整图片尺寸的其他方法/48
3.4.3 数据预处理在模型应用中的重要性/49
3.4.4 ImgNet中预训练模型的数据预处理方法/49
3.5 代码实现:将模型导出为支持部署的冻结图/50
3.5.1 saved_model的用法/50
3.5.2 调用saved_model模块为模型添加签名并保存/50
3.5.3 运行代码并生成冻结图/51
3.6 在服务器上部署分类器模型/52
3.6.1 指定模型的版本号/52
3.6.2 启动服务容器/52
3.6.3 关闭网络侧服务的方法/53
3.7 代码实现:构建URL请求客户端/54
3.8 网络侧的分类应用/55
3.9 扩展:使用更多预训练模型进行部署/56
3.9.1 VGG模型/56
3.9.2 Inception模型/56
3.9.3 DenseNet模型/57
3.9.4 PNASNet模型/57
3.9.5 EfficientNet模型/58
3.9.6主流卷积模型的通用结构/60
第二篇中级应用
第4章 识别图片中不同肤色的人数/63
4.1 安装实例所依赖的模块/64
4.1.1 安装opencv-python模块/64
4.1.2 安装face_recognition模块/64
4.1.3 安装imageio模块/65
4.1.4 安装tqdm模块/65
4.2 编写爬虫程序并收集样本/65
4.2.1 设计爬虫程序/65
4.2.2 代码实现:定义爬虫类/66
4.2.3 代码实现:用爬虫爬取图片/69
4.3 加工样本/70
4.3.1 提取人脸信息的具体步骤/70
4.3.2 代码实现:将裁剪图片加工成训练样本/70
4.4 将样本载入数据集/72
4.4.1 tf.data.Dataset接口/72
4.4.2 tf.data.Dataset接口支持的数据集变换操作/72
4.4.3 代码实现:构建数据集/77
4.5 tf.keras接口的使用/79
4.5.1 调用函数式API的模式/79
4.5.2 构建子类的模式/83
4.5.3 其他模式及总结/86
4.6 深度卷积神经网络/86
4.6.1 深度卷积神经网络的组成/87
4.6.2 卷积运算/87
4.6.3 池化运算/88
4.6.4 激活函数ReLU及相关的变体函数/89
4.7 构建网络模型/91
4.7.1 设计深度卷积神经网络模型的结构/92
4.7.2 Dropout层的实现与原理/92
4.7.3 Softmax算法及其原理/93
4.7.4 常用的损失算法/94
4.7.5 代码实现:用tf.keras接口搭建卷积神经网络/95
4.7.6 代码实现:定义网络模型的训练接口/97
4.7.7 代码实现:可视化模型结构/98
4.8 使用模型/101
4.8.1 代码实现:使用模型对图片进行识别/101
4.8.2 代码实现:使用模型对实时视频流进行识别/102
4.8.3 在Linux系统中调用摄像头并使用模型/104
4.9 卷积神经网络的优化方法/106
4.9.1 批量归一化/106
4.9.2 更好的激活函数/106
4.9.3 更好的Dropout方法/108
4.9.4 更好的网络结构/110
4.9.5 更好的卷积核/111
4.9.6 卷积核的分解技巧/114
4.9.7 可分离深度卷积/115
4.9.8 空洞卷积/115
4.10 练习题/116
第5章 用迁移学习诊断医疗影像/117
5.1 处理样本/118
5.1.1 医疗影像的文件格式/118
5.1.2 ChestX-ray14数据集/119
5.1.3 在实例中部署数据集/121
5.1.4 数据增强/121
5.1.5 用tf.keras接口进行数据增强的方法/123
5.1.6 代码实现:创建用于数据增强的图像生成器/125
5.1.7 应用图像生成器的方法/126
5.1.8 代码实现:在数据集上应用图像生成器/129
5.2 分类任务与样本均衡/134
5.2.1 二分类任务/134
5.2.2 互斥多分类任务与互斥分类任务/134
5.2.3 非互斥分类任务/134
5.2.4 训练过程中的样本均衡问题/134
5.2.5 代码实现:为ChestX-ray14 数据集进行样本均衡/135
5.3 迁移训练CheXNet模型/137
5.3.1 迁移训练/137
5.3.2 CheXNet模型/137
5.3.3 下载DenseNet121预训练模型/139
5.3.4 代码实现:用tf.keras接口搭建预训练模型/139
5.3.5 代码实现:构建模型/141
5.4 编译模型/141
5.4.1 优化器的种类与选取/141
5.4.2 tf.keras接口中的损失函数/143
5.4.3 学习率与退化学习率的设置/143
5.4.4 评估函数的设置/144
5.4.5 代码实现:为模型添加自定义评估接口/145
5.4.6 代码实现:编译模型/147
5.5 tf.keras接口中训练模型的方法/148
5.5.1 fit方法的使用/148
5.5.2 fit_generator方法的使用/149
5.6 tf.keras训练模型中的Callbacks方法/150
5.6.1 输出训练过程中的指定数据/151
5.6.2 将训练过程中的指定数据输出到TensorBoard上/151
5.6.3 保存训练过程中的检查点文件/151
5.6.4 设置训练模型的早停功能/152
5.6.5 设置退化学习率/152
5.6.6 自定义Callbacks方法/152
5.7 添加回调函数并训练模型/153
5.7.1 代码实现:添加检查点回调函数/153
5.7.2 代码实现:添加退化学习率回调函数/153
5.7.3 代码实现:训练模型并可视化训练过程/154
5.8 使用基于梯度定位的深度网络可视化方法显示病灶区域/156
5.8.1 Grad-CAM方法/156
5.8.2 代码实现:计算病灶区域/158
5.9 扩展实例:多模型融合/161
5.9.1 多模型融合/161
5.9.2 使用八度卷积来替换模型中的普通卷积/162
5.9.3 使用随机数据增强方法训练模型/164
5.9.4 使用AdvProp方法训练模型/164
5.9.5 使用自训练框架Noisy Student训练模型/166
5.9.6 关于更多训练方法的展望/167
5.10 在衣服数据集上处理多标签非互斥分类任务/167
第三篇高级应用
第6章 用Anchor-Free模型检测
文字/173
6.1 基于图片内容的处理任务/174
6.1.1 目标识别任务/174
6.1.2 图片分割任务/174
6.1.3 Anchor-Free模型/175
6.1.4 非极大值抑制算法/176
6.1.5 FCOS模型/176
6.1.6 focal loss算法/177
6.1.7 CornerNet与CornerNet-Lite模型/178
6.1.8 CenterNet模型/179
6.1.9 高斯核函数/179
6.1.10 Matrix Net模型/182
6.1.11 目标检测中的上采样与下采样/183
6.1.12 卷积运算与补零间的关系/183
6.2 处理样本/184
6.2.1 样本/184
6.2.2 代码实现:用tf.data.Dataset接口开发版本兼容的数据集/185
6.2.3 代码实现:为尺寸调整后的样本图片同步标注坐标/192
6.2.4 代码实现:将标签改为“中心点、高、宽”的形式/195
6.3 构建堆叠式沙漏网络模型/198
6.3.1 沙漏网络模型/198
6.3.2 代码实现: 构建沙漏网络模型的基础结构/200
6.3.3 代码实现: 构建沙漏网络模型的前置结构/201
6.3.4 代码实现: 构建沙漏网络模型的主体结构/203
6.3.5 代码实现: 搭建堆叠式沙漏网络模型/206
6.3.6 代码实现: 对沙漏网络模型进行单元测试/207
6.4 构建CenterNet模型类/208
6.4.1 代码实现: 定义CenterNet模型类并实现初始化方法/208
6.4.2 代码实现: 定义模型的输入节点/209
6.4.3 代码实现: 构建模型的网络结构/211
6.4.4 代码实现: 计算模型的损失值/215
6.4.5 高斯核半径的计算/220
6.4.6 代码实现: 实现CenterNet模型类的训练/222
6.5 训练模型/224
6.5.1 代码实现: 构建数据集/224
6.5.2 代码实现: 实例化MyCenterNet类并加载权重参数/225
6.5.3 代码实现: 训练模型并保存最优结果/226
6.6 使用模型/228
6.6.1 代码实现: 实例化MyCenterNet类/228
6.6.2 代码实现: 读取图片并预测/229
6.7 模型开发过程中的经验与技巧/230
6.7.1 如何用tf.data.Dataset接口返回变长的批次样本数据/230
6.7.2 在模型训练过程中处理损失值为None的思路/231
6.7.3 实例分析:由于计算方法的问题,引起损失值为None/232
6.7.4 使用tf.data.Dataset接口对齐填充时的注意事项/233
6.7.5 实例分析:由于模型输出的问题,引起损失值为None/233
6.7.6 实例分析:由于学习率过大,引起损失值为None/234
6.7.7 归一化权重设置不当会使模型停止收敛/235
6.7.8 实例分析:归一化权重设置不当会使模型停止收敛/235
6.7.9 退化学习率使用不当会使模型停止收敛/236
6.7.10 如何避免模型在预测和训练时处理的样本相同却得到不同的结果/237
6.7.11 实例分析:用模型检测相同的数据却得出不同的结果/237
6.7.12 常用的带补零的卷积运算/238
6.7.13 使用更好的骨干网模型Res2Net/239
6.8 扩展:对汉字进行区域检测/240
6.9 练习题/240
第7章 实现OCR模型——可以从图片中识别出文字的模型/241
7.1实例:用CNN模型识别验证码/242
7.1.1 样本/242
7.1.2 代码实现:生成自定义字体的验证码/242
7.1.3 代码实现:构建输入数据集/243
7.1.4 模型的设计思路/244
7.1.5 代码实现:搭建卷积网络模型/244
7.1.6 代码实现:搭建多分类输出层/246
7.1.7 训练模型并输出结果/247
7.1.8 原理分析:输出层的每个分类是否可以与字符序列对应/247
7.1.9 练习题:可视化分类器的关注区域/248
7.2 通用OCR的实现原理/250
7.3 文字检测的相关技术/251
7.4 文字识别的相关技术/252
7.5 实例:用CRNN模型识别图片中的 变长文字/252
7.5.1 制作样本/253
7.5.2 代码实现:用tf.data.Dataset接口开发版本兼容的数据集/253
7.5.3 CRNN中的RNN/259
7.5.4 代码实现:构建CRNN模型/259
7.5.5 CTC算法与损失计算/264
7.5.6 代码实现:实现损失计算函数/265
7.5.7 代码实现:实现自定义Callbacks类并重新计算损失值/266
7.5.8 代码实现:训练CRNN模型/267
7.5.9 代码实现:使用CRNN模型进行预测/270
7.6 开发模型过程中的经验与技巧/272
7.6.1 在下采样操作中尽可能用步长为2的操作代替池化/272
7.6.2 实例验证:全尺寸卷积与全连接完全一样/273
7.6.3 批量归一化与激活函数的位置关系/274
7.6.4 在神经网络模型中是否有必要操作Dropout层/277
7.6.5 实例分析:应该将图片归 一 化到[0,1]区间还是[-1,1]区间/278
7.6.6 用tf.keras接口编写组合模型时容易犯的错误/279
7.6.7 开发含CTC算法的代码的注意事项/282
7.6.8 在使用相同数据集的情况下训练过程的损失值和验证过程的损失值不同/282
7.6.9 实例验证:训练时优化器的选取/283
第8章 优化OCR模型——基于卷积网络和循环网络的优化/285
8.1 优化OCR模型中的图像特征处理部分/286
8.1.1 提升深度卷积神经网络鲁棒性的思路/286
8.1.2 STN模型/286
8.1.3 STN模型的原理分析/287
8.2 实例:用STN实现MNIST数据集的仿射变换/288
8.2.1 样本/288
8.2.2 代码实现:构建STN层/288
8.2.3 代码实现:测试STNtransformer类/294
8.2.4 代码实现:制作DataSet/297
8.2.5 独立组件层的原理/298
8.2.6 代码实现:搭建应用ReNorm算法的IC层/299
8.2.7 ReNorm算法的原理/299
8.2.8 代码实现:搭建有STN层的卷积模型/300
8.2.9 代码实现:训练STN模型/302
8.2.10 代码实现:使用模型进行预测并显示STN层的结果/303
8.3 实例:用STN层优化OCR模型/305
8.3.1 带STN层的CRNN模型的结构/305
8.3.2 代码实现:搭建有STN层的CRNN模型/306
8.3.3 代码实现:训练模型并输出结果/307
8.3.4 优化步骤1:使损失不变的模型发生收敛/308
8.3.5 优化步骤2:消除模型在训练和预测相同数据时的效果差异/310
8.3.6 扩展:广义的STN/313
8.4 对OCR网络中的序列生成部分进行优化/315
8.4.1 多头注意力与自注意力机制/315
8.4.2 用多头自注意力机制模型替换RNN模型/316
8.4.3 用注意力机制改善RNN模型/318
8.4.4 用seq2seq框架改善输出序列/321
8.4.5 Addons模块/322
8.4.6 使用反向序列/322
8.5 扩展实例:用控制点校正的方法优化OCR网络/323
8.5.1 代码实现: 搭建有控制点校正的STN模型/324
8.5.2 控制点在模型预测中的效果/325
8.5.3 ASTER模型/326
8.6 开发模型的经验与技巧/327
8.6.1 相关函数/327
8.6.2 防范手动初始化权重的陷阱/329
8.6.3 测试模型泛化能力过程中的注意事项/331
8.6.4 使用Mish激活函数与Ranger优化器进一步提升性能/331
展开