Amazon Web Services ブログ
[Life Sciences] AWS Deep Learning AMI を利用したDeepLabCut環境構築
近年、多くの領域でObject DetectionやObject Trackingの活用が進んでいます。例えば、屋外での交通量調査や、店内での動線分析が挙げられます。研究領域でのニーズも高く、Amazon Rekognitionを利用した実装方法については「Amazon Rekognition Custom Labelsを利用した動物の特徴的な行動検出」にて紹介致しました。しかしながら、行動学習においては物体レベルでなく特定部位(例えば、手脚)といった、より細かいパーツレベルでのトラッキングが必要なケースもあります。研究領域で注目・活用されているのが、マーカーレス姿勢推定(markerless pose estimation)ベースのDeepLabCutです。DeepLabCutを利用する事で、動画内の特定行動だけでなく、特定部位の検出・トラッキング・分析が可能です。トレーニングの高速処理にはGPUが不可欠であり、DeepLabCutのセットアップにはNVIDIA driverやCUDAのインストールが必要ですが、オンプレミス環境で用意・設定するにはコストと時間がかかります。そこで、本ブログでは、AWSのAWS Deep Learning AMIとGPUリソースを利用した、クイックなDeepLabCut環境方法をご紹介します。
AWS Deep Learning AMIとは
AWS Deep Learning AMI (以下、DLAMI)とは、NVIDIA CUDA, cuDNN, Anaconda PlatformといったDeep Learningのトレーニングに必要な環境が既にインストールされており、TensorFlow, PyTorch, Apache MXNet, Chainer, Keras, GluonといったDeep Learning Frameworkも事前設定されています。そのため、DLAMIを利用する事で機械学習のモデル開発・トレーニングをクイックに実施できます。料金は選択したリソースの利用時間の課金のみであり、例えばNVIDIA の GPU ソフトウェアは無料で、独自のライセンスが付与されています。
GPUインスタンスのセットアップ
EC2インスタンスの作成
ここからは、DeepLabCutを動かすEC2インスタンスをDLAMIを利用して作成します。
AWSマネージメントコンソールからEC2のウィザードに遷移し、Launch Instancesを選択します。AMIの選択画面にてDeep Learning AMI (Ubuntu 18.04)
を選択します。
インスタンスタイプを選択します。要件に応じたリソースのインスタンスタイプを選択して下さい。ここでは、p3.8xlarge
を選択しています。
Advanced DetailsのUser dataに以下のコマンドを入力してください。User dataはインスタンスの初回起動時(デフォルトの場合)に記述した内容を実行する機能です。
#!/bin/bash
sudo apt update
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt-get update
sudo apt install -y docker-ce
sudo apt-get install -y nvidia-docker2
sudo docker run --runtime=nvidia --rm nvidia/cuda:10.0-base nvidia-smi
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo apt-cache madison nvidia-docker2 nvidia-container-runtime
export DLClight=True
pip3 install deeplabcutcore
pip3 install tensorflow-gpu==1.13.1
sudo apt install -y ubuntu-desktop
sudo apt install -y xrdp
sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini
sudo systemctl restart xrdp
sudo systemctl enable xrdp.service
DESKTOP=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
cat <<EOF > ~/.xsessionrc
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=${DESKTOP}
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
EOF
cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
[Netowrkmanager]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF
sudo systemctl restart polkit
ストレージはデフォルト設定で、タグには任意の名前を設定してください。作成したインスタンスにSSHとRDPで接続するため、接続元のIPアドレスを設定してください。
最後に設定内容を確認して問題なければLaunch
を選択し、任意のKey pairを選択してLaunch Instances
を実行してください。これでEC2インスタンスの作成は完了です
仮想環境の作成とDeepLabCutのセットアップ
選択したKey pairを利用してSSHでEC2インスタンスに接続してください。
/var/log/cloud-init-output.log
を確認し、User dataが正常に実行されたかを確認します。以下のログが確認できれば設定は完了しています。
Executing: /lib/systemd/systemd-sysv-install enable xrdp
[Netowrkmanager]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device
ResultAny=no
ResultInactive=no
ResultActive=yes
Cloud-init v. 20.4-0ubuntu1~18.04.2 running 'modules:final' at Sun, 31 Jan 2021 05:28:11 +0000. Up 39.57 seconds.
Cloud-init v. 20.4-0ubuntu1~18.04.2 finished at Sun, 31 Jan 2021 05:38:24 +0000. Datasource DataSourceEc2Local. Up 652.68 seconds
Errorなどが出ていなければ、以下のコマンドを実行してください。まずまずRDP用にubuntuユーザーのパスワードを設定します。任意のパスワードを設定してください。
sudo passwd ubuntu
次に仮想環境を作成します。仮想環境名は任意の名前を入力して下さい。ここでは、仮想環境名をdeeplabcut_env
としています。
conda create -n deeplabcut_env python=3.6
作成した仮想環境にて必要なライブラリをインストールします。
conda activate deeplabcut_env
pip3 install tensorflow-gpu==1.13.1
pip3 install https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-18.04/wxPython-4.0.3-cp36-cp36m-linux_x86_64.whl
pip3 install jupyter
pip3 install deeplabcut
wget -q -O /tmp/libpng12.deb http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb && sudo dpkg -i /tmp/libpng12.deb && rm /tmp/libpng12.deb
sudo apt install build-essential
sudo apt-get install libsdl1.2debian
conda deactivate
sudo reboot
DeepLabCutの利用
DeepLabCutの利用開始
ここからは、DeepLabCutの利用方法をご紹介します。RDPにてインスタンスに接続して、先ほど作成した仮想環境にて以下のコマンドを実行します。各パスは任意の値を入力して下さい。
conda activate deeplabcut_env
ipython
In [1]: import tensorflow
In [2]: import deeplabcut
In [3]: config_path=deeplabcut.create_new_project('demo','aws',['トレーニング用動画のパス'],working_directory='任意のパス',copy_videos=False)
別terminalで、指定したパス配下にあるconfig.yaml
を編集します。Trackingしたい部位数に応じて、bodyparts
とskeleton
などの値を変更してください。
vi demo-aws-yyyy-mm-dd/config.yaml
プロットを行います。以下のコマンドを実行するとプロット用のGUIが表示されるので、フレームごとにプロットします。プロットが完了したらSave
し、Quit
をクリックします。これらのボタンがない場合は、プロット用GUI画面を拡大してください。
In [4]: deeplabcut.extract_frames(config_path, 'automatic', 'kmeans')
Config file read successfully.
Do you want to extract (perhaps additional) frames for video: トレーニング用動画パス ?
yes/noyes
In [5]: deeplabcut.label_frames(config_path)
deeplabcut.check_labels(config_path)
deeplabcut.create_training_dataset(config_path)
deeplabcut.train_network(config_path)
トレーニングを開始します。
In [6]: deeplabcut.check_labels(config_path)
Creating images with labels by aws.
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:12<00:00, 1.55it/s]
If all the labels are ok, then use the function 'create_training_dataset' to create the training dataset!
In [7]: deeplabcut.create_training_dataset(config_path)
Downloading a ImageNet-pretrained model from http://download.tensorflow.org/models/resnet_v1_50_2016_08_28.tar.gz....
The training dataset is successfully created. Use the function 'train_network' to start training. Happy training!
Out[7]:
[(0.95,
1,
(array([10, 3, 7, 16, 11, 18, 6, 12, 9, 1, 2, 17, 14, 0, 8, 13, 4,
15, 5]),
array([19])))]
In [8]: deeplabcut.train_network(config_path)
トレーニングが完了したら、video_path=['推論用動画ファイルパス]
を指定して、以下のコマンドで推論と動画へのマージを実施してください。
推論
deeplabcut.analyze_videos(config_path,video_path,save_as_csv=True)
プロット
deeplabcut.plot_trajectories(config_path,video_path,showfigures=*True*)
ラベル付き動画の作成
deeplabcut.create_labeled_video(config_path,video_path,draw_skeleton=*True*)
まとめ
今回はDLAMIを利用して、オープンソースであるDeepLabCut環境の構築方法をご紹介しました。皆様の研究領域のワークロードのお役に立てれば幸いです。
著者について
小泉 秀徳(Hidenori Koizumi)は、日本のヘルスケア・ライフサイエンスチームのソリューションアーキテクトです。理学のバックグラウンド(生物学、化学など)を活かした研究領域でのソリューション作成を得意としています。得意分野は機械学習で、最近ではAmazon Neptuneに関心があり、アプリケーション作成も行っています。趣味は旅行と写真撮影です。