《OpenCV 4.0 Python機器學習與計算機視覺實戰》首先闡述了圖像濾鏡和特徵匹配之類的概念,並介紹了如何使用諸如Kinect深度傳感器之類的自定義傳感器、如何在3D模式下重建和可視化場景、如何對齊圖像以及如何將多幅圖像組合為一幅圖像等。
在本書的高級項目部分,你將學習到如何通過神經網絡識別交通標志和面部情緒,以及如何使用神經網絡檢測和跟蹤視頻流中的物件。
學習完本書之後,你將獲得實際編程經驗,並能熟練地根據特定的業務需求開發自己的高級計算機視覺應用程序。本書還探索了多種機器學習和計算機視覺模型,例如支持向量機(SVM)和卷積神經網絡等,這些都有助於你開發自己的實際問題解決方案。
本書的目的是讓你能夠使用版本的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等出版物上發表了許多有關數據科學、機器學習、編程和網絡安全的文章。
第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
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。