本文主要演示了如何使用Inception v3模型進行圖像識別。
01 - 簡單線性模型 | 02 - 卷積神經網絡 | 03 - PrettyTensor | 04 - 保存& 恢復
05 - 集成學習 | 06 - CIFAR 10html
by Magnus Erik Hvass Pedersen / GitHub / Videos on YouTube
中文翻譯 thrillerist / Githubpython
若有轉載,請附上本文連接。git
這篇教程演示瞭如何用一個預訓練好的深度神經網絡Inception v3來進行圖像分類。github
Inception v3模型在一臺配有 8 Tesla K40 GPUs,大概價值$30,000的野獸級計算機上訓練了幾個星期,所以不可能在一臺普通的PC上訓練。咱們將會下載預訓練好的Inception模型,而後用它來作圖像分類。bash
Inception v3模型大約有2500萬個參數,分類一張圖像就用了50億的乘加指令。在一臺沒有GPU的現代PC上,分類一張圖像轉眼就能完成。網絡
這篇教程隱藏了TensorFlow代碼,所以可能不要求不少的TensorFlow經驗,固然從以前的教程中學到一些對TensorFlow的基本理解仍是頗有幫助的,特別是在你想學習inception.py
文件中的實現細節時。session
下面的流程圖顯示了Inception v3模型中的數據流向,這是一個帶有許多層的,有着複雜結構的卷積神經網絡。這篇論文裏有Inception模型如何構造,以及爲何這麼設計的更多細節。但做者也認可他們並不徹底明白模型的工做原理。app
注意,Inception模型有兩個softmax輸出。一個是在訓練神經網絡時使用,另外一個是訓練結束以後,在圖像分類時使用,即推斷階段(inference)。less
上週剛剛分佈了新的模型, 它比Inception v3更復雜,也獲得了更好的分類準確率。ssh
from IPython.display import Image, display
Image('images/07_inception_flowchart.png')複製代碼
%matplotlib inline
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import os
# Functions and classes for loading and using the Inception model.
import inception複製代碼
使用Python3.5.2(Anaconda)開發,TensorFlow版本是:
tf.__version__複製代碼
'0.10.0rc0'
從網上下載Inception模型。這是你保存數據文件的默認文件夾。若是文件夾不存在就自動建立。
# inception.data_dir = 'inception/'複製代碼
若是文件夾中不存在Inception模型,就自動下載。
它有85MB。
inception.maybe_download()複製代碼
Downloading Inception v3 Model ...
Data has apparently already been downloaded and unpacked.
載入模型,爲圖像分類作準備。
注意這些warning信息,之後可能會致使程序運行失敗。
model = inception.Inception()複製代碼
/home/magnus/anaconda3/envs/tensorflow/lib/python3.5/site-packages/tensorflow/python/ops/array_ops.py:1811: VisibleDeprecationWarning: converting an array with ndim > 0 to an index will result in an error in the future
result_shape.insert(dim, 1)
這是一個簡單的封裝函數,它能夠展現圖像,而後用Inception模型進行分類,最終打印出分類評分。
def classify(image_path):
# Display the image.
display(Image(image_path))
# Use the Inception model to classify the image.
pred = model.classify(image_path=image_path)
# Print the scores and names for the top-10 predictions.
model.print_scores(pred=pred, k=10, only_first_name=True)複製代碼
Inception數據文件中包含了這張熊貓圖像。Inception模型至關肯定這張圖片上展現了熊貓,分類評分達到了89.23%,第二高的表明大狐猴的分數只有0.86%,這是另一種外來動物。
image_path = os.path.join(inception.data_dir, 'cropped_panda.jpg')
classify(image_path)複製代碼
![]()
89.23% : giant panda
0.86% : indri
0.26% : lesser panda
0.14% : custard apple
0.11% : earthstar
0.08% : sea urchin
0.05% : forklift
0.05% : soccer ball
0.05% : go-kart
0.05% : digital watch
Inception模型的輸出是Softmax函數,這在以前教程中的神經網絡中也有用到。
softmax輸出有時也稱爲機率分佈(probabilities),由於它介於零到一之間,而後相加爲一,與機率分佈相同。但它們並非傳統語義上的機率分佈,由於並非由重複試驗得來。
將神經網絡的輸出值稱爲分類評分或排名可能會更好,由於結果顯示了神經網絡認爲輸入圖像是每一個可能分類的強度。
在上面的熊貓樣本中, Inception模型給熊貓類型很高的分數—89.23%,同時其它999種類別的分數都在1%如下。這表示Inception模型十分確信圖像展現了一隻熊貓,而剩下1%如下的應該視爲噪聲。好比,排名第十高的分數是0.05%,表明電子手錶,但它更多是因爲神經網絡的不精準而不是暗示着圖像看起來有點像電子手錶。
有時Inception模型不肯定圖像屬於哪個分類,所以結果中並無一個特別高的分數。下面會展現這種樣本。
Inception模型十分肯定(評分97.30%)這張圖像展現了一種叫金剛鸚鵡的鸚鵡。
classify(image_path="images/parrot.jpg")複製代碼
![]()
97.30% : macaw
0.07% : African grey
0.07% : toucan
0.05% : jacamar
0.04% : bee eater
0.04% : lorikeet
0.02% : sulphur-crested cockatoo
0.02% : jay
0.01% : kite
0.01% : sandbar
Inception使用於299 x 299像素的輸入圖像。上面的鸚鵡圖像其實是320像素寬、785像素高的,所以它將由Inception模型自動縮放。
如今咱們想看看被Inception模型調整過的圖像。
首先咱們實現一個幫助函數,用來從Inception模型內部獲取調整過的圖像。
def plot_resized_image(image_path):
# Get the resized image from the Inception model.
resized_image = model.get_resized_image(image_path=image_path)
# Plot the image.
plt.imshow(resized_image, interpolation='nearest')
# Ensure that the plot is shown.
plt.show()複製代碼
如今畫出調整過的鸚鵡圖。這是Inception模型中神經網絡的真正輸入圖像。咱們能夠看到它被壓縮成正方形,而且分辨率下降了,所以圖像看起來更像素化和鋸齒狀。
這種狀況下,圖像仍然清晰地展現了一隻鸚鵡,但一些圖像通過(模型內)原生的調整後會變得扭曲,所以你可能會想本身調整圖像大小,再輸入到Inception模型。
plot_resized_image(image_path="images/parrot.jpg")複製代碼
鸚鵡圖像被手動裁剪成299 x 299像素大小,而後輸入到Inception模型中,這時(模型)仍是很確信(評分97.38%)輸入圖展現了一隻鸚鵡(金剛鸚鵡)。
classify(image_path="images/parrot_cropped1.jpg")複製代碼
![]()
97.38% : macaw
0.09% : African grey
0.03% : sulphur-crested cockatoo
0.02% : toucan
0.02% : reflex camera
0.01% : comic book
0.01% : backpack
0.01% : bib
0.01% : vulture
0.01% : lens cap
這是鸚鵡圖的另外一張裁剪圖像,此次展現了鸚鵡的軀幹,不包含頭部和尾巴。Inception模型仍然很肯定(評分93.94%)這是一隻金剛鸚鵡。
classify(image_path="images/parrot_cropped2.jpg")複製代碼
![]()
93.94% : macaw
0.77% : toucan
0.55% : African grey
0.13% : jacamar
0.12% : bee eater
0.11% : sulphur-crested cockatoo
0.10% : magpie
0.09% : jay
0.07% : lorikeet
0.05% : hornbill
此次的裁剪圖像只顯示了鸚鵡的尾巴。如今Inception模型至關困惑,認爲圖像可能顯示的是一隻鶲鴷(評分26.11%),這是另外一種外來鳥,也多是一隻草蜢(評分10.61%)。
Inception模型還認爲圖像有多是一隻鋼筆(評分2%)。但這是一個很低的分數,應該解釋成不可靠的噪聲。
classify(image_path="images/parrot_cropped3.jpg")複製代碼
26.11% : jacamar
10.61% : grasshopper
4.05% : chime
2.24% : bulbul
2.00% : fountain pen
1.60% : leafhopper
1.26% : cricket
1.25% : kite
1.13% : macaw
0.80% : torch複製代碼
對Inception模型來講,最好的輸入圖像方式是先將圖像填充成正方形,而後調整至299 x 299像素,在這樣的鸚鵡樣本中,模型正確分類而且評分達到96.78%。
classify(image_path="images/parrot_padded.jpg")複製代碼
![]()
96.78% : macaw
0.06% : toucan
0.06% : African grey
0.05% : bee eater
0.04% : sulphur-crested cockatoo
0.03% : king penguin
0.03% : jacamar
0.03% : lorikeet
0.01% : kite
0.01% : anemone fish
這張圖像展現了Elon Musk——活着的傳奇,超級-書呆子-英雄。但Inception模型對圖像顯示的東西很困惑,它預測圖像多是一件運動衫(評分19.73%),或者是一件阿拉伯長袍(評分16.82)。它也認爲圖像多是一個乒乓球(3.05%)或一個棒球(評分1.86%)。Inception模型很困惑,而且分類評分不可靠。
classify(image_path="images/elon_musk.jpg")複製代碼
![]()
19.73% : sweatshirt
16.82% : abaya
4.17% : suit
3.46% : trench coat
3.05% : ping-pong ball
1.92% : cellular telephone
1.86% : baseball
1.77% : jersey
1.54% : kimono
1.43% : water bottle
若是咱們使用100 x 100像素的Elon Mask圖像,這時Inception模型認爲它多是一件運動衫(評分17.85%), 或是一隻牛仔靴(評分16.36%)。如今Inception模型作出了一些不一樣的預測,但仍然很困惑。
classify(image_path="images/elon_musk_100x100.jpg")複製代碼
![]()
17.85% : sweatshirt
16.36% : cowboy boot
10.68% : balance beam
8.87% : abaya
5.36% : suit
4.57% : Loafer
2.94% : trench coat
2.65% : maillot
1.87% : jersey
1.42% : unicycle
Inception模型自動將圖像從100 x 100放大至299 x 299像素,以下所示。看看它是多麼像素化和鋸齒狀,儘管人類能夠輕易地看出這是一張雙臂交叉的男人的圖像。
plot_resized_image(image_path="images/elon_musk_100x100.jpg")複製代碼
這張圖像展現了在1971版電影《查理和巧克力工廠》中演員Gene Wilder飾演的角色。Inception模型很肯定圖像顯示了一個蝴蝶領結(評分97.22%),儘管這是對的,但人類極可能說這張圖片展現的是一我的。
緣由多是Inception模型在訓練時將戴蝴蝶結的人的圖像分類成蝴蝶領結而不是一我的。所以,或許類別名稱應該改爲「戴蝴蝶領結的人」而不僅是「蝴蝶領結」。
classify(image_path="images/willy_wonka_old.jpg")複製代碼
![]()
97.22% : bow tie
0.92% : cowboy hat
0.21% : sombrero
0.09% : suit
0.06% : bolo tie
0.05% : Windsor tie
0.04% : cornet
0.03% : flute
0.02% : banjo
0.02% : revolver
這張圖像展現了在2005版電影《查理和巧克力工廠》中演員Johnny Depp飾演的角色。Inception模型認爲圖像是「太陽鏡(sunglasses)」(評分31.48%)或「太陽鏡(sunglass)」(評分18.77)。實際上,第一個類別的全名是「太陽鏡,深色眼鏡,墨鏡」。出於某些緣由,Inception模型被訓練成能夠識別兩種類似的眼鏡。再一次,圖像顯示了太陽鏡,這個結果是對的,但人類極可能會說圖像展現的是一我的。
classify(image_path="images/willy_wonka_new.jpg")複製代碼
![]()
31.48% : sunglasses
18.77% : sunglass
1.55% : velvet
1.02% : wig
0.77% : cowboy hat
0.69% : seat belt
0.67% : sombrero
0.62% : jean
0.46% : poncho
0.43% : jersey
如今咱們已經用TensorFlow完成了任務,關閉session,釋放資源。注意,TensorFlow-session是在模型內部的,所以咱們經過模型來關閉它。
# This has been commented out in case you want to modify and experiment
# with the Notebook without having to restart it.
# model.close()複製代碼
本教程說明了如何使用預訓練的Inception v3模型。它在一臺野獸級電腦上花了好幾周才訓練好。但咱們能夠從網上下載完成的模型,而後在一臺普通PC上用它來作圖像分類。
不幸的是,Inception模型對識別人物頗有問題。這多是所使用訓練集的緣由。新版的Inception模型也已經發布了,但它可能也是在一樣的訓練集上訓練,對於識別人物仍是有問題。但願將來的模型會訓練來識別常見的物體,好比人類。
這篇教程中咱們在inception.py
文件中隱藏了TensorFlow的實現細節,由於它有點凌亂,咱們可能在以後的教程中仍然會複用這個。但願TensorFlow的開發者會標準化、簡單化API,使得更簡單地載入這些預訓練模型,這樣,每一個人只須要幾行代碼就能使用一個強大的圖像分類器。
下面是一些可能會讓你提高TensorFlow技能的一些建議練習。爲了學習如何更合適地使用TensorFlow,實踐經驗是很重要的。
在你對這個Notebook進行改變以前,可能須要先備份一下。
inception.py
文件。