天天看點

圖像分類模型訓練實踐

作者:DataFunTalk

導讀 圖像分類模型是最簡單的,也是最基礎的計算機視覺任務,應用非常廣泛。本文将介紹手把手零基礎訓練圖像分類模型的實踐過程。文章主要介紹如何在标注好的資料集基礎上進行微調,使模型能夠在新的資料上重新适配一個新的分類任務。

閱讀完本文,你将了解如何使用 ViT 模型在 14 種花朵資料集上進行分類的微調訓練,進而了解大部分分類任務的微調過程。

分享嘉賓|譚偉 阿裡巴巴 算法專家

編輯整理|雪梨 古聯

出品社群|DataFun

首先,打開 ModelScope 的官網(https://www.modelscope.cn/home),進入模型庫。

圖像分類模型訓練實踐
圖像分類模型訓練實踐

模型庫頁面可以看到有很多不同的模型,我們選擇:計算機視覺 - 視覺分類 – 通用分類。模型庫中有很多通用模型,這些模型都比較經典,有些是目前比較火的一些開源模型,大家都可以在上面進行嘗試。本文主要以 ViT 圖像分類-中文-日常物品這個模型為示例,示範如何進行分類任務的微調。

圖像分類模型訓練實踐

首先打開計算機視覺—ViT 圖像分類-中文-日常物品模型。因為之後要用 Notebook 進行訓練,是以需要登入一下。新使用者注冊會送 100 個小時的 GPU 算力。

圖像分類模型訓練實踐

任務中首先介紹了整個模型的基本情況:有關于日常物體分類模型的概要介紹,模型的簡單描述,以及推理的示例代碼。

圖像分類模型訓練實踐

示例代碼的使用十分簡單,除了引用依賴包之外,隻需兩行代碼就可以調用模型進行分類任務的測試。頁面右上方也有線上模型的體驗,可視化了推理的過程。可以選擇自己上傳圖檔或者用示例圖檔進行測試,點選執行測試就可以看到結果。剛開始執行的時候會稍微有些慢,因為要下載下傳模型,之後就會快一些。

圖像分類模型訓練實踐

此外,還有一些模型資料的簡介、模型訓練流程、資料評估及結果。

圖像分類模型訓練實踐

接下來是模型訓練的示例代碼,也是本文的重點。示例代碼中用的是一個稍小的具有100 個分類的資料集 mini_imagenet100 進行 fine-tune 訓練的示例,對示範來說還是比較大的。是以我們會在這個代碼的基礎上進行修改,來适配更小的資料集,稍後會對模型中的參數進行更為詳細的講解。

圖像分類模型訓練實踐

這裡是模型評估的示例代碼,展示模型如何對資料集中的校驗集進行評估,稍後也會進行詳細的講解。這就是整個任務頁面的大緻内容。

圖像分類模型訓練實踐

上面的線上體驗已經得到了一個測試結果,這裡顯示了 top5 的結果,排名第一的是柴犬,是以這張圖檔的分類結果就是柴犬。

圖像分類模型訓練實踐

為了友善實驗,我們首先把 Notebook 打開。Notebook 有兩種選擇,一種是 PAI-DSW,一種是阿裡雲彈性計算。我們選擇第二種,用免費的 GPU 資源進行計算。選擇後點選快速啟動。這個啟動會稍微久一些,可以讓它在背景啟動。

接下來我們來講解模型的一些基本情況。ViT 模型,是自然語言領域中的 Transformer 模型在計算機視覺上的一個開山之作。ModelScope 上的模型采用的是基于 Transformer 的 ViT-Base 結構,并在此基礎上加入了蒸餾 token 進行知識蒸餾,也就是采用了 DeiT 的知識蒸餾的訓練方式。

我們的訓練資料是從海量的開源資料中進行搜尋和整理的,保留了出現頻率較高的一些常見的物體,大概包含 1300 多種日常物品,比如有一些常見的動物、植物、家具和食品等。目前模型可以識别 1300 多種日常物品,大家可以通過模型連結檢視開源代碼,還可以通過論文的連結去詳細檢視論文。

圖像分類模型訓練實踐

大家還可以在我們官網的文檔中心 – 模型詳解 – 計算機視覺模型中找到我們對應的模型檔案,這裡有非常詳細的介紹,包括論文的詳解等。這是我們今天要用來做實驗的 ViT 模型的簡介,在此不做詳細介紹。

圖像分類模型訓練實踐

另外關于我們要用的資料集,可以通過點選上方菜單欄中的資料集-圖像-圖像分類,就會看到很多可以用來做實驗的資料集。

圖像分類模型訓練實踐

這裡我們用的資料集是花朵分類資料集。這個資料集包含了 14 種類型的花朵圖像,如風吟草、蒲公英、菊花等常見的花朵類型。整個資料隻有 200MB,比較小,适合我們線上微調過程的示範:用 14 種花朵的小資料集去重新 fine-tune 剛才介紹的 ViT 模型,使模型能夠識别這 14 種花朵。

圖像分類模型訓練實踐

資料集的格式主要分為訓練集和驗證集,這裡有相關的描述:是按照 train 和 valid 檔案夾進行分類,共有 2 個檔案夾,同類别标簽的圖檔在同一個檔案夾下,圖檔格式都為 JPG 格式,還有一個标簽檔案是 classname.txt。

圖像分類模型訓練實踐

在資料預覽裡面可以看到資料的标注情況。比如在校驗集中,左邊是資料圖檔,右邊是對應的标簽。訓練集也是一樣的。

圖像分類模型訓練實踐

這是整個資料集的檔案,其中包含了 CSV 格式的校驗集标簽檔案、訓練集的标簽檔案、還有包含了以資料集名為檔案名的 json 檔案 Flowers14.json。

圖像分類模型訓練實踐

Flowers14.json 檔案裡面描述了資料之間的關系,比如在訓練集中,meta 就是标簽檔案,file 就是用來訓練的圖檔的壓縮檔案,校驗集也是一樣。classname.txt 檔案中将标簽對應的類别名稱按順序列了出來,這就是類别标簽對應的類别名稱。

圖像分類模型訓練實踐

在資料檔案裡面是資料的壓縮檔案。

圖像分類模型訓練實踐

資料集的加載也非常簡單,一行代碼即可。我們引入依賴包之後,load 資料集。加載資料集需要填入訓練集名稱和命名空間,就是對應資料名稱下面的小字部分 。

圖像分類模型訓練實踐

Flowers14 對應資料集名稱,tany0699 對應命名空間。加載訓練集時 split 選擇 train,加載校驗集時 split 選擇 validation。這就是資料集的一些基本情況。

回到模型訓練頁面,打開之前啟動的 Notebook。

跳轉後需要登入 ModelScope 和阿裡雲綁定的賬号。

圖像分類模型訓練實踐

打開一個 Python3 的檔案,可以選擇對檔案進行重命名,我們主要是為了對新的資料集重新進行訓練。回到剛才的模型界面,把 fine-tune 的示例代碼拷貝過來。

圖像分類模型訓練實踐

代碼拷貝過來之後,我們對這些參數進行修改。首先引入 ModelScope 的依賴包,如果大家本地有 GPU 的話,也可以在本地做訓練。在本地訓練要預先安裝好 ModelScope的安裝包,官方文檔有介紹如何安裝。

我們這裡通過線上免費的 notebook 來進行訓練。首先 model_id 對應的是模型在 Model Hub 上的位址,對于我們這個任務來說是沒有變化的。之後是加載資料集,分别是加載訓練集和校驗集,資料加載方式之前已經介紹過了。将我們新的資料集的資料加載方式的示例代碼拷貝過來替換掉就可以。

接下來是修改模型的配置檔案。配置檔案中會包含多種配置内容,主要需要修改的隻有幾項。首先是 batch-size 的大小,主要根據訓練資料的大小和 GPU 顯存的大小來設定;第二行是加載資料集的 worker 數量;最大訓練的 epoch 數,就是對整個資料集疊代的次數,這裡設定為 1,主要是因為時間關系,隻訓練一次疊代。下面三行是分類數目,要把它改為資料集對應的分類數目,是以這裡都改為 14。學習率這裡,因為我們隻疊代一次,為了更好更快的收斂,可以把它改的稍微大一點。大家可以根據自己實際的訓練次數來修改這個超參。預訓練次數也設定為 1;評估名額,對于分類任務來說,我們現在用的是精度來評估,精度中有 top1 和 top5,這兩個名額都要重新進行評估。

接下來建構訓練器。訓練器是用 build_trainer 的接口;name 是分類的類型,這裡是 image_classification,是圖像分類的意思。我們需要改的主要是參數 kwargs。參數主要有 model_id,就是之前提到的模型位址;word_dir,工作目錄,就是訓練後産生的模型權重儲存的目錄。示例中用的是一個臨時目錄,這裡可以改為真實目錄,比如改為 vit_base_flower;train_dataset 設定的是加載後的訓練集;eval_dataset 設定的是加載後的驗證集;cfg_modify_fn 是配置檔案的回調函數;model_revision 模型的版本,可以對應到模型檔案(master 按鈕)裡面,可以随意選一個版本,比如 1.0.2,這樣模型的訓練器就建構好了。

之後使用 trainer.train() 就可以進行訓練。訓練完成後即可使用 trainer.evaluate() 進行評估,評估後将結果列印出來。然後按下 shift + enter 鍵運作代碼,讓模型開始訓練。

圖像分類模型訓練實踐

剛開始會比較慢,因為需要先下載下傳資料集和模型預訓練的權重。

圖像分類模型訓練實踐

再來看一下模型檔案。模型檔案也比較簡單,主要有兩部分,一部分是預訓練的權重,名字是固定的(pytorch_model.pt);另一部分就是整個模型的配置檔案(configuration.json),主要是定義整個模型如何配置,如何訓練和如何評估的。

圖像分類模型訓練實踐

配置檔案中,因為是基于 PyTorch 進行訓練,是以架構保持不變。任務是圖像分類,Pipeline 的名稱也保持不變,定義模型類型保持不變。mm_model 是相容 mm classification 的模型的配置檔案,backbone 定義的是 VisionTransformer,結構是 deit-base,輸入圖像大小是 224,patch_size 大小是16 等等這些參數都保持不變。Head 是VisionTransformerClsHead,num_classes 類别數預設的是 1296,是日常物品的分類數目,這裡我們需要改為 14,因為新的資料集分類是 14 種。Loss 用的是 LabelSmoothLoss。還有一些初始化的參數都可以進行修改。訓練使用的增強方式是 Mixup 和 CutMix,這些參數也可以進行設定。

圖像分類模型訓練實踐

回到訓練過程,log 顯示了 epoch 數,目前學習率,還有預計剩餘時間,用的顯存大小和 loss 的情況都可以列印出來。

圖像分類模型訓練實踐

回到配置檔案。

預處理器中的類型不變;訓練過程,如加載圖檔,随機縮放和裁剪尺寸 224,随機翻轉和資料增強等都可以在檔案中進行設定,最後是歸一化;校驗集同理,裁剪圖檔,resize 到 256,然後做一個 crop 到 224,最後進行歸一化。

訓練過程中用到的 batch_size 的數目,worker 的數目,最大疊代次數,以及評估的時候每間隔幾次疊代就進行評估(這裡是 1 次),使用 accuracy 進行評估,間隔 1 次疊代儲存一次模型權重,最多儲存權重數量 20,優化器裡的設定,包括優化類型,學習率等參數都可以在檔案裡進行修改。學習率的政策可以用 CosineAnnealing,以及一些相關參數也可以進行定義。最後是評估的配置也可以進行設定,比如評估時 batch_size 的大小,worker 數目,用的 accuracy 的方式進行評估,以及選擇是 top1 還是 top5 的評估方式。

圖像分類模型訓練實踐

訓練已經完成,可以看到結果已經列印出來:top1 的精度是 87.75,top5的精度是 98.97。訓練一次,大概需要 3 分鐘左右。

圖像分類模型訓練實踐

剛才訓練的權重已經儲存在了工作目錄中。目錄下有兩個 log 檔案,是訓練過程的 log,和剛才列印的結果完全一樣。有一個模型的配置檔案,和剛才講過的配置檔案是一模一樣的。比如我們剛才改過的類别數,現在已經改為了 14,因為剛才用的是回調函數,直接修改參數也被儲存到了檔案中。還有每個 epoch 儲存的權重,現在隻訓練了一次,是以隻有一個 epoch_1。還有最後儲存的權重的軟連接配接,以及一個在訓練過程中,儲存在校驗集上精度最好的模型權重。

圖像分類模型訓練實踐

模型訓練好之後,需要對它進行評估。可以評估訓練好的模型在校驗集上的性能。我們可以把模型評估的示例代碼直接拷貝過來,同樣的,資料集可以修改成剛才實驗加載過的校驗集,這是對新的校驗集的評估。之前的 model_id 是 Model Hub中的模型,現在改為訓練儲存的工作目錄。但要注意,模型目錄下的模型權重檔案名稱是固定的 pytorch_model.pt,是以需要将權重檔案重命名為 pytorch_model.pt。工作目錄可以用臨時工作目錄,校驗集就是需要評估的資料集。訓練器建構完成後,調用 trainer.evaluate() 進行評估,評估後将結果列印出來。按下 shift + enter 鍵運作代碼,開始評估。

圖像分類模型訓練實踐

評估過程比較快,從列印出來的結果可以看到 top1 的結果是 87.75,top5 是 98.97,和訓練結果完全相同。

圖像分類模型訓練實踐

模型訓練好後,可以進行推理,推理代碼可以直接從模型頁面拷貝過來。

要用訓練好的模型,首先要加載依賴包,然後用 pipeline 建構推理的 pipeline。這裡輸入的任務類型保持不變,模型改為剛才訓練好的模型路徑:vit_base_flower。圖檔位址可以是一個可通路的 url,也可以是一個本地的圖檔路徑。現在可以随便下載下傳一張圖檔,比如向日葵的圖檔,命名為 test.webp。本地下載下傳好之後,可以直接将圖檔拖進界面中進行上傳,然後将圖檔名稱拷貝過來。将圖檔位址改為本地路徑 ./test.webp,就可以對這張圖檔進行分類測試了。

圖像分類模型訓練實踐

推理結果中顯示 top5 的結果,排第一的是向日葵,那麼對這張圖檔分類預測的結果就是向日葵。但是對應的機率都很低,說明訓練不是特别充分。因為隻訓練了一次疊代,是以還有很大的改進空間。大家可以去調整超參,嘗試訓練,比如最大 epoch 數可以調大一些,學習率可以調小一點,多訓練一些可能會有更好的效果。

圖像分類模型訓練實踐

整個分類模型的預訓練過程就到此結束了。

ModelScope 中還有很多其他的分類模型,其他模型的訓練流程和今天訓練的任務流程是差不多的。比如 ViT 圖像分類-通用模型和剛才訓練的模型是完全一樣的,隻是預訓練的資料集是不一樣的。日常物品模型用的是我們自建的資料集,通用模型是用的公開的 ImageNet 1k 的資料集。除此以外,還有比較實用的實時分類 NextViT 模型,比較适用于工業,因為速度快,分類效果也不錯。其他模型,比如垃圾分類,大家也可以看一下。還有最近比較火的 BEiT,是 v2 版本,大家也可以 fine-tune 一下。每個任務都會有模型簡介、模型描述、以及一些論文、開源代碼的連結,還有推理代碼、微調訓練代碼以及評估代碼,可以直接複制直接後微調和推理。

圖像分類的微調訓練教程就到此為止,大家如果感興趣,可以到 ModelScope 官網去進一步了解和嘗試。

今天的分享就到這裡,謝謝大家。

圖像分類模型訓練實踐

▌2023資料智能創新與實踐大會

  • 4大體系,專業解構資料智能
  • 16個主題論壇,覆寫當下熱點與趨勢
  • 40+演講,兼具創新與最佳實踐
  • 1000+專業觀衆,内行人的技術盛會

第四屆DataFunCon資料智能創新與實踐大會将于⏰ 7月21-22日在北京召開,會議主題為新基建·新征程,聚焦資料智能四大體系:資料架構、資料效能、算法創新、智能應用。在這裡,你将領略到資料智能技術實踐最前沿的景觀。

歡迎大家點選下方連結擷取大會門票~

DataFunCon2023(北京站):資料智能創新與實踐大會 �-�百格活動

圖像分類模型訓練實踐

繼續閱讀