Mask R-CNNの実装手順

# はじめに
Dockerを使い始める前、苦労してMask R-CNNを実装したときのメモを記事にしておきます

自分用メモだったため、説明が雑ですが、参考になれば幸いです。

# 環境構築

## インストール

#### Python v3への切り替え
予めPythonv3に切り替えておく必要があります。やり方は割愛します。

#### jupyterのインストール 

 ```
pip install jupyter
 ```
 ```
jupyter notebook
   ```

#### Mask R-CNNのソースコードを取ってくる

```
mkdir ~/maskrcnn_ws
   ```

```
cd maskrcnn_ws
   ```

```
git clone https://github.com/matterport/Mask_RCNN.git
   ```

#### 必要なパッケージをインストール

```
pip3 install -r requirements.txt --user
   ```

```
python3 setup.py install –-user
   ```
#### エラー対処

たくさんエラーを吐くので、以下のサイトを見ながら1つずつアップデート&インストールをする。(権限エラーが起きたら --user をつける) 

##### Import cv2でエラー
`import cv2`を以下のように置き換える 

```
import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
import cv2 
```

参考サイト：https://www.jyuko49.com/entry/2018/11/14/083226#Mask-R-CNNでできること
参考サイト：https://qiita.com/ReoNagai/items/112c3a8b6cd55c3e5380
参考サイト：https://qiita.com/HyunwookPark/items/242a8ceea656416b6da8 


#### COCOデータセットをインストール
```
git clone https://github.com/cocodataset/cocoapi.git
```
```
cd coco/PythonAPI
```

```
sudo python3 setup.py install
```



## GPUに対応させる(CUDA, cuDNN, TensorFlowをインストール)

### バージョン確認

#### NVIDIAドライバーのバージョン確認
```
dpkg -l | grep nvidia
```

#### ドライバとCUDAの対応確認
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html 

#### CUDAとcuDNNとtensorflow-gpuの対応確認
https://www.tensorflow.org/install/source#common_installation_problems 

#### 環境を最新にする 

   ```
sudo apt-get upgrade
   ```

   ```
sudo apt-get update
   ```

   ```
sudo apt list upgradable
   ```

参考サイト：https://qiita.com/konzo_/items/a6f2e8818e5e8fcdb896 
参考サイト：https://qiita.com/konzo_/items/3e2d1d7480f7ef632603 


### ビルドツールインストール

```
sudo apt-get install build-essential
```

### CUDA

#### ダウンロード
https://developer.nvidia.com/cuda-toolkit-archive から対応するバージョンの~networkをダウンロード 

#### インストール
```
cd ~/ダウンロード
```

```
sudo dpkg -I [ダウンロードしてきたファイルの名前].deb
```

```
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
```

```
sudo apt-get update
```

```
sudo apt-get install cuda-toolkit-10-0
```

※`cuda-toolkit-XX-X`は上で見たバージョンに合わせる 

#### bashrcの設定

```
sudo gedit ~/.bashrc
```

一番下に以下を追加 

   ```
   export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}} 
   export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} 
   ```

#### 再起動

#### CUDAの確認 

 ```
 nvcc -V
 ```

### cuDNN

#### ダウンロード
https://developer.nvidia.com/cudnn からRuntimeとDeveloper~とCode~をダウンロード（要ログイン） 

#### インストール
```
sudo dpkg -i libcudnn7_7.4.1.5-1+cuda10.0_amd64.deb
```

```
sudo dpkg -i libcudnn7-dev_7.4.1.5-1+cuda10.0_amd64.deb
```

```
sudo dpkg -i libcudnn7-doc_7.4.1.5-1+cuda10.0_amd64.deb
```
※以上の順番でインストール(ファイル名はダウンロードしてきたものに変える) 


### TensorFlow

```
pip3 install tensorflow-gpu==1.14.0
```

※バージョンはうえで確認した対応関係に合わせる

## エラー対処

### Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR

#### VS Codeなどで下記ファイルを開く
```
   ~/.local/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py
   ```

#### ファイルの変更

`tf.Session()`の箇所を

```
 session_config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))
    tf.Session(config = session_config)
```

で置き換える

参考サイト：https://qiita.com/hiroshijsc16/items/d7226eae499e5ad7e5e9
   

# 動画を読み込む

参考サイト(サンプルコードはここにある)：https://ai-coordinator.jp/mask-r-cnn

## エラー対処

### modelがインポートできない

  `~/maskrcnn_ws/Mask_RCNN/maskrcnn_from_movie.py`の`import model`を`import mrcnn.model as modellib`に変更

### cocoがインポートできない

  `coco`を`import samples.coco.coco as coco`に変更

### cv2がインポートできない

  なんだかんだそのままでうまく行くようになった(理由はよくわからない)
  
  

# 画像読み込み(maskrcnn_from_photo.py)

参考サイト：[https://www.jyuko49.com/entry/2018/11/14/083226#Mask-R-CNN%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8](https://www.jyuko49.com/entry/2018/11/14/083226#Mask-R-CNNでできること)

## エラー対処
### Tensorflowが見つからない

```
pip3 install -U tensorflow keras
```
参考サイト：https://teratail.com/questions/138592

### Imgaungが見つからない

```
pip3 install imgaug
```

###cv2が見つからない

  `import cv2`を以下で置き換える

  ```
  import sys
  sys.path.remove('/opt/ros/kitf.Sessionnetic/lib/python2.7/dist-packages')
  import cv2
  ```


## エラー対処
### CUDNN_STATUS_INTERNAL_ERROR

```
config.gpu_options.allow_growth = True
        _SESSION = tf.Session(config=config)
```
参考サイト：https://github.com/tensorflow/tensorflow/issues/27144