# 在Google Colab上使用Yolov4訓練
###### tags: `Yolov4` `影像辨識` `訓練權重` `Google Colab`
>written by 莊智皓 @zhihao
>此篇教學為將Yolov4的設定部署至Google Colab上
>若尚未完成設定請參考此篇
---
* 快速引導
[TOC]
---
## 零-介紹Google Colab
### 一、Colab是甚麼?
Colaboratory(簡稱Colab),是一個免費的Jupyter Notebook環境,在雲端運行,並將筆記本儲存在Google雲端硬碟上,Colaboratory最初是Jupyter項目的一部分,但最終被Google接管。
### 二、為什麼要用Colab
Colab提供了K80s、T4s、P4s、P100s等用於運算的GPU,並且已經預裝好用於AI訓練的Keras、TensorFlow、CUDA、cuDNN等環境,適合給軟硬體環境不佳的使用者用於訓練。
### 三、使用Colab須注意甚麼
雖然Colab提供了強大的環境,但由於是免費的服務,對於免費的版本不免有些限制,對於使用者感到困擾的主要如下:
* 單次最長運行時間只有12小時,超過後須重新運行
* 上傳至colab上的檔案在關閉後會被刪除,須將檔案存於Google雲端硬碟
* 除了12小時的限制外,對於GPU的用量也有限制
所以如果在本地端可以做運算的話,就盡可能的不要去使用雲端運算的服務。
## 壹-前置作業
### 一、前往Colab並新增筆記本
1.直接搜尋 Google Colab或前往 https://colab.research.google.com/
2.按新增筆記本

3.產生一個新的筆記本

### 二、將Yolov4設定資料夾上傳至Google雲端硬碟並掛載
1.將整份設定資料夾上傳至Google雲端硬碟
>如圖,我的設定資料夾為"yolo",裡面包含了.data、.names、.cfg、train.txt、valid.txt、空權重及樣本資料夾obj

2.點擊左側資料夾符號開啟檔案管理器

3.點擊"掛接至Google雲端硬碟"並同意存取

4.輸入以下指令可以移動至Google雲端硬碟內
```
%cd /content/drive/MyDrive/
```
:::info
:bulb: Ctrl+Enter可快速運行指令
:::

### 三、開啟筆記本的GPU加速功能
1.點擊上排功能區中的"執行階段"選擇"變更執行階段類型"

2.將硬體加速器從原本的"None"改為"GPU"

3.按下儲存後會重啟工作階段,可以輸入以下指令查看所分配到的GPU
```
!nvidia-smi
```
### 四、取得darknet資料夾並建置環境
1.輸入以下指令從Github取得darknet資料夾的副本
```
!git clone https://github.com/AlexeyAB/darknet.git
```
:::warning
:warning: 請務必確認當前的作業資料夾是在Google雲端硬碟中(`/content/drive/MyDrive/`)
:::
:::info
:bulb: 可輸入`!pwd`獲得當前位置
:::
2.完成後可在左側檔案管理器中"MyDrive"資料夾下方看到多了一個"darknet"資料夾

3.打開darknet資料夾,並雙擊打開裡面的"Makefile"檔案,內容會出現於視窗右方

4.將其中的GPU、CUDNN、OPENCV由0改為1,並按下`Ctrl+S`快速儲存
>原始檔案

>修改後

:::spoiler
* 以下針對三項參數做說明:
- GPU=1 啟用GPU加速
- CUDNN=1 啟用cuDNN加速GPU
- OPENCV=1 啟用OpenCV
:::
5.輸入以下指令移動至Google雲端硬碟內並建置環境,結束後即完成環境的建置
```
!cd /content/drive/MyDrive/darknet;make
```

## 貳-訓練及後續
### 一、開始訓練
1.輸入以下指令開始訓練
```
!cd /content/drive/MyDrive/;/content/drive/MyDrive/darknet/darknet detector train /content/drive/MyDrive/yolo/test.data /content/drive/MyDrive/yolo/yolov4-test.cfg /content/drive/MyDrive/yolo/yolov4.conv.137
```

:::warning
:warning: 指令中位置及檔名請依自己實際情況更改,分號前部分的路徑(即`/content/drive/MyDrive/`)為`chart.png`(即`Loss/Batches曲線圖`)輸出之路徑,建議選在Google雲端硬碟內。
:::
:::warning
:warning: 分號後第一段路徑(即`/content/drive/Mydrive/darknet/darknet`)為訓練程式`darknet`之路徑,請依自己實際情況更改。
:::
:::warning
:warning: 分號後第二至四段路徑(即`/content/drive/Mydrive/yolo...`)為上傳的設定資料夾內之.data、.cfg及空權重之路徑,請依自己實際情況更改。
:::
:::warning
:warning: 建議使用絕對路徑,以免出現找不到檔案之錯誤。
:::
### 二、在中斷後接續訓練
1.由於Colab有單次最長12小時的限制及閒置過久自動中斷的機制等,所以如果在意外中斷後欲重新接續先前進度繼續訓練的話,請參考以下步驟。
2.在重新開始工作階段前請先對輸出圖表及權重進行備份。
:::info
:bulb: 圖表每100次batches會更新一次,位置為前段中`cd`的路徑內,會有`chart_(.cfg檔名).png`及`chart.png`兩個檔案。

:::
:::info
:bulb: 權重每1000次batches會產生一個,位置位於`.data`檔案中所設定的位置,會有`(.cfg檔名)_次數.weights`及`(.cfg檔名)_last.weights`,分別為訓練1000、2000...次及最近一次所產生的權重。

:::
3.備份完成後將原本空白權重路徑改為最新一次權重的路徑後再運行即可
>第一次訓練的指令
```
!cd /content/drive/MyDrive/;/content/drive/MyDrive/darknet/darknet detector train /content/drive/MyDrive/yolo/test.data /content/drive/MyDrive/yolo/yolov4-test.cfg /content/drive/MyDrive/yolo/yolov4.conv.137
```
>接續訓練的指令
```
!cd /content/drive/MyDrive/;sudo chmod -R 777 /content/drive/MyDrive/;/content/drive/MyDrive/darknet/darknet detector train /content/drive/MyDrive/yolo/test.data /content/drive/MyDrive/yolo/yolov4-test.cfg /content/drive/MyDrive/yolo/backup/yolov4-test_last.weights -dont_show
```
:::warning
:warning: 指令中最後一段位置及檔名(即`/content/drive/MyDrive/yolo/yolov4-test_last.weights`)為前段中所說之`(.cfg檔名)_last.weights`,請依自己實際情況更改。
:::
### 三、常見錯誤以及簡易排除
#### 1.`黃字Gtk-WARNING :cannot not open display:`
基本上如果完全照著步驟走的話,一定會遇到著個問題,因為Colab的虛擬機並沒有顯示輸出,導致他所產生的圖表無法顯示,解決辦法很簡單,只要讓他的圖表不要顯示就好了,在指令的最後方加上`-dont_show`即可,如下:
>原指令
```
!cd /content/drive/MyDrive/;/content/drive/MyDrive/darknet/darknet detector train /content/drive/MyDrive/yolo/test.data /content/drive/MyDrive/yolo/yolov4-test.cfg /content/drive/MyDrive/yolo/yolov4.conv.137
```
>修改後的指令
```
!cd /content/drive/MyDrive/;/content/drive/MyDrive/darknet/darknet detector train /content/drive/MyDrive/yolo/test.data /content/drive/MyDrive/yolo/yolov4-test.cfg /content/drive/MyDrive/yolo/yolov4.conv.137 -dont_show
```
#### 2.`Permission denied`
如果訓練時間超過12小時,也就是遇到強制中斷的時候,刷新後再次運行指令通常會遇到這樣的問題,原因是因為未知的原因,導致Colab失去存取Google雲端硬碟的檔案操作權限,只要使用Linux中的管理命令讓所有使用者獲得最高許可權的指令,重新取得Google雲端硬碟的操作權限即可,如下:
>原指令
```
!cd /content/drive/MyDrive/;/content/drive/MyDrive/darknet/darknet detector train /content/drive/MyDrive/yolo/test.data /content/drive/MyDrive/yolo/yolov4-test.cfg /content/drive/MyDrive/yolo/yolov4.conv.137 -dont_show
```
>修改後的指令
```
!cd /content/drive/MyDrive/;sudo chmod -R 777 /content/drive/Mydrive/;/content/drive/MyDrive/darknet/darknet detector train /content/drive/MyDrive/yolo/test.data /content/drive/MyDrive/yolo/yolov4-test.cfg /content/drive/MyDrive/yolo/yolov4.conv.137 -dont_show
```
:::spoiler
* 以下針對加入的指令做說明:
- sudo Linux的系統管理員指令,可使普通使用者可執行root命令
- -R 表示套用指定資料夾及其子資料夾
- 777 讓所有使用者都獲取最高權限
- /content/drive/Mydrive/ Google雲端硬碟的路徑
:::
#### 3.其他錯誤
如果有出現上述未提及的錯誤,大部分都是路徑錯誤所造成的問題,請重新檢查路徑、參數及命令是否有誤,並確認是否有掛接Google雲端硬碟,或者刪除命令後重打,通常在錯誤訊息中都會提即是哪部分出現錯誤,若重打後仍然無果,可將錯誤訊息貼至Google上進行搜尋。
## 參-其他檔案及外部連結
### 一、外部連結
#### 1.Jupyter - Wiki
[](https://zh.wikipedia.org/wiki/Jupyter)
#### 2.Google Colab
[](https://colab.research.google.com/)
#### 3.手把手 Train 你的 YOLOv4 (上) — YOLOv4 起手式
[](https://mrhandbyhand.medium.com/hand-by-hand-train-your-yolov4-1-5f6a70618500)
#### 4.Permission denied,解決方法
[](https://www.itread01.com/content/1540975029.html)
### 二、其他檔案
#### 1.自動掛機按鍵
由於Google Colab在閒置一段時間後會自動關閉,所以可找一台空閒的電腦並於Colab中新增一個文字框,在運行此程式後點選文字框,會自動輸入文字並刪除,以達成偽裝為非閒置狀態的效果。
###### 點擊"Run Me.cmd"開始運行(本程式為針對Windows系統運行)
[](https://1drv.ms/u/s!AmMPu87b9ivX21yeG7wGzJinc0dB)
::: info
:warning: 注意: 如果要關掉這個程式,必須進到工作管理員,並找到「詳細資料」。

進入之後,滑到最底下,找到「wscript.exe」,並結束他的處理程序。

:::
#### 2.自動編號
可將obj及valid內的照片自動編號,並自動將png轉為jpg圖檔
> 請放置於設定資料夾的最上層,以我的範例就是放置於yolo資料夾內"test.py的位置",並確保照片是"直接"放置於obj/valid資料夾內,也就是代表obj下不可有任何資料夾。
> 關於設定:
> dir name指的就是存放obj/valid資料夾、.data、.name、.cfg及空權重的資料夾名字,以我的為例就是圖中的yolo資料夾。
> 對於Google Colab,此資料夾必須直接放置於Google雲端硬碟中;對於Windows,此資料夾必須直接放置於x64資料夾中;對於Ubuntu(Linux),此資料夾必須直接放置於darknet資料夾中
> 
###### 點擊`Auto Number.py`運行(本程式可針對Windows運行,理論也可運行於Ubuntu,若有報錯請自行優化)
[](https://1drv.ms/u/s!AmMPu87b9ivX3HKIapRTj3ksK1vB?e=gRJGyH)
:::warning
:warning: 本程式必須運行於Python 3及pip的環境中,請務必確認已安裝Python。
:::
## 肆-其他
如有其他任何問題可由此聯絡我(**__~~不一定回復~~__**)
##### Mail : xd0931021@gmail.com
---
> Finished on May 19, 2021, at 7:45 a.m.[name=zhihao]