作者|KRRAI77@GMAIL.COM
編譯|Flin
來源|analyticsvidhya
介紹
Fastai是一個流行的開源庫,用於學習和練習機器學習以及深度學習。傑里米·霍華德(Jeremy Howard)和蕾切爾·托馬斯(Rachel Thomas)創立了 fast.ai, 其目標是使深度學習資源更容易獲得。fast.ai中提供的所有詳盡的資源,例如課程,軟件和研究論文都是完全免費的。
2020年8月,fastai_v2發布,該版本有望更快,更靈活地實現深度學習框架。在2020 fastai課程結合了機器學習和深入學習的核心概念。它還向用戶介紹了模型生產和部署的重要方面。
在本文中,我將討論fast.ai初學者課程的前三課中介紹的有關建立快速簡單的圖像分類模型的技術。在構建模型的同時,你還將學習如何輕松地為模型開發Web應用程序並將其部署到生產環境。
本文將遵循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/covid-chestxray-dataset 的一組胸部X射線圖像。
path = Path ('/content/gdrive/My Drive/Covid19images')
將數據集位置的路徑保存在Path()對象中。如果使用fast.ai數據集,則可以使用以下代碼:
path = untar_data(URLs.PETS)/'images'
這將從fastai PETS數據集集合中下載並提取圖像。
檢查圖像路徑並顯示數據集中的一些樣本圖像。我已經為此使用了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層(選項為18、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,其中包含本文中解釋的圖像分類器的代碼和圖像。
-
Covid19 X射線圖像分類器:包含本文中討論的完整代碼和數據集
-
涵蓋了fast.ai課程中教授的所有課程
-
涵蓋完整的fastai API文檔
-
Fast.ai社區論壇
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/