在Colab Notebooks上定義並訓練Yolov4 Model (以水果辨識為例)

Yolo (You only look once)可以說是最知名的即時辨識模型了,不僅效果好,速度也快,當初的論文可以參考這裡,現在一路也出到V4了,你可以在訓練資料上定義不同的圖片和標籤,以此訓練模型,就可以輕鬆達到辨識新目標的效果。

當然我這樣講是有點浮誇,你必須注意一下你的電腦能不能如願把訓練跑完。

在這次的訓練中,我嘗試在Colab Notebooks上安裝,並訓練Yolov4,主要是為了省去GPU這個環節,因為平時我的工作筆電是一台Mac,想要跑完訓練是真的需要一點時間的;另外為了完成訓練,首先我必須找到一份資料集,再來我必須製作自己的YOLO  Format標記檔案,提供給Yolov4進行訓練。

資料集的部分,我使用的是Kaggle上的Fruits fresh and rotten for classification資料集,這其中包含了新鮮蘋果、香蕉、橘子和腐敗的蘋果、香蕉和橘子等六種類型的圖片,如何在Colab Notebooks上下載Kaggle資料集的話可以參考我這篇文章。

至於如何把Kaggle資料集轉成Yolo format的部分,可以參考這篇文章,在這裡我捨棄了用LabelImg,也捨棄了Yolo Marker,為什麼呢?純粹是因為我懶,純粹是因為我想盡量把工作自動化,雖然可能割捨掉一些正確性。

在準備好資料集和Yolo Format的標記檔案後,我們可以開始接著作模型下載和訓練的工作,首先我們要先從AlexeyAB下載darknet,這是一個使用C語言實作Yolo的共用函式庫,但是可以提供Python調用;當初是從Yolo的原始作者那fork出來的分支,因為原作者已經不維護原始程式碼了,所以網路上大多用這個版本在訓練和實戰。

首先,我們下載darknet。

當darknet下載完成後會在Colab上建立一個目錄,這裡要注意,後面訓練、打包時,都會在這個目錄底下進行。

當Make時,或模型訓練時,會需要持續寫入權重(weights),所以我們需要先把目錄權限改一下,開放寫入。

在Make打包之前,我們需要改一下組態檔案,這將影響我們後續打包完的模型如何運作,在這裡我們用sed來修改組態,sed 是「stream editor 」的縮寫,顧名思義是進行串流(stream) 的編輯。無論是在編寫shell 的或處理STDIN 的時候,當有需要進行字串取代、複製、刪除,就可以直接下命令調整,當然你也可以直接透過編輯器修改;這裡我們有幾個東西要調整。
  1. OPENCV=1,啟用OPENCV,注意,你必須先安裝OpenCV。
  2. GPU=1,啟用GPU,注意,你的Coblab要先啟用GPU。
  3. CUDNN也需要啟用,他是基於CUDA的DNN函式庫。如果你用的是自己的電腦,也有自己的GPU,可以找一下顯卡可以支援到什麼程度,然後修改ARCH,ARCH主要是指定框架裡面用到的GPU資訊,在某些狀況下會導致你的YOLO無法編譯,詳細狀況可以參考這篇文章。

接著進行Make,基本上做這些事情速度都很快,麻煩的是後面的訓練。

打包完成後,就可以開始訓練了,在訓練時,我傾向使用網路上已經訓練過的模型(Pre-Trained Model),再來做一次訓練,這樣的效果和識別能力會更好,因為在模型裡面已經有其他人訓練好的權重,如此一來,我們也可以用比較少的訓練資料量,來達到一定的辨識效果。

另外我會用yolov4-tiny.cfg做為訓練用的設定組態,之所以不用yolov4.cfg來訓練,是因為yolov4.cfg的batch數比較多,在Colab Notebooks上訓練很容易記憶體不足,或是說根本就練不起來。

訓練時我會引入前面下載的預訓練模型,需要用到一點時間訓練,基本上幾小時是跑不掉的。

訓練完畢的話,也有語法可以測試,注意一下他會在測試圖片標記出辨識結果。

圖片的辨識訓練其實不會很複雜,訓練資料集方面,也不需要把圖片都轉成同樣大小(這也是為什麼你在產生Yolo format的label資料時,需要取的是比例的相對位置,而不是像素的絕對位置),另外需要注意的是cfg設定檔中的filter數量,這個數值會和你定義的class數量相關,計算公式為filters=3*(classes+5),譬如你在資料集中定義了3個類型(classification),那filters則會是(3+5)*3=24。

後面我會花一點時間整理Yolo的做法和基本原理,並且附上我的些許心得,如此一來才能算真正掌握了Yolo這套框架。(待續)

January 14, 2022 at 04:33PM

留言

這個網誌中的熱門文章

Prompt, Fine-tune 和 Training,誰才是大工程?

這個身分證檢查器是用ChatGPT寫的吧?!

用Python實作 Perspective Transformation 透視變換