1. 程式人生 > >知物由學 | 只要5行代碼,就可以實現AI圖像識別

知物由學 | 只要5行代碼,就可以實現AI圖像識別

pychar efi gin 網絡 屬於 nging 學會 計算機視覺 lan

“知物由學”是網易雲易盾打造的一個品牌欄目,詞語出自漢·王充《論衡·實知》。人,能力有高下之分,學習才知道事物的道理,而後才有智慧,不去求問就不會知道。“知物由學”希望通過一篇篇技術幹貨、趨勢解讀、人物思考和沈澱給你帶來收獲的同時,也希望打開你的眼界,成就不一樣的你。

本文作者:Moses Olafenwa,DeepQuest AI的聯合創始人和CEO;譯者:徐馳騁。

導語:在這篇文章中,我們將簡要介紹人工智能領域,特別是計算機視覺領域中遇到的挑戰,這些挑戰的現有解決方法以及如何快捷地使用這些方法。

人工智能作為一個科學和工程的研究領域已經有數十年的歷史了。它試圖揭開機器和計算機感知世界的奧秘,以此來更好地為人類工作服務。這個研究工作最重要的部分是使得計算機理解我們周圍每天產生的視覺信息(圖像和視頻)。這個使得計算機感知理解視覺信息的領域就是所謂的計算機視覺。

技術分享圖片

在人工智能興起的二十世紀五十年代到八十年代,通過手動給計算機輸入指令來識別圖片中的事物以及需要關註的特征。這種方法使用傳統算法,要求使用者必須識別物體在每一個獨特場景中的特征,並用計算機可以理解的數學模型表示這些特征,因此被稱為專家系統。這涉及到很多繁瑣的工作,因為一個物體的表示方法有成百上千種,獨立存在的不同場景和對象也有數千種甚至數百萬種,找到優化準確的數學模型來表示每個物體和場景以及它們所有可能的特征是一個無止境的工作。

到了二十世紀九十年代,機器學習的概念被提出,它開創了計算機自主識別代替手工輸入指令識別圖像的新時代。就像一個孩子通過學習來認識他/她周圍的環境,我們讓計算機通過算法來自主學習認知事物。也就是說,機器學習開辟了計算機學習認知事物的新道路。

技術分享圖片

隨著性能強大的計算機芯片比如NVIDIA GPU和頂尖的圖像識別深度學習算法的出現,比如Alex Krizhevsky等在2012年創造的AlexNet 算法、Kaeming He等在2015年創造的ResNet 算法、Forrest Landola等在2016年創造的SqueezeNet 算法、Gao Huang等在2016年創造的DenseNet 算法等,讓自定義人工智能模型通過學習一組圖片中的事物進而識別其他同類型事物成為可能。

訓練一個可以識別圖片中事物的人工智能模型涉及到很多應用數學和深度學習庫的專業知識,更別說還要花費大量時間和承受巨大壓力去寫實現這種算法的代碼以及使其和圖像相匹配。這就是我們要解決的問題所在。

我們在AI Common的小組已經建立了一個只要五行代碼就可以訓練人工智能模型來識別任何物體的Python庫,這個python庫叫作ImageAI。建立這個庫是為了讓學生、開發者、研究人員等不同專業水平的人只用五行代碼就能建立起擁有最頂尖的計算機視覺功能的系統和應用。現在,讓我們開始建立你的第一個圖像識別人工智能模型。
技術分享圖片

idenprof//train//chef// 900 images of chefs
idenprof//train//doctor// 900 images of doctors
idenprof//train//engineer// 900 images of engineer
idenprof//train//farmer// 900 images of farmers
idenprof//train//firefighter// 900 images of firefighters
idenprof//train//judge// 900 images of judges
idenprof//train//mechanic// 900 images of mechanics
idenprof//train//pilot// 900 images of pilots
idenprof//train//chef// 900 images of chef
idenprof//train//police// 900 images of police
idenprof//train//waiter// 900 images of waiters
idenprof//test//chef// 200 images of chefs
idenprof//test//doctor// 200 images of doctors
idenprof//test//engineer// 200 images of engineer
idenprof//test//farmer// 200 images of farmers
idenprof//test//firefighter// 200 images of firefighters
idenprof//test//judge// 200 images of judges
idenprof//test//mechanic// 200 images of mechanics
idenprof//test//pilot// 200 images of pilots
idenprof//test//chef// 200 images of chef
idenprof//test//police// 200 images of police
idenprof//test//waiter// 200 images of waiter

既然你已經明白如何準備用於訓練人工智能模型的圖片數據集,我們將繼續指導你使用ImageAI訓練一個人用於識別職業的工智能模型。

首先你必須通過這個鏈接下載IdenProf 數據集壓縮包。你也可以用下面的鏈接查看用於識別職業的人工智能模型的所有細節和樣本結果。

https://github.com/OlafenwaMoses/IdenProf

因為訓練人工智能模型需要高性能計算機系統,我強烈建議你確保用來做模型訓練的計算機擁有NVIDIA GPU。你也可以使用Google Colab(谷歌實驗室)來做這次實驗,它可以提供一個免費的NVIDIA K80 GPU。

接下來你必須安裝ImageAI 和它的依賴模塊。

1)從Python官網下載和安裝Pyhton3

https://python.org

2)使用pip安裝如下依賴包

i. Tensorflow

pip install tensorflow

ii. Numpy

pip install numpy

iii. SciPy

pip install scipy

iv. OpenCV

pip install opencv-python

v. Pillow

pip install pillow

vi. Matplotlib

pip install matplotlib

vii. H5py

pip install h5py

viii. Keras

pip install keras

ix. ImageAI

pip3 installhttps://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.2/imageai-2.0.2-py3-none-any.whl

新建一個python文件,比如“FirstTraining.py”,將IdenProf數據集壓縮包拷貝到你的Python文件所在目錄並解壓。然後拷貝下面的代碼到python文件。(比如FirstTraining.py)

from imageai.Prediction.Custom import ModelTraining

model_trainer = ModelTraining()
model_trainer.setModelTypeAsResNet()
model_trainer.setDataDirectory("idenprof")
model_trainer.trainModel(num_objects=10, num_experiments=200, enhance_data=True, batch_size=32, show_network_summary=True)

就是它!那是你訓練人工智能模型所需的所有代碼。運行前,讓我們來解釋下這些代碼。

在第一行,導入ImageAI的模型訓練類。在第二行,創建一個模型訓練類實例。在第三行,我們設置模型類型為ResNet(這裏有4個模型類型可供選擇,分別為SqueezeNet, ResNet, InceptionV3 和DenseNet)。在第四行,設置數據目錄(數據集目錄)為你解壓的數據集文件夾。然後第五行,我們調用trainModel 函數,並給下列參數賦值:

number_objects :數據集中不同職業的分類數;num_experiments :為了獲得最大準確率,模型學習數據集中所有圖片的次數;Enhance_data (可選) :用來告訴模型訓練器創建數據集中修改好圖片的副本來確保獲得最大準確率;batch_size:直到學習完所有圖片前,訓練器一次學習的圖片數;Show_network_summary (可選):用於顯示你當前使用訓練人工智能模型的類型結構;

現在你可以開始運行Python文件開始訓練了。當訓練開始時,你可以看到如下的結果:

=====================================

Total params: 23,608,202

Trainable params: 23,555,082

Non-trainable params: 53,120


Using Enhanced Data Generation

Found 4000 images belonging to 4 classes.

Found 800 images belonging to 4 classes.

JSON Mapping for the model classes saved to C:\Users\User\PycharmProjects\FirstTraining\idenprof\json\model_class.json

Number of experiments (Epochs) : 200

Epoch 1/100

1/280 [>.............................] - ETA: 52s - loss: 2.3026 - acc: 0.2500

2/280 [>.............................] - ETA: 52s - loss: 2.3026 - acc: 0.2500

3/280 [>.............................] - ETA: 52s - loss: 2.3026 - acc: 0.2500

..............................,
..............................,
..............................,

279/280 [===========================>..] - ETA: 1s - loss: 2.3097 - acc: 0.0625Epoch 00000: saving model to C:\Users\User\PycharmProjects\FirstTraining\idenprof\models\model_ex-000_acc-0.100000.h5

280/280 [==============================] - 51s - loss: 2.3095 - acc: 0.0600 - val_loss: 2.3026 - val_acc: 0.1000

讓我們詳細解釋下以上內容:

1.“JSON Mapping for the model classes saved to C:\Users\User\PycharmProjects\FirstTraining\idenprof\json\model_class.json”這段話表示模型訓練器已經被保存為JSON文件,可以使用自定義圖像預測類來識別其他圖片(後面將對其進一步解釋)。

2.Epoch 1/200這行表示網絡執行了目標值200個訓練的第一個訓練。

3.1/280 [>………………………..]?—?ETA: 52s?—?loss: 2.3026?—?acc: 0.2500 這行表示當前實驗已經訓練的批次。

4.Epoch 00000: saving model to C:\Users\User\PycharmProjects\FirstTraining\idenprof\models\model_ex-000_acc-0.100000.h5這行表示當前訓練後保存的模型。ex_000表示當前階段的實驗,acc0.100000和valacc表示當前實驗後的模型準確率(最高準確率為1.0)。這個結果幫助我們知道哪個圖像預測模型是表現最好的。訓練完模型後,你可以使用準確率最高模型的“CustomImagePrediction”類進行圖片預測。

以防你缺少NVIDIA GPU而無法進行人工智能模型訓練,出於本教程的目標,我們提供了一個用IdenProf數據集訓練好的人工智能模型,你可以用它來進行數據集中圖片的職業預測。

這個模型在訓練61次後已經取得了79%的準確率。點擊此鏈接下載該模型。
同樣,如果你沒有進行模型訓練,通過鏈接下載IdenProf模型的JSON文件。然後,你就可以跟隨如下指令,使用模型進行圖像識別了。

下一步,創建一個Python文件並命名比如FirstCustomImageRecognition.py ,拷貝你下載的人工智能模型或者你訓練的準確率最高的模型,將其復制到你新建Python文件所在目錄。同樣拷貝下載的或者訓練產生的JSON文件,將其復制到新建Python文件所在目錄。

拷貝一個或多個屬於IdenProf數據集中職業種類的圖片到新建Python文件所在目錄。然後拷貝下面的代碼到你的Python文件中。

from imageai.Prediction.Custom import CustomImagePrediction
import os

execution_path = os.getcwd()

prediction = CustomImagePrediction()
prediction.setModelTypeAsResNet()
prediction.setModelPath("idenprof_061-0.7933.h5")
prediction.setJsonPath("idenprof_model_class.json")
prediction.loadModel(num_objects=10)

predictions, probabilities = prediction.predictImage("image.jpg", result_count=3)

for eachPrediction, eachProbability in zip(predictions, probabilities):
print(eachPrediction , " : " , eachProbability)

請看如下的樣本圖片和結果。
技術分享圖片

Waiter(服務員):99.99997615814209
Chef(廚師):1.568847380895022e-05
Judge(法官):1.0255866556008186e-05

是不是很簡單!現在讓我們解釋上面產生這個預測結果的代碼。

第一和第二行代碼分別導入了ImageAI中用於圖像識別的CustomImagePrediction 類(自定義圖像預測類)和os類。第三行代碼創建了一個變量並賦值了一個路徑,該路徑下包含Python文件(比如FirstCustomImageRecognition.py文件)和下載或訓練的ResNet模型文件。

以上,我們用第4行代碼創建了一個ImagePrediction()類實例,然後在第5行代碼通過調用.setModelTypeAsResNet() 來設置預測對象的模型類型為ResNet 。然後在第6行,我們設置模型路徑為拷貝到項目文件夾的人工智能模型路徑(idenprof_061–0.7933.h5)。在第7行,我們設置JSON文件路徑,在第8行加載模型。最後進行圖像預測並打印結果到命令行。

自此,你已經學會了如何使用ImageAI 便捷地訓練你的人工智能模型,用於預測圖片中的對象或對象集合。

你可以在官方GitHub資源庫找到所有使用ImageAI 訓練自定義人工智能模型以及其他包含在ImageAI 中的計算機視覺特性的詳細信息和文檔:https://github.com/OlafenwaMoses/ImageAI

知物由學 | 只要5行代碼,就可以實現AI圖像識別