當前位置:
首頁 > 最新 > TensorFlow實戰——圖像分類神經網路模型

TensorFlow實戰——圖像分類神經網路模型

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的方法,因為它不安裝一堆依賴項從而保持主機的清潔。

  • 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目錄中:

importtensorflowastf,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()forline

intf.gfile.GFile(labels_path)]

# Unpersists graph from file

withtf.gfile.FastGFile(graph_path,"rb")asf:

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

withtf.Session()assess:

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[].argsort()[-len(predictions[]):][::-1]

fornode_idintop_k:

human_string = label_lines[node_id]

score = predictions[][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運行沒有停止。

-END-

專 · 知

人工智慧領域主題知識資料查看獲取【專知薈萃】人工智慧領域26個主題知識資料全集(入門/進階/論文/綜述/視頻/專家等)

同時歡迎各位用戶進行專知投稿,詳情請點擊


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 專知 的精彩文章:

深度學習中的數學理解—教你深度學習背後的故事
你也能與AlphaGo談笑風生了,AlphaGo教學工具上線
首次使用分層強化學習框架進行視頻描述生成,王威廉組最新工作
新AlphaZero出世稱霸棋界,8小時搞定一切棋類!自對弈通用強化學習無師自通!
NIPS 2017論文圖像轉換多樣化,大幅提升pix2pix生成圖像效果

TAG:專知 |