使用Fastai開發和部署圖像分類器應用

做者|KRRAI77@GMAIL.COM
編譯|Flin
來源|analyticsvidhyapython

介紹

Fastai是一個流行的開源庫,用於學習和練習機器學習以及深度學習。傑里米·霍華德(Jeremy Howard)和蕾切爾·托馬斯(Rachel Thomas)創立了 fast.ai, 其目標是使深度學習資源更容易得到。fast.ai中提供的全部詳盡的資源,例如課程,軟件和研究論文都是徹底免費的。git

2020年8月,fastai_v2發佈,該版本有望更快,更靈活地實現深度學習框架。在2020 fastai課程結合了機器學習和深刻學習的核心概念。它還向用戶介紹了模型生產和部署的重要方面。github

在本文中,我將討論fast.ai初學者課程的前三課中介紹的有關創建快速簡單的圖像分類模型的技術。在構建模型的同時,你還將學習如何輕鬆地爲模型開發Web應用程序並將其部署到生產環境。shell

本文將遵循Jeremy在其課程中所採用的自上而下的教學方法。你將首先學習有關訓練圖像分類器的知識。稍後,將解釋有關用於分類的模型的細節。要理解本文,你必須具有Python知識,由於fastai是用Python編寫並基於PyTorch構建的。建議你在Google Colab或Gradient中運行此代碼,由於咱們須要GPU訪問權限,並且fastai能夠輕鬆安裝在這兩個平臺上。瀏覽器

安裝,導入和加載數據集

!pip install -Uqq fastbook
import fastbook
fastbook.setup_book()

from fastbook import *
from fastai.vision.widgets import *

安裝fastai並導入必要的庫。若是你使用的是Colab,則必須提供對Google雲端硬盤的訪問權限以保存文件和圖像。你能夠從Kaggle和Bing圖像搜索等來源下載任何圖像數據集。Fast.ai也有大量的圖像集合。我在本文中使用了來自 https://github.com/ieee8023/c... 的一組胸部X射線圖像。app

path = Path ('/content/gdrive/My Drive/Covid19images')

將數據集位置的路徑保存在Path()對象中。若是使用fast.ai數據集,則可使用如下代碼:框架

path = untar_data(URLs.PETS)/'images'

這將從fastai PETS數據集集合中下載並提取圖像。dom

檢查圖像路徑並顯示數據集中的一些樣本圖像。我已經爲此使用了Python Imaging Library(PIL)。機器學習

path.ls
from PIL import Image
img = Image.open(path'/train/covid/1-s2.0-S1684118220300682-main.pdf-002-a2.png')
print(img.shape)
img.to_thumb(128,128)

在此圖像分類問題中,我將訓練模型,以將X射線圖像分類爲COVID或No COVID類。預處理數據集已放置在單獨的COVID和No COVID文件夾中(來源:ChristianTutivénGálvez)。函數

若是你使用的是fast.ai數據集,請使用如下函數根據寵物的名稱對圖像進行分組:

def is_cat(x): return x[0].isupper()

PETS是貓和狗圖像的集合。Cat圖片標有大寫的第一個字母,所以很容易對其進行分類。

圖像變換

圖像變換是訓練圖像模型的關鍵步驟。它也稱爲數據擴充。爲了不模型過擬合,必須進行圖像變換。可使用多種方法來轉換圖像,例如調整大小,裁剪,壓縮和填充。可是,壓縮和填充會搶奪圖像中的原始信息,並分別添加其餘像素。所以,隨機調整圖像大小會產生良好的效果。

如如下示例所示,在此方法中,在每一個時期都對每一個圖像的隨機區域進行採樣。這使模型能夠了解每一個圖像的更多細節,從而得到更高的準確性。

要記住的另外一個要點是,始終僅變換訓練圖像,而不修改驗證圖像。在fastai庫中,默認狀況下會處理此問題。

item_tfms=Resize(128, ResizeMethod.Squish))
item_tfms=Resize(128, ResizeMethod.Pad, pad_mode='zeros')
item_tfms=RandomResizedCrop(128, min_scale=0.3) - 30% of the image area is zoomed by specifying 0.3

Fastai庫經過aug_transforms函數提供了一組標準的擴充。若是圖像尺寸均勻,能夠批量應用,節省大量訓練時間。

tfms = aug_transforms(do_flip = True, flip_vert = False, mult=2.0)

fastai中的DataLoaders類很是便於存儲用於訓練和驗證模型的各類對象。若是要自定義訓練期間要使用的對象,則能夠將DataBlock類與DataLoaders結合使用。

data= ImageDataLoaders.from_folder(path,train = "train", valid_pct=0.2, item_tfms=Resize(128), batch_tfms=tfms, bs = 30, num_workers = 4)

若是你在圖元文件中定義了圖像標籤,則可使用DataBlock將圖像和標籤分爲兩個不一樣的塊,以下面的代碼片斷所示。將定義的數據塊與數據加載器功能一塊兒使用以訪問圖像。

Data = DataBlock( blocks=(ImageBlock, CategoryBlock), get_items=get_image_files, 
splitter=RandomSplitter(valid_pct=0.2, seed=42), get_y=parent_label, item_tfms=Resize(128))
dls = Data.dataloaders(path)

模型訓練

爲了訓練該圖像數據集,使用了預訓練的CNN模型。這種方法稱爲轉移學習。傑里米(Jeremy)建議使用預先訓練的模型,以加快訓練速度並提升準確性。這尤爲適用於計算機視覺問題。

learn = cnn_learner(data, resnet34, metrics=error_rate)
learn.fine_tune(4)

使用ResNet34體系結構,並根據錯誤率驗證結果。因爲使用預先訓練的模型進行訓練,所以使用微調方法而不是對模型進行擬合。

你能夠運行更多時期,並查看模型的性能。選擇正確的時期數以免過擬合。

你能夠嘗試使用準確性(準確性= 1-錯誤率)來驗證模型性能,而不是使用error_rate。二者都用於驗證模型的輸出。在此示例中,保留了20%的數據用於驗證。所以,該模型將僅對80%的數據進行訓練。這是檢查任何機器學習模型性能的很是關鍵的一步。你也能夠經過更改ResNet層(選項爲1八、50、101和152)來運行此模型。除非你有一個大型數據集將產生準確的結果,不然這可能再次致使過擬合。

驗證模型性能

模型性能能夠經過不一樣的方式進行驗證。一種流行的方法是使用混淆矩陣。矩陣的對角線值指示每種類別的正確預測,而其餘單元格值指示許多錯誤的預測。

interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()

Fastai提供了一個有用的功能,能夠根據最高丟失率查看錯誤的預測。該函數的輸出指示每一個圖像的預測標籤,目標標籤,丟失率和機率值。高几率表示模型具備較高的置信度。它在0到1之間變化。高丟失率表示模型性能有多差。

interp.plot_top_losses(5, nrows=1, figsize = (25,5))

另外一個很棒的Fastai功能, ImageClassifierCleaner(GUI),它能夠經過刪除故障圖像或重命名其標籤來清除故障圖像。這很是有助於數據預處理,從而提升了模型的準確性。

傑里米(Jeremy)建議在對圖像進行基本訓練後再運行此功能,由於這能夠了解數據集中異常的種類。

from fastai.vision.widgets import *
cleaner = ImageClassifierCleaner(learn)
cleaner

保存和部署模型

訓練完模型並對結果滿意後,就能夠部署模型了。要將模型部署到生產環境中,你須要保存模型體系結構以及對其進行訓練的參數。爲此,使用了導出方法。導出的模型另存爲PKL文件,該文件是pickle(Python模塊)建立的文件。

learn.export()

從導出的文件中建立一個推理學習器,該學習器可用於將模型部署爲應用程序。推理學習器一次預測一個新圖像的輸出。預測返回三個參數:預測類別,預測類別的索引以及每一個類別的機率。

learn_inf = load_learner(path/'export.pkl')
learn_inf.predict("img")

(‘noCovid’, tensor(1), tensor([5.4443e-05, 9.9995e-01])) – prediction

有多種方法能夠建立用於部署模型的Web應用程序。最簡單的方法之一是使用做爲GUI組件的IPython小部件在Jupyter notebook中爲應用程序建立所需的對象。

from fastai.vision.widgets import *
btn_upload = widgets.FileUpload()
out_pl = widgets.Output()
lbl_pred = widgets.Label()

設計應用程序元素後,請使用像Web應用程序同樣運行Jupyter notebook的Voila來部署模型。它刪除全部單元格輸入,僅顯示模型輸出。要將notebook做爲VoilàWeb應用程序查看,請將瀏覽器URL中的「notebook」一詞替換爲「 voila/render」。必須在包含受過訓練的模型和IPython小部件的同一notebook中安裝和執行Voila。

!pip install voila
!jupyter serverextension enable voila --sys-prefix

結論

就這樣,你已經使用fastai庫構建並部署了一個很酷的圖像分類器應用程序,只需八個步驟!這還只是我在本文中展現的冰山一角。有更多的fastai組件可用於與NLP和計算機視覺相關的各類深度學習用例,你能夠探索這些組件。

如下是fastai學習資源,以及個人git repo,其中包含本文中解釋的圖像分類器的代碼和圖像。

原文連接:https://www.analyticsvidhya.c...

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方文檔:
http://sklearn123.com/

歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/

相關文章
相關標籤/搜索