Google Colaboratory上でYOLOv3のオリジナルデータ学習

# Google ColaboratoryでYOLOv3を学習させたい
最近，物体検出を学習データから作成し学習させないといけない事態があり，最初にGPUなし自分の環境でなるんじゃないかと思い動かした時に，ものすごーーく時間が掛かってしまったので無料でGPUが使えるColaboratory上で学習をさせたかった．
ただ苦戦したので，とりあえずメモ．気が向いた時に綺麗に書き直します. 



## YOLOv3　学習データの作成
とりあえず，'[How to train YOLOv3 to detect custom objects](https://medium.com/@manivannan_data/how-to-train-yolov3-to-detect-custom-objects-ccbcafeb13d2)'の記事だったり'[YOLO-VOCでのカスタムオブジェクトの作成の仕方](https://qiita.com/lnkusu/items/0073cb428bb1950d1e0c#yolo%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E7%94%A8%E6%84%8F)'の記事を参考にさせていただきました． 詰まったとこもあるので後日詳しく記載予定．ただ，この記事でデータセットの作成まではなんとかなった．CPUでもよければ学習は可能.  
ちなみに，自分の環境で学習させてみると  
<img width="1090" alt="スクリーンショット 2018-10-17 22.24.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/158729/edcedc67-abca-b116-2a30-2f0d6f710a8f.png">

こんな感じで気が狂いそうなほど時間がかかる．ばらつきはあるものの1epoch3分！早いとこ諦めればよかった.



## GPUが使いたい
最初から使えばよかったのに，ということで使います．基本的なColaboratoryの使い方は省略します．本当にGoogle様様です．
とりあえず最初は[こちらのコード](https://github.com/pavisj/YoloV3_video_colab)を参考に進めました．ありがたいことにexplains how to run YOLO on Google Colabしてくれてます．まさに求めていたもの. てことで進めてみますが，なぜかうまく動かない.  
とりあえず私が動かした方法を載せます.

### Colaboratoryの状態確認
諸々の状態を確認します．Colabの環境がどれくらいの頻度で変化するのかは分かりませんが，現在の状態を確認します.

#### Ubuntuのバージョン
以下のコマンドを実行

```

!cat /etc/os-release
```

<img width="747" alt="コマンド結果" src="https://qiita-image-store.s3.amazonaws.com/0/158729/e6f319a3-baa4-0c9f-bf93-2d8139236c90.png">
Ubuntu 18.04なんですね.

#### gcc, g++のバージョン

```
!gcc -v
!g++ -v
```
<img width="907" alt="-vの結果" src="https://qiita-image-store.s3.amazonaws.com/0/158729/99b17e0a-1748-f664-625e-240ba93db685.png">

それぞれgcc-7, g++-7なんですね.

#### cudaの確認
何が置いてあるのか確認する.

```
!ls /usr/local
```
<img width="526" alt="lsの結果" src="https://qiita-image-store.s3.amazonaws.com/0/158729/8c867311-a72b-44df-752d-adfe823597e2.png">
cuda-9.2がある.

#### 違うバージョンが必要
上記のように確認して，自分が違うものを使いたかったら変えることもできる．ただ，もともとあるのであれば元のを使ってあげるのが一番...!!このセクションはあくまで参考までに.

- Ubuntuのバージョン : どうしようもない
- gcc, g++ : 変えれる．例えば5にしたい場合こんな感じでできる．  
aptでもって来た後，シンボリックリンクを変えてあげる．

```
!apt install gcc-5 g++-5 -y

!ln -sf /usr/bin/gcc-5 /usr/bin/gcc 
!ln -sf /usr/bin/g++-5 /usr/bin/g++
```

- cuda : 変えれるんじゃないかなぁ...  
先ほど紹介した[こちらの記事](https://github.com/pavisj/YoloV3_video_colab)の中にあるので，多分できる．ただ，私の場合うまくいかなかった．gccのバージョン問題とか乗り越えてもなぜかmakeでcore dumpが起こってしまった．



## 準備はできた
下準備が終わったので動かしていく.

### データを読み込む
自分の場合はアホみたいに直接driveにdarknetを丸ごとアップロードしたのでマウント取ってあげる．賢い人はColab上でデータ作ったり，圧縮してあげて，コード上で解凍とかするべき．ちなみに，darknet自体はgit cloneでもって来て来れるので．cloneして学習させたいデータだけ圧縮してdriveにアップロードしてもってくるのが一番賢いと思う．

```
from google.colab import drive
drive.mount('/content/gdrive')
!ls
```
lsしてあげて，gdriveとsample_dataが確認できたら大丈夫. マウントできてる. 


darknetに移動してかくにん

```
%cd /content/gdrive/My\ Drive/darknet/
!ls
```
ここで，darknetの中身が出てくるはず.  

### cuda
なんか，そのままだとできなかった．個人的にapt install cuda-9-2が大事な気がする．シンボリックリンクはいらない気が大いにするけど念のため.

```
!apt update

!apt install cuda-9-2 -y
!ln -sf /usr/local/cuda-9.2 /usr/local/cuda

import os
os.environ['PATH'] += ':/usr/local/cuda/bin' 
os.environ['LD_LIBRARY_PATH'] += ':usr/local/cuda/lib64' 
```

### 仕上げ
Makefileを書き換えてGPUを使うように設定する．他にもMakefileはいじった記憶があるけど，いじったおかげで動いたのかいらなかったのかよくわからないから割愛．

```
!sed -i 's/GPU=0/GPU=1/g' Makefile
!cat Makefile
```
そして，ついに，makeする. 

```
!make
```
makeに成功したらできたら学習させるだけ．makeできなかった方はMakefileの中身だったり，PATH周りをよく確認してみてください．

```
!./darknet detector train cfg/obj.data cfg/obj.cfg darknet53.conv.74
```
cfg/以下はそれぞれ各自のものに書き換えてください.．Colabありがとう，かなり早くなりました． 

ちなみに，実行するときはweightをダウンロードしてあげて，

```
./darknet detect cfg/obj.cfg obj_1000.weights data/dog.jpg
```
とかしてあげれば動くと思う．それぞれ，cfgとweights，写真は変えてあげる必要がある．私の場合はdarknet/backup下にweightsが保存されています．  

コードをGithubに載せました.[こちら](https://github.com/emi-cd/YOLOv3_on_colab).