YOLOv3をPyTorch1.4で動かしてみた

# はじめに
PyTorch1.4で動作するYOLOv3の実装を、Ultralytics LLCという会社が[公開](https://github.com/ultralytics/yolov3)しているので試してみた。
備忘録的に書きなぐっているので、内容が雑なのはご容赦。

# 環境
* OS: Ubuntu18.04 
* GPU: GeForce GTX 1070

# pytorchの動作確認までの手順
1. Ubuntu18.04をインストールする。
1. パッケージを最新化する。

    ```terminal:
    $sudo apt update
    $sudo apt upgrade
    ```

1. CUDA Toolkit 10.1 update2 Archiveのインストール
    1. 以下のコマンドを実行する。

        ```terminal: 
$wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
$sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
$sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
$sudo apt-get update
$sudo apt-get install cuda-10-1 
```  
     * cuda公式サイトのコマンドのままだと最新のバージョン（10.2）がインストールされるので注意。  
       この記事投稿時はpytorchは10.2に未対応。  
       apt-get install cuda-10-1 のようにバージョンを明示する必要がある。  
       また、aptではなく、apt-getを使っている。apt upgradeしたときに問題起こるかも。 
     * インストール中に、secure bootのパスワード登録が求められる。適当に登録した。よくわからなかった。

    1. ".bashrc"に以下を追記する。

        ```
$gedit ~/.bashrc
---
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

1. anacondaのインストール
  1. インストーラをダウンロードする。  
  https://www.anaconda.com/distribution/#download-section  
  から、以下を選択する。  
  ---  
  Python 3.7 version  
  64-Bit (x86) Installer (522 MB)  
  1. インストーラを実行する。  
  ```$bash Anaconda3-2020.02-Linux-x86_64.sh```
        
1. pytorch環境構築  
    1. 適当にconda環境を切る。  

        ```terminal: 
$conda create -n pytorch1_4 python=3.7
$conda activate pytorch1_4
```

    1. pytorchをインストールする。
       ```$conda install pytorch torchvision cudatoolkit=10.1 -c pytorch```

    1. pytorch動作確認
   以下のパイソンコードを実行する。  

        ```python:  
from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)
print(torch.cuda.is_available())
''' 出力
tensor([[0.1166, 0.4387, 0.5680],
        [0.2340, 0.6470, 0.9463],
        [0.2673, 0.2899, 0.2766],
        [0.1243, 0.6881, 0.5566],
        [0.3168, 0.7495, 0.0149]])
True
'''
```

# yolov3を動かす
1. [ここ](https://github.com/ultralytics/yolov3)のリポジトリをクローンする。
2. 同ページの **Pretrained Weights** のリンク先から、拡張子がptのものをダウンロードして、yolov3/weights/に置く。  
   今回は、yolov3-tiny.ptを落とした。
3. サンプル実行する。  

   ```terminal: 
$cd yolov3  
$python3 detect.py --cfg cfg/yolov3-tiny.cfg --weights yolov3-tiny.pt --source ./data/samples/zidane.jp
```  
   何個かモジュールが無いぞと怒られるので、適宜インストールする。
   動いたらyolov3/outputに結果が出力される。  

# 学習とアノテーション
### 学習手順
1. tensorboardをインストールする。( ```pip install tensorboard ``` )
2. **Pretrained Weights** のリンク先からyolov3-spp-ultralytics.ptをダウンロードしてweightsディレクトリに置く。
3. **Tutorials** の[Train Custom Data](https://github.com/ultralytics/yolov3/wiki/Train-Custom-Data)の手順を実行する。(手順5、6は必要であれば実施）。


### アノテーション
###### labelImgインストール
1. [ここ](https://github.com/tzutalin/labelImg)のリポジトリをクローンする。をクローンする。
2. 同ページの **Python 3 + Qt5 (Recommended)** のコマンドを実行する。


    ```terminal: 
例：
$sudo apt-get update
$sudo apt-get install pyqt5-dev-tools
$cd labelImg
$pip install -r requirements/requirements-linux-python3.txt
$make qt5py3
$python labelImg.py
```

3. 使い方（Yoloフォーマットでの出力時の注意事項が丁寧） 
https://demura.net/deeplearning/14350.html


# 余談
最初は、[ここ](https://github.com/ayooshkathuria/pytorch-yolo-v3)の実装を試そうとしたが、推奨PyTorchのバージョンが古い（0.4）のでメンテされてない可能性があるのと、重みファイルのダウンロードに２度ほど失敗したのであきらめた。