最安で環境を借りてOpenCVの学習環境を構築する

会社とは関係なく、サーバを借りてOpenCVのモデルを作成した時の話をします。

# 問題

自宅PCはMac（Memory16G）しかないが、これだと遅いのでもっと早く学習したい。

# 選定

- Conoha： 今回はこれを使うことにした
- Amazon： 料金的にはConohaと大差なかったが通信量やEBSの料金などいろいろかかるのでやめた。VPS(Lightsail)は月額制っぽかったので、対象外
- さくらのインターネット： 月額なので、今回は対象外

# 構築作業

## 前提

- `ローカル`： 自分のPC
- `Conoha`： Conohaの管理パネル
- `Conoha - 1G`： Conohaの1Gのインスタンス。sshで作業
- `Conoha - ３２G`： Conohaの32Gのインスタンス。sshで作業

## インスタンスを起動する (Conoha)

32Gでインスタンスを作成します。
多分エラーが出るので、Conohaにお問い合わせをしてください。
作成できたら、作ったサーバインスタンスは一度削除してください。

## 事務作業（Conoha）

エラーが出た場合は、お問い合わせをします。
個人で上位プランを使ったことがない場合は制限をかけられているようなのでお問い合わせをしてください。

問い合わせ例：

```
一時的にハイスペックなサーバーを使いたかったので、32GのVPSに申し込もうとしたのですが、
「サービスの申し込み上限数に達しています。」
とメッセージが出て申し込みができません。
```

## 学習データを作る（ローカル）

回答が返ってくる間に学習データを作ってしまいます。
以下のような構成で作っていきます

```
opencv
├── data
│   ├── neg
│   └── pos
├── model
└── src
    ├── negative.dat
    └── positive.dat
```

`data/pos`は、正しいデータ
`data/neg`は、NGデータ
を格納するところです。

`positive.dat`には、`data/pos`の
`negative.dat`には、`data/neg`の
特徴量をそれぞれ入れてください

学習データを作り終えたら、zipで圧縮しておいてください

## 事務作業（ローカル）

メールで、以下のような感じで返答があると思うので、回答します。
返答は素直に行いましょう


```text:返答メールサンプル
〇〇 様 

いつもご利用いただき、まことにありがとうございます。 
ConoHa お客様センターです。 

お問い合わせの件につきまして、上位プランのお申し込みに
ついては弊社にて確認を行わせていただいております。

お手数ではございますが、下記内容につきましてお知らせください
ますと幸いでございます。

希望プラン：
リージョン：
追加希望台数：
ご利用用途：

恐れ入りますが、何とぞご確認くださいますようお願い申しあげます。

今後ともConoHaをよろしくお願いいたします。
```

```text:回答例
希望プランなどは下記のとおりです。

希望プラン：
VPS・32G

リージョン：
東京

追加希望台数：
1台

ご利用用途：
機械学習（OpenCV）のモデルを自作するため。
自宅マシンのスペックだとかなり時間がかかってしまったので、CPUとメモリをたくさん積んだマシンが使いたかった

備考：
・法人利用（商用）じゃなくて、個人利用です
・1ヶ月まるまる使う予定はなく、数日〜1週間ほどの予定です
・モデル生成にだけ使うので、基本的にポートは全部閉じた状態。ローカルから学習データをアップデートしたりするのをscpでやろうと思うで、sshだけ例外的に開ける
・リージョンは価格を見て東京のほうが安かったので東京と書きましたが、シンガポールでもいいです。
・可能であれば、今後も必要なときだけ立ち上げて使いたい
```

32Gが使えるようになったら次の作業に移ります

## インスタンスを起動する (Conoha)

1Gのインスタンスを起動する。OSは`CentOS`でも`ubuntu`でもかまいません。

- この後インストール作業などを行うので、いきなり32Gもったいないです。
- 作業が全て完了してから32Gにプラン変更を行います

## ユーザを作成 (Conoha - 1G)

ユーザを作成し、パスワードを設定（なんでもいいですがopencvなので、cvuserとした）

```bash
$ useradd cvuser
$ passwd cvuser
```

`%wheel  ALL=(ALL)       ALL` がコメントされてないかを確認されていたら外す

```bash
visudo
```

作成したユーザをwheelグループに追加

```bash
$ usermod -aG wheel cvuser
$ groups
```

rootになれることを確認する

```
sudo su - 
```

# OpenCVに必要なパッケージをインストールする(Conoha - 1G)

インストール手順は、いかにまとめていますので、こちらを参照してください
https://qiita.com/usk81/items/98e54e2463e9d8a11415

以降は作成したユーザを使います

## 作成した学習データをアップロードする(ローカル)

圧縮したファイルをアップロードする

```bash
scp -l 6000 ~/Desktop/opencv/(作成した圧縮ファイル) cvuser@(conohaのインスタンスのIP):/home/cvuser
```

## アップロードしたファイルを解凍する(Conoha - 1G)

以下のようになるように解凍します

```
/home/cvuser
├── data
│   ├── neg
│   └── pos
├── model
└── src
    ├── negative.dat
    └── positive.dat
```

## ベクトルファイルを作成する(Conoha - 1G)

```bash
cd src
# ベクトルファイルを作成する
opencv_createsamples -info positive.dat -vec positive.vec -num (任意の数) -w 48 -h 48
```

## プラン変更を行う(Conoha)

サーバを停止する
> 注
> `sudo halt`してもconohaの管理パネルでサーバが落ちてると認識されなかったので、管理パネルからサーバダウンさせてしまっていいと思います。

プランを変更する（1G -> 32G）

サーバを起動する

## 学習を開始する(Conoha - 32G)

```bash
cd src
# sshのコネクションが切れてもいいようにnohupをつけて実行します
nohup opencv_traincascade -data /home/cvuser/model -vec positive.vec -bg negative.dat -numPos (opencv_createsamplesのnumの設定と同じ数値) -numNeg (negative.datのデータ数) -w 48 -h 48 -minHitRate 0.97 -numStages 10 -precalcValBufSize 12000 -precalcIdxBufSize 12000 > out.log 2> err.log &
```

## 学習後

急いで、1Gにプランを変更してください。
`/home/cvuser/model`に学習したモデルが作成されているので、scpでダウンロードしてください

モデルを使ってみて問題なければいいですが、作り直すかもしれないので、作り直す必要がないことを確認してから削除してください。

## 完了

おつかれさまでした。
データ量にもよりますが、そこまで多くなければ、学習1回あたり1000円〜2000円の間ぐらいでできると思います。