【乾貨】TensorFlow實戰——圖像分類神經網絡模型

2021-02-20 專知

Learn how to classify images with TensorFlow

使用TensorFlow創建一個簡單而強大的圖像分類神經網絡模型

by Adam Monsen

▌引言

 

由於深度學習算法和硬體性能的快速發展,研究人員和各大公司在圖像識別,語音識別,推薦引擎和機器翻譯等領域取得了長足的進步。六年前,在計算機視覺領域首先出現重大突破,這其中以CNN模型在ImageNet數據集上的成功為代表。兩年前,Google Brain團隊開源TensorFlow,使得我們可以靈巧快速地開發自己的深度學習模型。 目前來看, TensorFlow已經超越許多其他深度學習的工具庫。

 

TensorFlow可以賦予你強大的能力,其具有良好的易用性,使你輕鬆實現各種複雜功能。

 

本文由兩部分組成,我將解釋如何快速創建用於實際圖像識別的卷積神經網絡。當然該網絡還可以對視頻中的逐幀圖像進行分析,從而擴展基於時間序列的視頻分析。

 

本文提供你最需要的乾貨,你只需要了解一些命令行和Python的基礎知識就行了。 本系列目的在於讓你快速動手,並激勵你創造屬於自己的新項目。限於篇幅,我不會深入探討TensorFlow的工作原理,但如果你想了解更多,我會提供大量額外的參考資料。本系列中的所有庫和工具都是免費的、開源的。

 

它是怎麼工作的

 

我們在本教程中的目標是:通過一個命令給出一個新圖像屬於哪個類別,我們將按照以下步驟操作:

 

 

1.標註(Labeling)是對訓練數據進行管理的過程。比如對於花卉,為了根據需要挑選出不同類別的花朵,我們要將雛菊的圖像歸入「雛菊」類,將玫瑰歸入「玫瑰」類等等。當然如果我們不給任何圖像貼上「蕨類植物」的標籤,分類器將永遠不會返回「蕨類植物」。因此這個過程需要每個類型的很多例子,故而是很重要並且耗時的一步。(我們將從已經標記的數據著手,這使我們處理數據的速度更快。)

2.訓練(Training)的過程是在我們標註的數據(圖像)的基礎上,使用某種工具隨機抓取其中的一些數據(圖像),然後輸入到模型中,再使用模型來猜測每種花的類型並且測試猜測的準確性,重複這一過程直到大部分訓練數據都被使用。最後一批未使用的圖像(測試集)用於檢驗訓練模型的準確性。

3.分類(classification)使用模型分類新圖像。例如,輸入:IMG207.JPG,輸出:雛菊。這是最快,最簡單的一步。

 

訓練和分類

在本教程中,我們將訓練一個圖像分類器來識別不同類型的花朵。 深度學習需要大量的訓練數據,所以我們需要大量的不同種類的花的圖像。值得慶幸的是,已經有人在收集和分類圖像方面做得非常出色,所以我們將使用整理好的數據集,採取一個現有的,完全訓練的圖像分類模型,並重新訓練模型的最後一層,來做我們想要的任務。 這種技術被稱為遷移學習(transfer learning)。

 

我們正在重新訓練的模型叫做Inception v3,這個模型在2015年12月的論文"Rethinking the Inception Architecture for Computer Vision."中首次提出。

模型訓練之前我們不知道如何從雛菊分辨出鬱金香,訓練模型大約花費了20分鐘。 這是深度學習的「學習」部分。

 


第一步,機器感知:在您選擇的平臺上安裝Docker。在許多TensorFlow教程中,安裝Docker都被認為是最合理的選擇。 我也喜歡這種安裝TensorFlow的方法,因為它不安裝一堆依賴項從而保持主機的清潔。

 

安裝Docker後,我們準備啟動一個TensorFlow容器進行訓練和分類。在您的硬碟驅動器上創建一個有2G空閒空間的工作目錄。另外再創建一個名為local的子目錄,並記下該目錄的完整路徑。

docker run -v /path/to/local:/notebooks/local --rm -it --name tensorflow 

tensorflow/tensorflow:nightly /bin/bash

 

下面是該命令的詳細解釋。

-v / path / to / local:/ notebooks / local將剛剛創建的本地目錄裝載到容器中合適的位置。 如果使用RHEL,Fedora或其他支持SELinux的系統,請附加Z到剛才的位置從而允許容器訪問目錄。

--rm告訴Docker在完成後刪除容器。

-它附加我們的輸入和輸出,與容器交互。

--name tensorflow給我們的容器命名tensorflow,而不是sneaky_chowderhead或其他我們隨機選擇的名字。

tensorflow / tensorflow:nightly,從Docker Hub(一個公共圖像庫)運行tensorflow / tensorflow的nightly圖像,而不使用最新的圖像(默認情況下,使用最近構建的/可用的圖像)。

 我們之所以使用nightly圖像而不是最近獲得的圖像,是因為最近獲得的圖像包含一個bug導致TensorBoard出問題,其中TensorBoard又是一個數據可視化工具,我們稍後會介紹。

/ bin / bash表示不要運行Bash shell這個默認命令。

 

在容器內,運行下面的命令下載和檢查訓練數據。

curl -O http://download.tensorflow.org/example_images/flower_photos.tgz

echo 'db6b71d5d3afff90302ee17fd1fefc11d57f243f  flower_photos.tgz' | sha1sum -c

如果你沒有看到flower_photos.tgz:OK的消息,那麼你就沒有得到正確的文件。 如果上述curl或sha1sum步驟失敗,請手動下載並分解本地目錄中的訓練數據tarball(SHA-1 checksum: db6b71d5d3afff90302ee17fd1fefc11d57f243f)。

 

現在把訓練數據放在原處,然後下載並且檢查再訓練的腳本。

mv flower_photos.tgz local/

cd local

curl -O https://raw.githubusercontent.com/tensorflow/tensorflow/10cf65b48e1b2f16eaa82

6d2793cb67207a085d0/tensorflow/examples/image_retraining/retrain.py

echo 'a74361beb4f763dc2d0101cfe87b672ceae6e2f5  retrain.py' | sha1sum -c

為了確認retrain.py的內容是否正確。你應該看到:retrain.py: OK. 當看到這個命令時,說明成功了。

最後,該進行模型學習了! 運行再訓練腳本。

python retrain.py --image_dir flower_photos --output_graph output_graph.pb 

--output_labels output_labels.txt

如果遇到下面這個錯誤,請忽略它:

TypeError: not all arguments converted during string formatting Logged from file

tf_logging.py, line 82.

隨著retrain.py的進行,訓練圖像會自動分成訓練、測試和驗證數據集。

在輸出中,我們希望高的「訓練準確性」和「驗證準確性」,以及低的「交叉熵」。 有關這些術語的詳細解釋,請參閱How to retrain Inception's final layer for new categories。在最新硬體上的訓練需要大約30分鐘。

注意你控制臺輸出的最後一行:

INFO:tensorflow:Final test accuracy = 89.1% (N=340)

這說明我們已經有了一個模型,有近九成的把握猜出給定圖像是五種花型中的哪一種。 由於訓練過程中數據輸入的隨機性,您的準確性可能會有所不同。

 

再加上一個腳本,我們可以將新的花朵圖像添加到模型中,並輸出它的類別。這是圖像分類過程。

將以下內容命名為classify.py並保存在主機的local目錄中:

import tensorflow as tf, sys

image_path = sys.argv[1]
graph_path = 'output_graph.pb'
labels_path = 'output_labels.txt'

# Read in the image_data
image_data = tf.gfile.FastGFile(image_path, 'rb').read()

# Loads label file, strips off carriage return
label_lines = [line.rstrip() for line
in tf.gfile.GFile(labels_path)]

# Unpersists graph from file
with tf.gfile.FastGFile(graph_path, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
_ = tf.import_graph_def(graph_def, name='')

# Feed the image_data as input to the graph and get first prediction
with tf.Session() as sess:
softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
predictions = sess.run(softmax_tensor,
                          {'DecodeJpeg/contents:0': image_data})
# Sort to show labels of first prediction in order of confidence
   top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]
for node_id in top_k:
human_string = label_lines[node_id]
score = predictions[0][node_id]
print('%s (score = %.5f)' % (human_string, score))

為了測試你的圖像,把圖片保存為test.jpg到你的local目錄,並運行python classify.py test.jpg。 輸出結果如下所示:

sunflowers (score = 0.78311)
daisy (score = 0.20722)
dandelion (score = 0.00605)
tulips (score = 0.00289)
roses (score = 0.00073)

 模型表明有78.311%把握確定圖像中的花是向日葵。 較高的分數表示匹配正確的可能性越大。 注意,這裡只能匹配上一個標籤多標籤分類需要使用其他的方法。

更多詳細信息,請查看classify.py的更多解釋。

 

分類器腳本中的圖像加載代碼不能使用了,所以我用了graph_def = tf.GraphDef()代碼來加載圖像。

 

我們使用少量的代碼創造了一個合適的花朵圖像分類器,在筆記本電腦上每秒處理大約五個圖像。

 

在下周發布的這個系列的第二部分中,我們將使用這些信息來訓練一個不同的圖像分類器,然後用TensorBoard來查看分類器內的內容。 如果你想嘗試TensorBoard,那就需要確保docker運行沒有停止。

原文連結:https://opensource.com/article/17/12/tensorflow-image-classification-part-1

相關焦點

  • 基於TensorFlow的深度學習實戰
    毫不誇張得說,TensorFlow的流行讓深度學習門檻變得越來越低,只要你有Python和機器學習基礎,入門和使用神經網絡模型變得非常簡單。TensorFlow簡介如前所述,TensorFlow是一個深度學習庫,使用這一框架,可以用來構建和測試深度神經網絡。深度學習讓我們能夠以極高的準確性構建複雜的應用程式。
  • 【乾貨】快速上手圖像識別:用TensorFlow API實現圖像分類實例
    作者通過TensorFlow API快捷地實現一個命令行圖像分類例子,詳細介紹了如何按步驟下載模型、加載圖像、執行圖像識別命令。你不需要GPU,只要有一臺筆記本就可以按照作者的步驟進行操作,並最終完成圖像識別任務。教程非常方便快捷,讀完本文之後相信你能秒秒鐘實現一個圖像分類任務。專知內容組編輯整理。
  • 谷歌開源圖像分類工具TF-Slim,定義TensorFlow複雜模型
    這不由讓人想起 Facebook 上周開源「從像素級別理解圖像」的計算機視覺系統。不管怎麼說,在計算機視覺方面,強大的工具又多了。下文是官方博文翻譯。在新智元後臺回復「0831」下載論文。今年早些時候,我們發布了圖像分類模型 Inception V3 在 TensorFlow 上的運行案例。
  • TensorFlow圖像分類教程
    (本文使用預先標記好的數據以提高效率)訓練:將標記好的數據(圖像)提供給模型。有一個工具將隨機抓取一批圖像,使用模型猜測每種花的類型,測試猜測的準確性,重複執行,直到使用了大部分訓練數據為止。最後一批未被使用的圖像用於計算該訓練模型的準確性。分類:在新的圖像上使用模型。例如,輸入:IMG207.JPG,輸出:雛菊。這個步驟快速簡單,且衡量的代價小。
  • 圖解機器學習:神經網絡和 TensorFlow 的文本分類
    我們將介紹以下主題:TensorFlow 的工作原理什麼是機器學習模型什麼是神經網絡神經網絡如何學習如何操作數據並將其傳遞給神經網絡如何運行模型並獲得預測結果你可能會學到很多新東西,所以讓我們開始吧!該算法迭代的預測訓練數據,並由老師糾正」 — Jason Brownlee你會把數據分成類,因此它也是一個分類任務。為了創建這個模型,我們將會用到神經網絡。神經網絡神經網絡是一個計算模型(一種描述使用機器語言和數學概念的系統的方式)。這些系統是自主學習和被訓練的,而不是明確編程的。
  • TensorFlow 2keras開發深度學習模型實例:多層感知器(MLP),卷積神經網絡(CNN)和遞歸神經網絡(RNN)
    p=15850在本文中,您將發現如何使用標準深度學習模型(包括多層感知器(MLP),卷積神經網絡(CNN)和遞歸神經網絡(RNN))開發,評估和做出預測。開發多層感知器模型多層感知器模型(簡稱MLP)是標準的全連接神經網絡模型。它由節點層組成,其中每個節點連接到上一層的所有輸出,每個節點的輸出連接到下一層節點的所有輸入。
  • 可能是史上最全的Tensorflow學習資源匯總
    2)從Tensorflow基礎知識到有趣的項目應用:https://github.com/pkmital/tensorflow_tutorials同樣是適合新手的教程,從安裝到項目實戰,教你搭建一個屬於自己的神經網絡。
  • 教程 | Tensorflow keras 極簡神經網絡構建與使用
    Tensorflow雖然是非常流行的深度學習框架,但是tensorflow開發需要了解計算圖與自動微分相關技術,對於完全沒有任何深度學習基礎的人不是一個很好的選擇,而keras完全是為零基礎的人準備,它簡化了tensorflow中計算圖、會話等基本概念,通過Sequential與功能API兩個組件實現網絡搭建,通過簡單的添加一些層就可以快速搭建神經網絡模型。
  • 教程 | TensorFlow從基礎到實戰:一步步教你創建交通標誌分類神經網絡
    近日,數據科學學習平臺 DataCamp 發表了一篇針對 TensorFlow 初學者的教程,從向量和張量的基本概念說起,一步步實現了一個分類交通標誌圖像的神經網絡。機器之心對本教程進行了編譯介紹。深度學習是機器學習的一個子領域,包含了一系列受大腦的結構和功能啟發得到的算法。
  • 【他山之石】利用Tensorflow構建CNN圖像多分類模型及圖像參數、數據維度變化情況實例分析
    地址:https://blog.csdn.net/hurry0808本文以CIFAR-10(https://www.cs.toronto.edu/~kriz/cifar.html)為數據集,基於Tensorflow介紹了CNN(卷積神經網絡)圖像分類模型的構建過程,著重分析了在建模過程中卷積層、池化層、扁平化層、全連接層、輸出層的運算機理,以及經過運算後圖像尺寸、數據維度等參數的變化情況
  • Tensorflow-keras實戰(一)
    目錄理論部分1.Tensorflow-keras簡介2.分類問題、回歸問題、損失函數3.神經網絡、激活函數、批歸一化、Dropout4
  • 圖像分類任務中,Tensorflow 與 Keras 到底哪個更厲害?
    讓我們看看這個問題在圖像分類的實際應用中的答案。在此之前,先介紹Keras和Tensorflow這兩個術語,幫助你在10分鐘內構建強大的圖像分類器。TensorflowTensorflow是開發深度學習模型最常用的庫。它是有史以來最好的庫,在日常實驗中被許多極客選擇。
  • 乾貨 | tensorflow模型導出與OpenCV DNN中使用
    - DNN 是OpenCV中的深度神經網絡模塊,支持基於深度學習模塊前饋網絡運行、實現圖像與視頻場景中的其模型導入與加載的相關API支持以下深度學習框架tensorflow - readNetFromTensorflowcaffe - readNetFromCaffepytorch - readNetFromTorchdarknet
  • 【TensorFlow實戰筆記】 遷移學習實戰--卷積神經網絡CNN-Inception-v3模型
    2.說白了就是別人已經訓練好的強大的模型,你不需要去浪費時間訓練,直接拿過來用,雖然這樣最後的acc(準確率)可能會稍微低一些,但是可以節省大量的時間,還是非常划算的幾個須知的基本概念1.Inception-v3模型 是一個 卷積神經網絡(CNN)模型  (因為最近一直在忙著學,過一段時間會把經典的神經網絡和
  • 使用Keras API在TensorFlow中構建神經網絡的3種方法
    使用MNIST進行圖像分類是一項非常簡單的任務。我們嘗試實現的目標是使用著名的MNIST數據集訓練一個模型來識別手寫數字。MNIST資料庫包含60,000張訓練圖像和10,000張測試圖像,這些圖像是從美國人口普查局員工和美國高中學生那裡拍攝的。如果你想閱讀完整的教程,可以找到我關於圖像分類的單獨教程。使用MNIST數據集在10分鐘內進行圖像分類使用下面的代碼,我們將導入所有層和模型,以免在以後的部分中困擾我們。
  • 模型秒變API只需一行代碼,支持TensorFlow等框架
    每個模型都載入到一個 Docker 容器中,包括相關的 Python 包和處理請求的代碼。模型通過網絡服務,如 Elastic Load Balancing (ELB)、Flask、TensorFlow Serving 和 ONNX Runtime 公開 API 給用戶使用。
  • 【官方教程】TensorFlow在圖像識別中的應用
    但是這些任務對於計算機而言卻是一個大難題:它們之所以看上去簡單,是因為我們的大腦有著超乎想像的能力來理解圖像。在過去幾年裡,機器學習在解決這些難題方面取得了巨大的進步。其中,我們發現一種稱為深度卷積神經網絡的模型在困難的視覺識別任務中取得了理想的效果 —— 達到人類水平,在某些領域甚至超過。
  • TensorFlow2.0學習筆記
    1.3、如何搜索loss最小值1.4、tensorflow自動求導機制1.5、補充知識:二階梯度!二、函數優化實戰2.1、繪製函數圖像2.2、使用梯度下降(重要!)文章目錄一、單層單輸出感知機梯度(屬於二分類問題)1.1、具體公式推導1.2、tensorflow中如何實現單一輸出的感知機二、單層多輸出感知機梯度(屬於多分類問題)2.1、具體公式推導2.2、tensorflow中如何實現多輸出的感知機2.3、鏈式法則(擴展到多層)三、多層感知機梯度
  • 基於tensorflow.js在瀏覽器中設計訓練神經網絡模型的18條建議
    編者按:opencv4nodejs作者Vincent Mühler分享了基於tensorflow.js設計、訓練面向web的神經網絡模型的經驗。
  • TensorFlow應用實戰 | TensorFlow基礎知識
    數據模型  - Tensor(張量)張量是TensorFlow中最重要的結構。計算模型 - Graph(圖)運行模型 - Session(會話)對於數字進行分類。可以分類進行顏色加顏色。我們剛才點擊過的雙擊圖形,節點裡面又有子節點。很像一些程式語言(如 c++) 的namespace, 包含嵌套的關係。卷積神經網絡下的偏差,adam方法(一種優化方法)。