作者|[email protected]
編譯|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= https://www.cnblogs.com/panchuangai/p/ImageDataLoaders.from_folder(path,train ="train", valid_pct=0.2, item_tfms=Resize(128), batch_tfms=tfms, bs = 30, num_workers = 4)
如果你在圖元檔案中定義了影像標簽,則可以使用DataBlock將影像和標簽分為兩個不同的塊,如下面的代碼片段所示,將定義的資料塊與資料加載器功能一起使用以訪問影像,
Data = https://www.cnblogs.com/panchuangai/p/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射線影像分類器:包含本文中討論的完整代碼和資料集
- https://github.com/RajiRai/FastAI/blob/master/Covid19_prediction_using_X_ray.ipynb
-
涵蓋了fast.ai課程中教授的所有課程
- https://github.com/fastai/fastbook
-
涵蓋完整的fastai API檔案
- https://docs.fast.ai/
-
Fast.ai社區論壇
- https://forums.fast.ai/
原文鏈接:https://www.analyticsvidhya.com/blog/2020/10/develop-and-deploy-an-image-classifier-app-using-fastai/
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/206944.html
標籤:其他
