1. 程式人生 > 實用技巧 >如何使用卷積神經網路進行影象處理?

如何使用卷積神經網路進行影象處理?

人工智慧(Artificial Intelligence,AI)是將人類思維嵌入計算機的一個領域。 換句話說,就是建立模仿生物大腦功能的人工大腦。現在,人們需要將使用智慧可做的所有事情轉移到機器中。第一代 AI 專注於人類可以規範描述的問題。 進行智慧操作的步驟以機器必須遵循的指令形式來描述。機器遵循人類給出的步驟,而不做任何改變。這些是第一代 AI 的特徵。

人類可以完整描述一些簡單問題,如井字遊戲甚至是國際象棋,但無法描述更復雜的問題。在國際象棋中,將棋盤表示為 8×8 大小的矩陣可以簡單地解 釋問題,描述每個棋子及其走法。機器將僅限於完成人類規範描述的那些任務。 通過編寫此類指令,機器可智慧地下棋,此時機器智慧是人工的。機器本身不是智慧的,但人類能以幾條靜態程式碼行的形式將其智慧傳遞給機器。所謂“靜 態”,這表示在所有情況下機器行為都是相同的。

這種狀況下,機器與人類緊密相連,不能單獨工作。這就像是主僕關係。 人類是主人,機器是僕人,後者僅遵循人類的指令,而不能做其他事情。 將智慧行為嵌入程式碼塊並不能處理人類的所有智慧行為。一些簡單任務(如 排序數字)可以由人類描述,然後交由機器處理,它們具有 100%的人類智慧。 但某些複雜任務,例如語音轉文字、影象識別、情感分析等,不能僅通過程式碼 來解決。此類問題無法像國際象棋那樣被人類描述。我們不可能編寫程式碼識別 貓等圖片物件。由於不存在分類物體的單一規則,因此此類識別物體的智慧行 為不能簡單地使用靜態程式碼解決。例如,不存在識別貓的規則。即使某條規則能夠成功建立,可以識別某個環境中的貓,但當應用到另一個環境中時,也必然失敗。那麼,對於此類任務,我們如何使機器擁有智慧呢?這就要實現機器 學習(Machine Learning,ML),即由機器學習規則。

為了使機器能夠識別物件,我們可以按照機器可理解的方式提供來自專家的先驗知識。這種基於知識的系統構成第二代 AI。此類系統的其中一個挑戰在於如何處理不確定性和未知知識。人類可以在不同的複雜環境中識別物件,能夠智慧地處理不確定性和未知知識,但機器不能。

在 ML 中,人類負責完成研究資料的複雜任務,要找出哪些型別的特徵能夠準確地對物件進行分類。遺憾的是,找到最佳型別的特徵是一項艱鉅的任務。 這是研究人員針對不同應用正嘗試進行回答的問題。例如,為診斷疾病,專業人士首先要收集患者和未患病者的資料,對這些資料進行正確標記,然後找到可以明確區分他們的某些型別的特徵。這類特徵可能是年齡、性別、血糖和血壓。資料集越大,人類找到適用於所有樣本的特徵的難度就越大,因此這是一項非常具有挑戰性的任務。

但如今,我們可以訓練 ML 模型來了解如何區分不同的類別。ML 演算法可以找到合適的數學函式,在輸入和輸出之間建立最健壯的關係。

機器學習演算法並不能解決所有問題。關鍵的智慧仍然存在於人類專家的頭腦中,而非機器中。人類收集和標記資料,提取最合適的特徵,並選擇最佳的 ML 演算法。在這之後,機器學習演算法僅學習人類所講的內容。在尋找將輸入對映到輸出的規則的過程中,機器仍然起著重要的作用。

通常,使用來自特定環境的資料進行訓練的 ML 演算法不能用在其他環境中。 這是一個關鍵的限制。整個世界存在著大量資料,資料每天都在增加,傳統的機器學習技術不適合對其進行處理。例如,使用一組工程化的特徵描述影象是非常複雜的,這是因為即使在同一環境中,情況也是富於變化的。我們應該重複這項工作(即特徵工程),以使 ML 演算法能夠適用於其他環境。

隨著類別數量的增加,人類找到好的區別性特徵的能力會降低,因此我們不應該依賴於人類,而要將這些工作留給機器。機器本身會嘗試探索資料,找到合適的特徵,以區分不同的類別。我們僅需要提供資料給機器即可。這就是深度學習(Deep Learning,DL)。人們正趨於使用卷積神經網路(CNN)這個 DL 模型處理大量影象。

DL 領域著重於學習如何從原始資料中得出結論,而無須進行特徵工程之類的中間步驟。這就是實際上 DL 可以被稱為“自動化特徵工程”的原因。它對處理器和記憶體的要求比較高,可能需要數週的時間區分不同的類別。

《深度學習計算機視覺實戰 卷積神經網路、Python、TensorFlow 和 Kivy》針對的是未來的資料科學家,這些科學家正逐步開始瞭解 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、TensorFlow 和 Kivy》中的所有程式碼都使用 Python 實現。由於使用原生 Python 處理影象的 工作非常複雜,因此我們在各章中使用了多個庫幫助生成高效的實現。 首先,我們可以從 www.python.org/downloads 這個連結下載原生 Python 代 碼。本書使用 Python 3(請安裝適用於你的系統的 Python 版本)。下一步是準備 本書需要的所有庫。我們不建議單獨安裝各個庫,而推薦使用 Anaconda Python 發行版 ( 可以通過連結 www.anaconda.com/download 進行下載 ) 。它支援 Windows、Mac 和 Linux 並打包了超過 1400 個的資料科學庫。我們可以從 https://repo.anaconda. com/pkgs 這個頁面訪問所有受支援的軟體包的列表。只要 在計算機上安裝了 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 裝置上執行。

——————————————圖書基本資訊———————————————————

書名:《深度學習計算機視覺實戰 卷積神經網路、Python 、TensorFlow和Kivy》

定價:98元

ISBN: 9787302558224

出版時間:2020年9月

京東連結:https://item.jd.com/12974492.html

內容簡介:

《深度學習計算機視覺實戰 卷積神經網路、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構建跨平臺的資料科學應用