在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

在〈在Colab Notebooks上定義並訓練Yolov4 Model (以水果辨識為例)〉中有 4 則留言

  1. 你好,博主。我想请问一下这样子经过yolo测试之后得到的选框太大的问题,你有什么解决的方案吗?
    就是一张图片有多个腐烂水果,但是选框只有一个的问题请问你有什么好的解决方案吗?

    1. 早上好, 若是光看您的描述, 是想同時找出影像裡有多少個腐爛水果, 是吧?
      yolo本身就已經具備這功能了, 若是實測之後還是有抓不準的問題, 可以回頭去檢查訓練的資料集如何設計, 比較大的可能是資料集中標記的影像範圍不夠, 導致yolo後續在實戰的時候認不出~
      或是您也可以再多描述點遇到的問題點. 我會盡快回復您

      1. 博主您好,将我的问题描述地更细致就是,您所说的“同時找出影像裡有多少個腐爛水果”。我对于训练集的处理就是如您另外一篇博文中所描述的那样处理的,但是然后直接投入yolo进行训练,但是效果并不好,即我所说的标记框太大的问题,我不是很清楚是不是和训练集中数据图像只有一个占比面积较大的水果有关,希望您能给我一些指导。万分感谢~

        1. 下午好啊, 了解你的問題, 你的問題, 和訓練集中只有一個佔比較大的水果, 沒有直接關聯; 比較大的可能, 是當使用程式去標註資料集時, 部分資料集標註的不精確, 也導致模型學習出了點問題, 您可以考慮從兩個方向去改善: 1.篩選一下訓練集, 把標記不清楚的圖去掉, 再來是把圖片中物體的邊緣加強點, OpenCV 應該做得到. 2.在實際使用時, 將輸入影像的邊緣也加強, 主要是考量輸入時有大量水果時, 模型不好找出各個物體的邊緣, 只是這是相對比較後期的改善作法了.

          以上提供您參考~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *