基於TensorFlow和Keras的圖像識別

2021-02-15 Python程式設計師

簡介

TensorFlow和Keras最常見的用途之一是圖像識別/分類。通過本文,您將了解如何使用Keras達到這一目的。

定義

如果您不了解圖像識別的基本概念,將很難完全理解本文的內容。因此在正文開始之前,讓我們先花點時間來了解一些術語。

TensorFlow/Keras

TensorFlow是Google Brain團隊創建的一個Python開源庫,它包含許多算法和模型,能夠實現深度神經網絡,用於圖像識別/分類和自然語言處理等場景。TensorFlow是一個功能強大的框架,通過實現一系列處理節點來運行,每個節點代表一個數學運算,整個系列節點被稱為「圖」。

Keras是一個高級API(應用程式編程接口),支持TensorFlow(以及像Theano等其他ML庫)。其設計原則旨在用戶友好和模塊化,儘可能地簡化TensorFlow的強大功能,在Python下使用無需過多的修改和配置

圖像識別(分類)

圖像識別是指將圖像作為輸入傳入神經網絡並輸出該圖像的某類標籤。該標籤對應一個預定義的類。圖像可以標記為多個類或一個類。如果只有一個類,則應使用術語「識別」,而多類識別的任務通常稱為「分類」。

圖像分類的子集是對象檢測,對象的特定實例被識別為某個類如動物,車輛或者人類等。

特徵提取

為了實現圖像識別/分類,神經網絡必須進行特徵提取。特徵作為數據元素將通過網絡進行反饋。在圖像識別的特定場景下,特徵是某個對象的一組像素,如邊緣和角點,網絡將通過分析它們來進行模式識別。

特徵識別(或特徵提取)是從輸入圖像中拉取相關特徵以便分析的過程。許多圖像包含相應的註解和元數據,有助於神經網絡獲取相關特徵。

神經網絡如何學習識別圖像

直觀地了解神經網絡如何識別圖像將有助於實現神經網絡模型,因此在接下來的幾節中將簡要介紹圖像識別過程。

使用濾波器進行特徵提取

圖片來源: commons.wikimedia.org

神經網絡的第一層接收圖像的所有像素。當所有的數據傳入網絡後,將不同的濾波器應用於圖像,構成圖像不同部分的表示。這是特徵提取,它創建了「特徵映射」。

從圖像中提取特徵的過程是通過「卷積層」完成的,並且卷積只是形成圖像的部分表示。由卷積的概念延伸出卷積神經網絡(CNN)這一術語,它是圖像分類/識別中最常用的神經網絡類型。

如果您無法想像特徵映射是如何創建的,可以試想將手電筒照在暗室圖片的景象。當光束滑過圖片時,您正在學習圖像的特徵。在這個比喻中,手電筒發射的光束就是濾波器,它被網絡用於形成圖像的表示。

光束的寬度控制著一次掃過的圖像的區域大小,神經網絡具有類似的參數,即濾波器的大小。它影響一次掃過的圖像的像素數。CNN中常見的濾波器尺寸為3,這包括高度和寬度,因此所掃描的像素區域大小為3×3。

圖片來源: commons.wikimedia.org

雖然濾波器的尺寸覆蓋其高度和寬度,同時也需要明確濾波器的深度。

2D圖像如何具有深度?

數字圖像被渲染為高度、寬度和一些定義像素顏色的RGB值,因此被跟蹤的「深度」是圖像具有的顏色通道的數量。灰度(非彩色)圖像僅包含1個顏色通道,而彩色圖像包含3個顏色通道。

這意味著對於應用於全彩色圖像的尺寸為3的濾波器,其規模為3×3×3。對於該濾波器覆蓋的每個像素,神經網絡將濾波器的值和像素本身的值相乘以獲取像素的數值表示。然後,對整個圖像完成上述過程以實現完整的表示。根據參數「步幅」,濾波器在圖像的其餘部分滑動。該參數定義了在計算當前位置的值之後,濾波器要滑動的像素數。CNN的默認步幅取值為2。

通過上述計算,最終將獲取特徵映射。此過程通常由多個濾波器完成,這有助於保持圖像的複雜性。

激活函數

當圖像的特徵映射創建完成之後,表示圖像的值將通過激活函數或激活層進行傳遞。受卷積層的影響,激活函數獲取的表示圖像的值呈線性,並且由於圖像本身是非線性的,因此也增加了該值的非線性。

儘管偶爾會使用一些其他的激活函數(詳情請參閱此處),線性整流函數(Rectified Linear Unit, ReLU)是最常用的。

池化層

當數據被激活之後,它們將被發送到池化層。池化對圖像進行下採樣,即獲取圖像信息並壓縮,使其變小。池化過程使網絡更加靈活,更擅長基於相關特徵來識別對象/圖像。

當觀察圖像時,我們通常不關心背景信息,只關注我們關心的特徵,例如人類或動物。

類似地,CNN的池化層將抽象出圖像不必要的部分,僅保留相關部分。這由池化層指定的大小進行控制。

由於池化層需要決定圖像中最相關的部分,所以希望神經網絡只學習真正表示所討論對象的部分圖像。這有助於防止過度擬合,即神經網絡很好地學習了訓練案例,並無法類推到新數據。

圖片來源: commons.wikimedia.org

池化值的方式有多種,最大池化(max pooling)是最常用的。最大池化獲取單個濾波器中像素的最大值。假設使用卷積核大小為2×2的濾波器,將會丟失3/4的信息。

使用像素的最大值以便考慮可能的圖像失真,並且減小圖像的參數/尺寸以便控制過度擬合。還有一些其他的池化類型,如均值池化(average pooling)和求和池化(sum pooling),但這些並不常用,因為最大池化往往精確度更高。

壓平(Flattening)

CNN的最後一層,即稠密層,要求數據採用要處理的矢量形式。因此,數據必須「壓平」。值將被壓縮成向量或按順序排列的列。

全連接層

CNN的最後一層是稠密層,或人工神經網絡(ANN)。ANN主要用於分析輸入特徵並將其組合成有助於分類的不同屬性。這些層基本上形成了代表所討論對象的不同部分的神經元集合,並且這些集合可能代表狗鬆軟的耳朵或者蘋果的紅色。當足夠的神經元被激活用於響應輸入圖像時,該圖像將被分類為某個對象。

圖片來源: commons.wikimedia.org

數據集中計算值和期望值之間的誤差由ANN進行計算。然後網絡經過反向傳播,計算給定神經元對下一層神經元的影響並對其進行調整。如此可以優化模型的性能,然後一遍又一遍地重複該過程。以上就是神經網絡如何訓練數據並學習輸入特徵和輸出類之間的關聯。

中間的全連接層的神經元將輸出與可能的類相關的二進位值。如果有四個不同的類(例如狗,汽車,房子以及人),神經元對於圖像代表的類賦「1」,對其他類賦「0」。

最終的全連接層將接收之前層的輸出,並傳遞每個類的概率,總和為1。如果「狗」這一類別的值為0.75,則表示該圖像是狗的確定性為75%。

至此圖像分類器已得到訓練,並且可以將圖像傳入CNN,CNN將輸出關於該圖像內容的猜想。

機器學習的工作流

在開始訓練圖像分類器的示例之前,讓我們先來了解一下機器學習的工作流程。訓練神經網絡模型的過程是相當標準的,可以分為四個不同的階段。

數據準備


首先,需要收集數據並將其放入網絡可以訓練的表中。這涉及收集圖像並標記它們。即使下載了其他人準備好的數據集,也可能需要進行預處理,然後才能用於訓練。數據準備本身就是一門藝術,包括處理缺失值,數據損壞,格式錯誤的數據,不正確的標籤等。

在本文中,我們將使用預處理的數據集。

創建模型


創建神經網絡模型涉及各種參數和超參數的選擇。需要確定所用模型的層數,層輸入和輸出的大小,所用激活函數的類型,以及是否使用dropout等。

如何設置參數和超參數需要大量的學習和經驗的累積,本文將在示例講解中對其進行介紹。

訓練模型


創建模型後,只需創建模型實例並將其與訓練數據相匹配即可。訓練模型時,一個重要的因素即訓練所需時間。您可以通過指定訓練的epoch數目來指定網絡的訓練時長。時間越長,其性能就越高,但是epoch次數過多將存在過度擬合的風險。

您可以適當地設置訓練時的epoch數目,並且通常會保存訓練周期之間的網絡權重,這樣一旦在訓練網絡方面取得進展時,就無需重新開始了。

模型評估

評估模型有多個步驟。評估模型的第一步是將模型與驗證數據集進行比較,該數據集未經模型訓練過,可以通過不同的指標分析其性能。

評估神經網絡模型的性能有各種指標,最常見的指標是「準確率」,即正確分類的圖像數量除以數據集中的圖像總和。

在了解模型性能在驗證數據集上的準確率後,通常會微調參數並再次進行訓練,因為首次訓練的結果大多不盡人意,重複上述過程直到對準確率感到滿意為止。

最後,您將在測試集上測試網絡的性能。該測試集是模型從未用過的數據。

也許您在想:

為什麼要用測試集呢?如果想了解模型的準確率,採用驗證數據集不就可以了嗎?

採用網絡從未訓練過的一批數據進行測試是有必要的。因為所有參數的調整,結合對驗證集的重新測試,都意味著網絡可能已經學會了驗證集的某些特徵,這將導致無法推廣到樣本外的數據。

因此,測試集的目的是為了檢測過度擬合等問題,並且使模型更具實際的應用價值。

英文原文:https://stackabuse.com/image-recognition-in-python-with-tensorflow-and-keras/ 
譯者:我是暱稱耶~

相關焦點

  • 基於Tensorflow\keras銀行卡識別
    :機器學習算法與Python精研 ,ID:AITop100】,經微信公眾號授權轉載,如需轉載原文作者聯繫來自:GitHub測試環境Ubuntu 18.04python 3.6.7numpy 1.16.4tensorflow-gpu
  • 圖像分類任務中,Tensorflow 與 Keras 到底哪個更厲害?
    讓我們看看這個問題在圖像分類的實際應用中的答案。在此之前,先介紹Keras和Tensorflow這兩個術語,幫助你在10分鐘內構建強大的圖像分類器。TensorflowTensorflow是開發深度學習模型最常用的庫。它是有史以來最好的庫,在日常實驗中被許多極客選擇。
  • Tensorflow.keras筆記-卷積神經網絡
    Tensorflow.keras筆記-卷積神經網絡cifar10數據集    1.
  • 用Keras+TensorFlow,實現ImageNet數據集日常對象的識別
    王新民編譯自DeepLearningSandbox博客量子位出品|公眾號QbitAI在計算機視覺領域裡,有3個最受歡迎且影響非常大的學術競賽:ImageNetILSVRC(大規模視覺識別挑戰賽),PASCALVOC(關於模式分析,統計建模和計算學習的研究)和微軟COCO圖像識別大賽。
  • 100天搞定機器學習|day39 Tensorflow Keras手寫數字識別
    TensorFlow 最初由Google大腦小組(隸屬於Google機器智能研究機構)的研究員和工程師們開發出來,用於機器學習和深度神經網絡方面的研究,但這個系統的通用性使其也可廣泛用於其他計算領域。1、安裝庫tensorflow有些教程會推薦安裝nightly,它適用於在一個全新的環境下進行TensorFlow的安裝,默認會把需要依賴的庫也一起裝上。
  • Keras和TensorFlow究竟哪個會更好?
    我會使用基於 TensorFlow 的標準 keras 模塊和 tf.keras 模塊,來實現一個卷積神經網絡(CNN)。然後,基於一個示例數據集,來訓練這些 CNN,然後檢查所得結果,你會發現,Keras 和 TensorFlow 是可以和諧共處的。
  • 如何利用TensorFlow.js部署簡單的AI版「你畫我猜」圖像識別應用
    本文創建了一個簡單的工具來識別手繪圖像,並且輸出當前圖像的名稱。該應用無需安裝任何額外的插件,可直接在瀏覽器上運行。作者使用谷歌 Colab 來訓練模型,並使用 TensorFlow.js 將它部署到瀏覽器上。
  • 基於RTX2060構建TensorFlow-gpu(keras)學習平臺
    開始菜單運行anaconda navigator檢查是否安裝了notebook(默認有安裝)三、安裝tensorflow/keras在激活的環境中安裝:1. 如果機器上有gpu,則安裝gpu版本,沒有GPU就安裝cpu版。
  • TensorFlow開發者證書 中文手冊
    用深層神經網絡和卷積神經網絡建立圖像識別、目標檢測、文本識別算法使用不同尺寸的真實圖像通過卷積提取體現特徵,理解計算機如何「看到」信息,繪製損失和精度曲線嘗試防止過擬合的策略,包括數據增強和dropout
  • 【官方教程】TensorFlow在圖像識別中的應用
    人們毫不費力地就能區分出獅子和美洲虎,閱讀符號,或是識別面孔。但是這些任務對於計算機而言卻是一個大難題:它們之所以看上去簡單,是因為我們的大腦有著超乎想像的能力來理解圖像。在過去幾年裡,機器學習在解決這些難題方面取得了巨大的進步。其中,我們發現一種稱為深度卷積神經網絡的模型在困難的視覺識別任務中取得了理想的效果 —— 達到人類水平,在某些領域甚至超過。
  • 使用tensorflow和Keras的初級教程
    https://www.kaggle.com/mlg-ulb/creditcardfraudimport tensorflow as tfprint(tf.__version__)import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitimport tensorflow as tffrom sklearn import preprocessingfrom tensorflow.keras.models import Sequentialfrom
  • 基於OpenCV與tensorflow實現實時手勢識別
    公眾號【OpenCV學堂】,致力於計算機視覺開發技術傳播,原創技術文章200+的,涉及OpenCV開發、tensorflow開發、模型解析與訓練、傳統圖像處理算法解析,對圖像與視覺感興趣的強烈推薦關注!
  • 《基於Scikit-Learn、Keras和TensorFlow的機器學習實戰》:人工神經網絡介紹
    它們具有通用性、強大性和可擴展性,使得它們能夠很好地解決大型和高度複雜的機器學習任務,例如分類數十億圖像(例如,谷歌圖像),強大的語音識別服務(例如,蘋果的 Siri),每天將最好的視頻推薦給數百萬的用戶(比如 YouTube),或者學會在Go遊戲中擊敗世界冠軍(DeepMind 的 AlgFaGo)。
  • TensorFlow圖像分類教程
    雲棲君導讀:深度學習算法與計算機硬體性能的發展,使研究人員和企業在圖像識別、語音識別、推薦引擎和機器翻譯等領域取得了巨大的進步。
  • TensorFlow 1.9 新增 tf.keras 官方入門教程(Keras與TF的深度集成)
    好消息是Keras的許多核心功能已經融入了原生的TensorFlow(tf.keras),TensorFlow 1.9新增tf.keras官方入門文檔,介紹了tf.keras的使用。這幾天打開TensorFlow的官方教程頁(https://www.tensorflow.org/tutorials/),會發現教程頁中給出的DEMO變成了基於tf.keras的教程。
  • 深度學習環境配置指南:Pytorch、TensorFlow、Keras
    導讀本文介紹了作者使用RTX3090進行深度學習環境配置pytorch、tensorflow、keras等的詳細過程及代碼。筆者中山大學研究生,醫學生+計科學生的集合體,機器學習愛好者。-7.2.1.4-cp36-none-linux_x86_64.whl tensorflow_estimator-1.15.1-py2.py3-none-any.whl nvidia_tensorboard-1.15.0+nv20.10-py3-none-any.whlnvidia_tensorflow-1.15.4+nv20.10-cp36-cp36m-linux_x86_64.whl -i http
  • TensorFlow 2.1指南:keras模式、渴望模式和圖形模式(附代碼)
    發布了新的硬體體系結構,晶片和優化,以支持不斷增長的AI應用的部署。什麼時候是停下來重新考慮的好時機?那只有你會知道。對我來說,這一刻已經到來了。我一直在使用Keras和Tensorflow的1.x(TF1)在工作和我的個人項目,因為我在這個領域開始。
  • TensorFlow 2.0正式版官宣!深度集成Keras
    實現tf.train.Optimizers和tf.keras.Optimizers的統一。對TF2.0使用tf.keras.Optimizers。作為公共API刪除了compute_gradients,使用GradientTape計算梯度。
  • TensorFlow(Keras)中的正則化技術及其實現(附代碼)
    量化是基於一組輸入的輸出(成本),這些輸入稱為參數值。參數值用於估計預測,「損失」是預測與實際值之間的差。本文將不關注正則化的數學。相反,本文介紹了一些標準的正則化方法以及如何使用TensorFlow(Keras)在神經網絡中實現它們。
  • 如何使用 TensorFlow mobile 將 PyTorch 和 Keras 模型部署到行動裝置
    一個很顯著的例子是「Microsoft Swiftkey」,這是一個鍵盤 app, 能通過學習你常用的單詞和詞組來幫助你快速打字。 計算機視覺,自然語言處理,語音識別和語音合成等技術能夠大大改善用戶在移動應用方面的體驗。幸運的是,在移動應用方面,有很多工具開發成可以簡化深度學習模型的部署和管理。