用Keras+TensorFlow,實現ImageNet數據集日常對象的識別

2020-12-13 量子位

王新民編譯自DeepLearningSandbox博客

量子位出品|公眾號QbitAI

在計算機視覺領域裡,有3個最受歡迎且影響非常大的學術競賽:ImageNetILSVRC(大規模視覺識別挑戰賽),PASCALVOC(關於模式分析,統計建模和計算學習的研究)和微軟COCO圖像識別大賽。這些比賽大大地推動了在計算機視覺研究中的多項發明和創新,其中很多都是免費開源的。

博客DeepLearningSandbox作者GregChu打算通過一篇文章,教你用Keras和TensorFlow,實現對ImageNet數據集中日常物體的識別。

量子位翻譯了這篇文章:

你想識別什麼?

看看ILSVRC競賽中包含的物體對象。如果你要研究的物體對象是該列表1001個對象中的一個,運氣真好,可以獲得大量該類別圖像數據!以下是這個數據集包含的部分類別:

椅子

汽車

鍵盤

箱子

嬰兒床

旗杆

iPod播放器

輪船

麵包車

項鍊

降落傘

枕頭

桌子

錢包

球拍

步槍

校車

薩克斯管

足球

襪子

舞臺

火爐

火把

吸塵器

自動售貨機

眼鏡

紅綠燈

菜餚

盤子

西蘭花

紅酒

△表1ImageNetILSVRC的類別摘錄

完整類別列表見:https://gist.github.com/gregchu/134677e041cd78639fea84e3e619415b

如果你研究的物體對象不在該列表中,或者像醫學圖像分析中具有多種差異較大的背景,遇到這些情況該怎麼辦?可以藉助遷移學習(transferlearning)和微調(fine-tuning),我們以後再另外寫文章講。

圖像識別

圖像識別,或者說物體識別是什麼?它回答了一個問題:「這張圖像中描繪了哪幾個物體對象?」如果你研究的是基於圖像內容進行標記,確定盤子上的食物類型,對癌症患者或非癌症患者的醫學圖像進行分類,以及更多的實際應用,那麼就能用到圖像識別。

Keras和TensorFlow

Keras是一個高級神經網絡庫,能夠作為一種簡單好用的抽象層,接入到數值計算庫TensorFlow中。另外,它可以通過其keras.applications模塊獲取在ILSVRC競賽中獲勝的多個卷積網絡模型,如由MicrosoftResearch開發的ResNet50網絡和由GoogleResearch開發的InceptionV3網絡,這一切都是免費和開源的。具體安裝參照以下說明進行操作:

Keras安裝:https://keras.io/#installation

TensorFlow安裝:https://www.tensorflow.org/install/

實現過程

我們的最終目標是編寫一個簡單的python程序,只需要輸入本地圖像文件的路徑或是圖像的URL連結就能實現物體識別。

以下是輸入非洲大象照片的示例:

1.pythonclassify.py--imageAfrican_Bush_Elephant.jpg2.pythonclassify.py--image_urlhttp://i.imgur.com/wpxMwsR.jpg

想了解ResNet50的原理,可以閱讀論文《基於深度殘差網絡的圖像識別》。地址:https://arxiv.org/pdf/1512.03385.pdf

importnumpyasnpfromkeras.preprocessingimportimagefromkeras.applications.resnet50importResNet50,preprocess_input,decode_predictionsmodel=ResNet50(weights='imagenet')

接下來定義一個預測函數:

defpredict(model,img,target_size,top_n=3):"""RunmodelpredictiononimageArgs:model:kerasmodelimg:PILformatimagetarget_size:(width,height)tupletop_n:#oftoppredictionstoreturnReturns:listofpredictedlabelsandtheirprobabilities"""ifimg.size!=target_size:img=img.resize(target_size)x=image.img_to_array(img)x=np.expand_dims(x,axis=0)x=preprocess_input(x)preds=model.predict(x)returndecode_predictions(preds,top=top_n)[0]

在使用ResNet50網絡結構時需要注意,輸入大小target_size必須等於(224,224)。許多CNN網絡結構具有固定的輸入大小,ResNet50正是其中之一,作者將輸入大小定為。

image.img_to_array:將PIL格式的圖像轉換為numpy數組。

np.expand_dims:將我們的(3,224,224)大小的圖像轉換為(1,3,224,224)。因為model.predict函數需要4維數組作為輸入,其中第4維為每批預測圖像的數量。這也就是說,我們可以一次性分類多個圖像。

preprocess_input:使用訓練數據集中的平均通道值對圖像數據進行零值處理,即使得圖像所有點的和為0。這是非常重要的步驟,如果跳過,將大大影響實際預測效果。這個步驟稱為數據歸一化。

:對我們的數據分批處理並返回預測值。

decode_predictions:採用與函數相同的編碼標籤,並從ImageNetILSVRC集返回可讀的標籤。

模塊還提供4種結構:ResNet50、InceptionV3、VGG16、VGG19和XCeption,你可以用其中任何一種替換ResNet50。更多信息可以參考https://keras.io/applications/。

繪圖

我們可以使用matplotlib函數庫將預測結果做成柱狀圖,如下所示:

defplot_preds(image,preds):"""Displaysimageandthetop-npredictedprobabilitiesinabargraphArgs:image:PILimagepreds:listofpredictedlabelsandtheirprobabilities"""#imageplt.imshow(image)plt.axis('off')#bargraphplt.figure()order=list(reversed(range(len(preds))))bar_preds=[pr[2]forprinpreds]labels=(pr[1]forprinpreds)plt.barh(order,bar_preds,alpha=0.5)plt.yticks(order,labels)plt.xlabel('Probability')plt.xlim(0,1.01)plt.tight_layout()plt.show()

主體部分

為了實現以下從網絡中加載圖片的功能:

我們將定義主函數如下:

if__name__=="__main__":a=argparse.ArgumentParser()a.add_argument("--image",help="pathtoimage")a.add_argument("--image_url",help="urltoimage")args=a.parse_args()ifargs.imageisNoneandargs.image_urlisNone:a.print_help()sys.exit(1)ifargs.imageisnotNone:img=Image.open(args.image)print_preds(predict(model,img,target_size))ifargs.image_urlisnotNone:response=requests.get(args.image_url)img=Image.open(BytesIO(response.content))print_preds(predict(model,img,target_size))

其中在寫入image_url功能後,用python中的Requests庫就能很容易地從URL連結中下載圖像。

完工

將上述代碼組合起來,你就創建了一個圖像識別系統。項目的完整程序和示例圖像請查看GitHub連結:

招聘

相關焦點

  • 基於Tensorflow\keras銀行卡識別
    :機器學習算法與Python精研 ,ID:AITop100】,經微信公眾號授權轉載,如需轉載原文作者聯繫來自:GitHub測試環境Ubuntu 18.04python 3.6.7numpy 1.16.4tensorflow-gpu
  • 基於tensorflow框架對手寫字體MNIST數據集的識別
    本文我們利用python語言,通過tensorflow框架對手寫字體MNIST資料庫進行識別。學習每一門語言都有一個「Hello World」程序,而對數字手寫體資料庫MNIST的識別就是深度學習的「Hello World」代碼。下面我們給出詳細的步驟。tensorflow概述tensorflow是用C++語言實現的一個深度學習模塊。
  • TensorFlow(Keras)中的正則化技術及其實現(附代碼)
    缺點是神經網絡更容易過度擬合訓練數據集。過度擬合:此問題涉及算法過於精確地預測在訓練過程中觀察和學習到的模式實例,從而預測向其呈現的模式的新實例。這可能導致機器學習算法無法準確地推廣到看不見的數據。如果訓練數據不能準確表示測試數據的分布,則可能會發生過度擬合。
  • Keras和TensorFlow究竟哪個會更好?
    我會使用基於 TensorFlow 的標準 keras 模塊和 tf.keras 模塊,來實現一個卷積神經網絡(CNN)。然後,基於一個示例數據集,來訓練這些 CNN,然後檢查所得結果,你會發現,Keras 和 TensorFlow 是可以和諧共處的。
  • TensorFlow 2.0正式版官宣!深度集成Keras
    為了提高易用性,TensorFlow 2.0進行了許多修改,如取消了一些被認為是多餘的API,並緊密集成和依賴tf.keras作為中央高級API。TensorFlow與Keras深度學習庫的集成化最初始於2017年2月發布的TensorFlow1.0,本次更新讓二者的集成程度進一步提高。
  • 如何在AMD的GPU上運行TensorFlow?
    /tf:/imagenet'drun rocm/tensorflow:rocm1.8.2-tf1.8-python2 當你使用 ROCm 容器時,以下是一些常用且非常實用的 docker 命令: 一個新的 docker 容器通常不包含元數據存儲庫命令 apt。
  • 使用tensorflow和Keras的初級教程
    https://keras.io/api/losses/用Python開發ANN我們將使用Kaggle的信用數據開發一個使用Jupyter Notebook的欺詐檢測模型。同樣的方法也可以在google colab中實現。
  • Keras結合Keras後端搭建個性化神經網絡模型(不用原生Tensorflow)
    Keras是基於Tensorflow等底層張量處理庫的高級API庫。它幫我們實現了一系列經典的神經網絡層(全連接層、卷積層、循環層等),以及簡潔的迭代模型的接口,讓我們能在模型層面寫代碼,從而不用仔細考慮模型各層張量之間的數據流動。
  • TensorFlow 2.1指南:keras模式、渴望模式和圖形模式(附代碼)
    Keras模式import numpy as npimport tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras.layers import Input, Dense, Flatten, Conv2Dfrom tensorflow.keras
  • 基於RTX2060構建TensorFlow-gpu(keras)學習平臺
    開始菜單運行anaconda navigator檢查是否安裝了notebook(默認有安裝)三、安裝tensorflow/keras在激活的環境中安裝:1. 如果機器上有gpu,則安裝gpu版本,沒有GPU就安裝cpu版。
  • 用TensorFlow和Keras構建卷積神經網絡
    這就是卷積神經網絡學習識別圖像特徵的方法。讓它們適應自己的卷積核權值比任何手動方法都容易得多。手動表達像素之間的關係是難以實現的。難以想像人應該如何徒手釐清像素之間的關係!筆者已經編寫了一個如何使用TensorFlow的KerasAPI來訓練神經網絡的教程,著重介紹了自動編碼器:http://www.datastuff.tech/machine-learning/autoencoder-deep-learning-tensorflow-eager-api-keras/本文將嘗試三種不同的體系結構
  • 機器學習:TensorFlow 2.0中的10個技巧
    ImageDataGenerator這是tensorflow.keras API的最佳特性之一。ImageDataGenerator可以在batching和預處理中實時生成數據集切片和數據增強。生成器允許直接從目錄或dataframes中訪問數據流。關於ImageDataGenerator中的數據增強的一個誤解是,它會將更多數據添加到現有數據集中。
  • 如何利用TensorFlow.js部署簡單的AI版「你畫我猜」圖像識別應用
    這個卷積神經網絡將在 Quick Draw 數據集(https://github.com/googlecreativelab/quickdraw-dataset)上接受訓練。該數據集包含 345 個類別的大約 5 千萬張手繪圖像。
  • TensorFlow 1.9.0-rc0 升級 tf.keras 至 Keras 2.1.6 API
    該版本帶來了不少改進和新特性:Update tf.keras to the Keras 2.1.6 API.tfe.Network is deprecated. Please inherit from tf.keras.Model.
  • 深度解讀TensorFlow,了解它的最新發展!
    Tensorboard是tensorflow內置的一個可視化工具,它通過將tensorflow程序輸出的日誌文件的信息可視化,使得tensorflow程序的理解、調試和優化更加簡單高效。Tensorboard的可視化依賴於tensorflow程序運行輸出的日誌文件,因而tensorboard和tensorflow程序在不同的進程中運行。
  • 只需5分鐘,教你完成華為雲TensorFlow環境搭建
    目前,TensorFlow可以在多個雲平臺上部署運行,但仍存在軟體的依賴與管理問題,而利用Docker技術具有的快速部署與可移植等優勢,可以實現TensorFlow的虛擬化異構,解決TensorFlow環境依賴的問題,並為科研人員及工程師提供便捷的開發環境,具有現實的應用意義。
  • TensorFlow 2入門指南,初學者必備!
    我們將使用非常著名的數據集IRIS數據集探索深度學習的世界。廢話不多說,我們直接看看代碼。tensorflow as tffrom tensorflow.keras.layers import Densefrom tensorflow.keras.models import Sequential在這裡,我們從tensorflow
  • tensorflow2.4的重大改進
    即tensorflow::tstring/TF_TString的連續數組。C-API函數TF_StringDecode,TF_StringEncode和TF_StringEncodedSize不再相關,已被刪除;請參閱core/platform/ctstring.hC中的字符串訪問/修改。
  • Keras R語言接口正式發布,同時公開20個完整示例
    同時期,tensorflow作為下一代機器學習平臺,非常靈活,很適合產品部署。毫不驚訝地說,Keras和tensorflow正在逐漸超過其他深度學習框架。現在,你不需要糾結該選tensorflow或是Keras了。Keras的默認後端支持通過tensorflow工作流,實現tensorflow和Keras的無縫集成。
  • 這裡有一份TensorFlow2.0中文教程
    導入 tf.kerastensorflow2 推薦使用 keras 構建網絡,常見的神經網絡都包含在 keras.layer 中 (最新的 tf.keras 的版本可能和 keras 不同)import tensorflow as tffrom tensorflow.keras import layersprint(tf.