《機器視覺之TensorFlow 2》是2020年人民郵電出版社出版的圖書,作者是李金洪。
基本介紹
- 書名:機器視覺之TensorFlow 2
- 作者:李金洪
- 出版社:人民郵電出版社
- 出版時間:2020年8月1日
- ISBN:9787115539090
內容簡介,圖書目錄,作者簡介,
內容簡介
本書主要介紹了TensorFlow 2在機器視覺中的套用。本書共8章,主要內容包括神經網路的原理,如何搭建開發環境,如何在網路側搭建圖片分類器,如何識別圖片中不同膚色的人數,如何用遷移學習診斷醫療影像,如何使用Anchor-Free模型檢測文字,如何實現OCR模型,如何最佳化OCR模型。
本書適合機器視覺、深度學習方面的專業人士閱讀。
圖書目錄
第 一篇基礎知識
第 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
作者簡介
李金洪,代碼醫生工作室高級工程師,大蛇智慧型網站創始人,精通C、C++、彙編、Python、Java、Go等語言,擅長神經網路、算法、協定分析、移動網際網路安全架構等技術,先後擔任過CAD算法工程師、手機架構師、項目經理、首席技術官、部門經理、資深產品總監等職位。在深度學習領域中參與過某移動網際網路後台的光學字元識別項目、某娛樂節目機器人的語音識別和聲紋識別項目及金融領域的若干分類項目。發布過兩套關於CNTK深度學習框架的視頻教程。
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
作者簡介
李金洪,代碼醫生工作室高級工程師,大蛇智慧型網站創始人,精通C、C++、彙編、Python、Java、Go等語言,擅長神經網路、算法、協定分析、移動網際網路安全架構等技術,先後擔任過CAD算法工程師、手機架構師、項目經理、首席技術官、部門經理、資深產品總監等職位。在深度學習領域中參與過某移動網際網路後台的光學字元識別項目、某娛樂節目機器人的語音識別和聲紋識別項目及金融領域的若干分類項目。發布過兩套關於CNTK深度學習框架的視頻教程。