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したい部位数に応じて、bodypartsskeletonなどの値を変更してください。

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に関心があり、アプリケーション作成も行っています。趣味は旅行と写真撮影です。