話說也兩三個月沒更新了,最近都在忙論文跟畢業的事情,Jason 甚至五月中就從前公司離職,整天窩在家專心搞畢論,搞得自己壓力山大 =口= 不過還好,皇天不負苦心人也是順利地蹭畢業了xDD
回到正題,在上一篇:【深度學習】在 Google Colab 上創建 YOLOv4 的運行環境 中我們已經介紹了如何在 Google Colab 中建置一個可以運行 YOLO專用的深度學習框架-darknet 的環境,接著我們便可以進一步的來訓練一個自己的物件偵測模型。 為了客製化訓練了一個自己專用的物件偵測器(Object Detector),首先我們要準備一個自己的資料集(dataset),資料集準備的方法可以參考這一篇:【開發工具】標註自己的影像資料集-LabelImg 或者你也可以從公開資料集如:Pascal VOC、MS COCO Dataset 中抽取出自己要的資料來製作你的資料集,關於這部分如果之後有機會的話 Jason 再另外寫一篇來做介紹吧,這篇還是先著重在教如何訓練。 在資料集的部分搞定後,接著你還會需要準備六個檔案,分別是:
obj.data 是用來告訴 darknet 這套深度學習框架,其他用來訓練的檔案資源擺在哪邊、偵測物件的類別數量以及訓練權重該備份到哪個位置去,就有點像檔案目錄的感覺,如下圖所示:
obj.names 則是用來告訴 darknet 你分類各個類別的名稱,例如我想對車輛進行偵測,並將其分類成公車(bus)、汽車(car)、機車(motorbike)、貨車(truck)等四個類別,那這邊就應該寫成:
yolov4.cfg 則是用來告訴 darknet 你模型的架構長的怎樣,基本上這個部分我們可以直接拿 YOLOv4 論文作者提供的 yolov4-custom.cfg 來修改就可以了,要改的地方不多,首先你用 Crtl+F 找到 [yolo],這是YOLO網路中我們最終用於預測的 YOLO head,你應該會看到裡面預設的 classes=80,這邊就改成你自己的類別數量,如果延續上面舉的例子這邊就是把它改成 classes=4,而YOLO網路中的 YOLO head 有三組,所以請確保你三組都有改到,此外在這每組 YOLO head 前會有一個卷積層,預設會長得像下面寫的這樣:
----------------------------- [convolutional] size=1 stride=1 pad=1 filters=255 activation=linear ----------------------------- 這邊我們需要把它 filters 的數量進行調整,改成符合你類別數量的,修改的方式如下所述: filters = (classes + 5) x 3 如果你知道 YOLO 的預測原理那你大概就知道這邊為什麼是這樣改,所以像我們類別數量是4的話,就應該把它改成 filters=27,如果你的類別數量是1那這邊就是改成filters=18;如果是2就改成filters=21以此類推,然後要注意的是這邊一樣是三組 [yolo] 前的卷積都要改。 至於其他 [net] 底下的那些網路學習參數,如果你不太懂的話不改也是沒關係的,唯一你可能需要改的只有batch、subdivisions 這兩個參數吧,不過這就取決於你GPU有多大的記憶體可以供你使用了。 最後 train.txt 跟 valid.txt 則是用來告訴 darknet 你那些訓練及驗證用的檔案是存放在哪裡,基本上兩個檔案裡面都是用一行來紀錄一張圖檔的路徑,不過請記得先將你的標籤檔轉成YOLO專用的格式並跟圖檔儲存在同一個路徑之下,這兩個檔案的內容大概會長得像這個樣子:
而這邊所謂的 pre-trained.weights 其實就跟我們在訓練其他大型的圖像識別網路一樣,利用了遷移式學習的技巧拿已經 ptr-trained 過的權重檔接續做訓練,可以有效減少訓練所需的時間,並可以避免因為你訓練資料不足而導致 overfitting 的狀況,這部分我們一樣直接拿 YOLOv4 作者幫我們 pre-trained 好的權重來用就好了,我們應該在前面建置環境那 Part 就已經順便下載好了,但如果你沒照那篇做的,可以用下面的連結網址來下載:
在這幾個檔案都準備完成後我們就可以來進行訓練了! 首先把剛剛準備好的那些檔案與資料集上傳到你的 Google Drive,然後新開啟一個帶有 GPU 的 Colab 專案! 接著我會先習慣檢查一下此次拿到的 GPU是甚麼型號,有多少記憶體:
因為你每次開啟 Colab 它會分配給你的 GPU 型號都不固定,而不同的GPU 擁有的記憶體大小都不相同,這就會影響你 batch、subdivisions 的設定,除非你把他們設的很小,不然你可能上次用還好好的,下次要訓練跑一跑就噴個 CUDA out of memory 給你看,所以我是習慣會先檢查這次它給什麼GPU,如果剛好分到比較低階的,我會試著重刷個幾次看能不能換出比較高階的GPU來做使用,像上圖這樣分到 K80 我基本上會把它刷掉,試著去換 T4 或者是P100 那種等級的GPU。
接著我們將之前建好的運行環境裝到這台 VM 裡面:
這部分基本上就是把上次弄好的 darknet.zip 複製到你這台 VM 然後解壓縮就好了,但如果你之前是直接把 darknet 安裝在 Google Drive 上的人,你會發現即便你把 Google Drive Mount 到 Colab VM 仍無法正常執行,那是因為你VM的作業系統沒有執行那個檔案的權限,所以這時候你就要給它執行的權限,可以參考我寫在 if RUN_ON_GOOGLE_DRIVE 底下的那段代碼。
把進行環境裝進我們 VM 後再來就是進到 darknet folder 底下來,然後透過運行: !./darknet detector train <.data 的位置> <.cfg 的位置> <.weights 的位置> -dont_show 就可以開始訓練模型了! 在第一次訓練的時候我們是使用下載來的 pre-trained weights 來做訓練,如果後面要接續之前的訓練來做則改用每次模型練完自動保存的那個 yolov4_last weights。
另外由於 Google Colab 是讓你免費使用的,所以它也有一些限制在,像是無法連續運行超過 12hr 所以我們真的要用 Colab 來訓練一個模型的話,是會需要分很多次來進行的!所以請確保你的 last weights 會存到你的 google drive 上,免得前面訓練的都白費了,然後為了分次訓練圖表可以顯示在同一張圖上我們加上 -chart chart.png 這個指令來實現,至於計算 mAP的部分,像這樣在 colab上分多次做我實測它會有個 bug 在,每次12個小時到你重新開始訓練後 darknet 會自動把要計算的那個 iteration 往後延,所以加 -map 那個指令是沒用的,最後我也懶得去改它 detector.c 的檔案所以算 map 的部份我就自己做了,就沒有在訓練的過程讓 darknet 做。
之後可能會再另外分享一篇如何寫一個 python 腳本來自動產生這些訓練所需的檔案文件,然後再順便再教一下如何把資料集從 VOC 格式轉成 YOLO 專用格式,今天先這樣,如果上面那些代碼你懶得打的話,可以點下面那個載點來下載我打好的 ipynb。 【懶人載點】
最後我想補充的是,如非必要真的、真的、真的不要用Google Colab 來 Train YOLO!
因為這是一件會讓你非常、非常、非常抓狂的事 T^T 如果你的資料集不大倒還好說,但是今天如果你的資料集太大,大到 Google Colab 的 VM 裝不下,你就只能放在 Google Drive 上然後透過 Mount 的方式來存取,但是你馬上就會發現效能瓶頸的問題,用膝蓋想也知道用網路讀取資料的速度跟從硬碟讀取的速度根本不能比。 另外 12 hr 限制也是讓人非常崩潰的一件事情,因為搞得你要一直去重連,而往往也還不到 12hr 它就有可能因為其他問題然後自己關掉了,加上如果你長時間使用GPU,Google 會把你這個帳號短暫的停權掉,你就會有一段時間不能使用GPU,大概會停一天吧,然後為了不讓這個停權問題浪費到你的時間,你可能又要去搞好幾個 google 帳號來輪流跑 training,總之就屎尿很多啦~ 真心不推
23 評論
Jimmy
8/9/2020 11:18:05
學長恭喜你畢業! 也感謝你之前不吝回答我相關的問題
回覆
cheese
2/21/2021 22:57:08
您好,不好意思我想請教您,train.txt 跟 valid.txt 這兩個檔案,若我是用您文章中所提及的開發工具LabelImg ,需要一行一行的打出位子嗎? 謝謝您
回覆
Jason Chen
2/21/2021 23:57:36
Hi cheese,
回覆
Gary
5/11/2021 12:35:48
拜讀大作並且依樣畫葫蘆照做,獲益良多,多謝。
回覆
Jason Chen
5/11/2021 22:36:48
Hi Gary,
回覆
Gary Chen
5/12/2021 10:07:34
Jason 早,
Jason Chen
5/13/2021 01:17:54
Hi Gary,
Gary Chen
5/13/2021 07:49:09
謝謝,感恩
回覆
Gary Chen
5/19/2021 17:27:30
請問,在AlexeyAB GitHub README.md 內有提到:
回覆
Jason Chen
5/19/2021 21:17:41
Hi Gary,
回覆
Gary Chen
5/19/2021 22:00:20
Thank you Jason,
Adam
12/2/2021 15:01:12
您好 我照著您的步驟作業後來出現
回覆
Jason Chen
12/8/2021 14:17:04
Hi Adam,
回覆
Jason Chen
12/8/2021 14:22:45
突然想到,再補充一點。如果確認 "obj.data" 檔案是存在的話,然後一樣會 show "Couldn't open file",那你可以確認一下 obj.data 這個檔案裡面你填的 "內容" 是否正確,這裡面應該會填一些 Darknet 訓練時要用到其他檔案的路徑,如果這裡面其中有一個路徑它打不開,好像也是會跳 Couldn't open file 的錯誤。
Adam
12/9/2021 09:41:59
謝謝您抽空回覆,我會再試看看
Gary Chen
12/30/2021 21:05:31
Hi Jason,
回覆
Jason Chen
1/7/2022 12:51:44
Hi Gary,
回覆
Gary Chen
1/15/2022 07:52:12
多謝
kalin
1/19/2022 00:38:01
那個,請問一下 >///<
回覆
Jason Chen
1/23/2022 15:16:47
Hi kalin,
回覆
Ray
8/4/2022 20:55:24
請問一下...
回覆
Jason Chen
8/4/2022 22:15:32
Hi Ray,
回覆
Ray
8/6/2022 19:11:09
非常感謝您的建議~ 發表回覆。 |
Jason Chen人不光是生來就擁有一切,而是靠他從學習中得到的一切來造就自己。- 歌德 文章分類
全部
封存檔
九月 2023
|