====== MediaPipeに利用するモデルの学習について ======
2023年5月10のカンファレンス発表でMediaPipeが大きく進化しました.それに伴いカスタムモデルの作成等の情報がpreviewとして公開されています.一部ノウハウやバージョン情報が少なかったりで知見が必要だったのでこのページに忘備録代わりにまとめます.
mediapipeオフィシャルのチュートリアルでは,colabを利用することが前提になっています.colabを利用する限りは以下の情報は不要です.以下はローカル環境での学習です.デカ目のデータセットで学習が12時間以上必要な場合に限った話です.
====== 最初の環境構築 ======
image classificationやobject detection等のモデル学習に先立ち共通した環境構築が必要です.
* 動作環境:Linux, Windows(未検証), *macOSは対象外(model makerとかでインストールエラーになる)
馬場の環境は
* Linux Ubuntu 16.04
* cuda toolkit : 11.3
* card: geforce gtx 1080ti
となります.いい加減環境が古いのですが,まだ大丈夫でした.新しいマシンがほしいです.colabに移行もあるかも.
===== tensorflow on cpu =====
- anaconda のインストール
- condaで環境構築
- conda create -n mediapipe python=3.9
- conda activate
- pip install --upgrade pip
- pip install mediapipe-model-maker
===== tensorlow on gpu =====
gpuで動作される場合,tensorflowはversion2より,tensorflow-gpuが廃止されていることに注意する.このページ(https://www.tensorflow.org/install/pip?hl=ja)にしたがってgpu対応のtensorflowにしておく. cudatoolkitのメジャーバージョンはシステムにインストールしているcudatoolkitと互換を取らないといけない.例えばシステムがv10に対してv11をcondaでインストールすると,insufficient なるメッセージでシステムのドライバがバージョン互換が保てなくて,インストール等はうまくいくが,実行時にエラーとなる.
- anaconda のインストール
- condaで環境構築
conda create -n mediapipe python=3.9
conda activate mediapipe
conda install -c conda-forge cudatoolkit=11.8.0
python3 -m pip install nvidia-cudnn-cu11==8.6.0.163 tensorflow==2.12.*
mkdir -p $CONDA_PREFIX/etc/conda/activate.d
echo 'CUDNN_PATH=$(dirname $(python -c "import nvidia.cudnn;print(nvidia.cudnn.__file__)"))' >> $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/:$CUDNN_PATH/lib' >> $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
source $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh
python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
pip install --upgrade pip
pip install mediapipe-model-maker
====== 学習 ======
物体検出の学習は以下のページがメインリソース
* https://developers.google.com/mediapipe/solutions/vision/object_detector/customize
===== Multiple GPU =====
GPUを利用刷る場合、上記で設定がうまく行っていればそのままGPUで学習が始まる。一方で複数GPUを持っている場合は、別途オプションを設定する必要がある。
https://developers.google.com/mediapipe/solutions/customization/object_detector#hyperparameters このページでパラメーターの一覧が確認できる。この中のHParamsで学習時の設定ができるが、実はこのページではどのように複数GPUを利用刷るかがわからない。そこで、より細かいAPIページを参照する必要がある。 具体的には
https://developers.google.com/mediapipe/api/solutions/python/mediapipe_model_maker/object_detector/HParams このページを参照する。ここで、
* num_gpus: 4
等と設定することで、複数gpuを学習に利用できる。ただし、実際にこのオプションを設定して実行すると distribution_strageryが'off'ではだめだよ、というエラーになる。では distribution_strategyをどうすればよいのかが、実は述べられていない。結果としては、github上のソースコードから、サンプルとして、num_gpusを1以上に設定しているサンプルファイルでは、 distribution_strategyに 'mirrored'を設定しているものがあり、これに倣って 'mirrored' にしたら学習が進んだ。まとめると、
* num_gpus:4,
* distribution_strategy='mirrored'
でOK.例えばこんな感じ
hparams = object_detector.HParams(
export_dir='exported_model',
epochs=120,
num_gpus=4,
distribution_strategy='mirrored'
)
====== 実行 ======
うまくいくとモデルが完成するので,出来上がったモデルを試すページは以下
* https://mediapipe-studio.webapps.google.com/demo/object_detector