maskrcnn-benchmarkの環境構築で遭遇したエラーと解決方法

**Mask R-CNN**をCOCO以外のデータセットで学習するために、[maskrcnn-benchmark](https://github.com/facebookresearch/maskrcnn-benchmark)で提供されているdockerを使おうとしたらいろいろとエラーが起こり詰まったので、遭遇したエラーと解決した方法をメモしておきます。

#エラーと解決策
##ImportError: libGL.so.1: cannot open shared object file: No such file or directory
このエラーは、cv2のインポートをしようとした時に出た。

####解決方法
サイトを調べるうちに、このエラーは以下のコマンドを実行すれば解決できることがわかった。

```
$pip install opencv-python
$pip install opencv-contrib-python
$apt-get install -y libgl1-mesa-dev
```

しかし、3行目の実行で`E: Unable to locate package`というエラーが発生した。

この問題を解決した方法は、

```
$sudo apt update
```

これにより、libGLがインポートできるようになった。

##ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory
libGLがインポートできるようになったが、今度はこのエラーが出るようになった。
このエラーは「**opencv-python自体はpipでインストールされており、cv2は見つかったものの、依存関係にある外部ライブラリが見つからない**」という事を意味しているらしい。

####解決方法
色々調べてDockerFileを書き換え、lib~となっているパッケージをRUN以下に追加した

```
RUN apt-get update -y \
 && apt-get install -y apt-utils git curl ca-certificates bzip2 cmake tree htop bmon iotop g++ \
 && apt-get install -y libglib2.0-0 libsm6 libxext6 libxrender-dev\
 && apt-get install -y --no-install-recommends \
    build-essential \
    wget \
    git \
    vim \
    sudo \
    libgl1-mesa-glx \
    libglib2.0-0 \
    libopencv-dev  \
    libsm6 \
    libxrender1 \
    libxext6 \
    libgl1-mesa-dev \
    curl \
    tmux && \
    rm -rf /var/lib/apt/lists/*
```

しかしこれだけでは動かなかった。その後以下のコマンドを実行したところ、動かすことができた。

```
$apt update
$apt-get install -y libglib2.0-0 libsm6 libxrender1 libxext6
```

##ImportError: numpy.core.multiarray failed to import
これはnumpyが古いバージョンであるために発生するエラーらしい。

####解決方法
numpyをアップデートしてあげる。

##[Dockerfile](https://github.com/facebookresearch/maskrcnn-benchmark/blob/master/docker/Dockerfile)をビルドする際に発生するエラー
提供されているDockerfileの一部が古く、自分の環境では動かすことができなかったので、以下の点を修正した。

1. `pytorch-nightly` → `pytorch torchvision`（36行目）
2. apex と vision の github からインストールする部分はコメントアウト（40行〜42行目、50行〜52行目）

しかし、

`/bin/sh: 1: /miniconda/bin/conda: not found`

というエラーが出てしまった。

####解決方法
Dockerfile内の`miniconda`をすべて`/opt/conda/`に変更した。
<br><br>
次に

`/bin/sh: 1: /opt/conda/bin/conda: not found `

というエラーが出た。

####解決方法
`miniconda`のインストール部分を変更(13行目以下)

1. `/miniconda`→`/tmp/miniconda`に変更
2. パスを https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh に変更

これによってエラーが出ずに最後までビルドができた。
 
##error: command 'gcc' failed with exit status 1
demoディレクトリ内の`Mask_R-CNN_demo.ipynb`を動かそうとしたが、Jupyter notebookがうまく使えなかったため、新しく作成したPythonファイルにコードをコピーして実行した。
すると、*apex*がないというエラーが出たので、

```
git clone https://github.com/NVIDIA/apex.git
cd apex
python setup.py install --cuda_ext --cpp_ext
```

を実行したところ、`setup.py`の実行で

`error: command 'gcc' failed with exit status 1`

というエラーが出た。

####解決方法
以下のコマンドを実行することで、setup.pyが最後まで動いた。

```
git checkout f3a960f80244cf9e80558ab30f7f7e8cbf03c0a0
```

##cv2.error: OpenCV(4.5.2) : -1: error: (-5:Bad argument) in function 'putText'
デモからコードをコピーしてきたファイル`maskrcnn-demo.py`を実行したところ、

```
Traceback (most recent call last):
  File "maskrcnn-demo.py", line 57, in <module>
    predictions = coco_demo.run_on_opencv_image(image)
  File "/notebooks/maskrcnn-benchmark/demo/predictor.py", line 220, in run_on_opencv_image
    result = self.overlay_class_names(result, top_predictions)
  File "/notebooks/maskrcnn-benchmark/demo/predictor.py", line 404, in overlay_class_names
    image, s, (x, y), cv2.FONT_HERSHEY_SIMPLEX, .5, (255, 255, 255), 1
cv2.error: OpenCV(4.5.2) :-1: error: (-5:Bad argument) in function 'putText'
> Overload resolution failed:
>  - Can't parse 'org'. Sequence item with index 0 has a wrong type
>  - Can't parse 'org'. Sequence item with index 0 has a wrong type
```

というエラーが発生した。

####解決方法
このエラーは`predictor.py`の`putText()`という関数の引数が、int型になっていなかったことが原因。引数のxとyをint型にしてあげたことで、きちんと画像が出力された。

元のコード↓

```
 cv2.putText(
                image, s, (x, y), cv2.FONT_HERSHEY_SIMPLEX, .5, (255, 255, 255), 1
            )
```

修正後のコード↓

```
 cv2.putText(
                image, s, (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, .5, (255, 255, 255), 1
            )
```

#まとめ
今回はいろいろなサイトを調べて解決をしました。最後に自分が調べたサイトのURLを貼っておくので、参考にしてください。各自の環境によって異なる解決法があると思いますが、エラー解決の助けに少しでもなれたら幸いです。

#参考サイト
（OpenCVのエラー系）
https://qiita.com/kenichiro-yamato/items/459b9597a940fb87c321
https://qiita.com/toshitanian/items/5da24c0c0bd473d514c8
https://qiita.com/hatorijobs/items/c503840c13672e12d188
https://qiita.com/narista/items/a3d7d26ae50d54c2553a
https://stackoverflow.com/questions/62786028/importerror-libgthread-2-0-so-0-cannot-open-shared-object-file-no-such-file-o
（maskrcnn-benchmarkのdemoコードのエラー）
https://github.com/facebookresearch/maskrcnn-benchmark/issues/1257）
https://github.com/facebookresearch/maskrcnn-benchmark/issues/1217