DeepLabCutの使い方（Linux）

ここではdeeplabcutがインストールされていることを前提としています。
deeplabcutのLinuxへのインストール方法は[こちら](https://qiita.com/suginaga/items/dfd6b891ecf3d678f476)
参考記事は[こちら](https://note.com/sakulab/n/n5d72e45c10af?magazine_key=m550607965a5c)←(一部メニューが変更になっていたため、以下の内容で実施しました）

# DeepLabCutの起動
ターミナルを起動します
1. 仮想環境に切り替える
`$ conda activate DEEPLABCUT`
1. Deeplabcutを起動
`(DEEPLABCUT)$ python -m deeplabcut`
![img50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/53b73b28-348f-f95d-da68-aa96376b4c8a.png)


# Manage Project
プロジェクトを新規作成します
1. Manage Projectタブを選択
![img51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/491e6946-2f33-0724-4100-a817c3a80365.png)

1. 「Create new project」を選択
プロジェクト名、実験者を入力、解析するデータを「Load Videos」　をクリックして選択
※ここではサンプルデータを使用します
[deeplabcutのインストール](https://qiita.com/suginaga/items/dfd6b891ecf3d678f476)　の続きになります
`Downloads/DeepLabCut/examples/openfield-Pranav-2018-10-30/videos`フォルダ内の`m3v1mp4.mp4`ファイル
![img52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/b8a1fd48-04e1-6ea9-cfc9-45c4ee55f2cb.png)

1. 「Copy the videos」　もチェックしOKボタンをクリック
![img53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/6bd227e4-8bd2-3e4e-d627-bdc77cf6416f.png)

新プロジェクトのconfig.yamlファイルが作成されます。
新プロジェクトの一連ファイルは
`/home/(computer-name) /(Name of the Project) - (Name of the experimenter)  - (Date)`のフォルダ内に保存されます

### config.yamlファイルの編集

config.yamlファイルを編集すると追跡ポイント数や名称を変更できます
ファイルの場所
 `/home/(computer-name) /(Name of the Project) - (Name of the experimenter)  - (Date)/config.yaml`

1. config.yamlファイルを開きBodypartsの部分を書き換えてみる
（例）
![img54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/617a2302-88ef-ef08-428d-7503b40e89e5.png)


 * 自作のデータの場合は自分が追跡したいポイントのリストを記述します
<font color="red">※config.yamlファイルを変更した時は、一旦リセットボタンをクリックしてリセットし、[Load existing project」を選択し、「Select the config file」から、修正したプロジェクトの.yamlファイルを選びます。
これをやらないとなぜか、後半のanalyzeがうまく表示されませんでした。</font>
 * 以前のプロジェクトの続きをしたい場合は[Load existing project」を選択し、「Select the config file」から、再開したいプロジェクトの.yamlファイルを選びます。

# Extract Frames
動画からtraining datasetを作るために、動画から複数のフレーム（画像）を抽出します。今後、抽出したフレームに映る対象物の特定の部分（鼻、耳、尻尾など）をラベルして正解画像として使うためです。

1. Extract Framesタブを選択
![img55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/2fecd9de-e831-2660-1f6e-9ffb2b3b824b.png)

1. オプションを選択し、OKボタンをクリックします（今回はデフォルトのままでOK）
 * 「Choose the extraction method」は、フレームの抽出を自動・手動どちらを選択
 * 「Want to crop the frames?」は、動画の全領域を使うのではなく、中央部分、右側といった特定の領域だけを切り取って使うかを選択
 * 「Need user feedback?」は、抽出後、追加したいフレームがある場合はyes
 * 「Want to use openCV?」は、動画の編集にopenCVやmoviepyを使用するかを選択

# Label Data
抽出したフレームにラベルをしていきます。
1. Label Dataタブを選択
![img56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/aa7c41da-9a1a-ece9-9ba2-c44dcbb5d8b5.png)
1. 「Label Frames」ボタンをクリック
1. Labeling ToolBoxが表示されますので「Load frames」ボタンをクリック
![img57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/0cd4eb6c-76c6-95b3-475c-106d44564120.png)
前のステップで抽出したフレームが1つのフォルダに集められています。フォルダの場所は以下です
`/home/(computer-name) /(Name of the Project) - (Name of the experimenter)  - (Date)/labeled-data/m3v1mp4`
1. フォルダを選択してOpenをクリック
![img58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/b6987ba8-12c4-f1ff-9ba5-0af6d347b328.png)
すると、Labeling ToolBoxに抽出されたフレームがLoadされます
![img59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/a9c83166-3b54-ec7c-4c28-c3e7e79b2e13.png)

1. ラベルをつけます。
Manage Projectのステップでconfig.yamlファイルを編集した場合、「Select a bodypart to label」のところに編集したパーツ（nose, leftear, rightear, tailbase）の文字が表示されます。
画像が小さい場合は、ウインドウ下の「Zoom」ボタンを押してマウスを囲えば、マウスが拡大されます
![img60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/a518bed9-1c00-2dac-3c9d-cca9bf98bd9d.png)

noseを選択して、画像のマウスの鼻のところを右クリックするとその場所がマーキングされます。
![img61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/ed825c32-8588-c530-7c5e-0fcc28b5acaf.png)
　* マーカーの大きさ調節・・・「Adjust marker size.」をチェックし、スライダーを動かす
　* マーカーの移動・・・マーカーを左クリックでドラッグ
　* 次のフレーム・・・Nextボタン
　* マーカーの削除・・・削除したいマーカーを選択しbackspaceキー
　
6. 他の部位（leftear, rightear, tailbase）も同じ要領でマーキングします。画像に部位が写っていない場合はマークしなくて構いません。
抽出したすべてのフレーム（今回は19枚）でおこないます。
7. 完了したら「Save」ボタンをクリックします
labeled-dataフォルダにCSVファイルが作成されます。
8. 「Quit」ボタンをクリックして終了します。
「Do you want to label another data set?」のメッセージが表示されますが、Noを選択します。


# Create Training Dataset
作成したラベルデータを使ってtraining datasetを作成します。
1. Create Training Datasetタブをクリック
![img62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/874111b0-36be-3217-acdf-57c825d6596a.png)

 * 「Select the network」は使用するNeural Network
 * 「Select the augmentation method」は画像拡張（augmentation）のアルゴリズムを選択します。
※画像拡張とは、学習時にモデルの汎化性能向上や推論精度の底上げを目的に、ラベル画像に対して様々な変換を掛けて画像を増やすことです。。その他のオプションは複数のモデルを比較するためのものです。今回は全てデフォルトのままでおこないます。そのままOkをクリックします。

ターミナルに「The training dataset is successfully created」と表示されるまで待ちます。

 # Train
ラベルした画像を何度も反復して学習をおこないます
1. Trainタブをクリック
![img63.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/870b7489-b611-d613-aa57-7df5f11f2b92.png)

 * 「Display iterations」は反復する間隔
 * 「Save iterations」は保存する間隔
 * 「Maximum iterations」は反復回数
今回は100　1000　50000と指定します。
「OK」をクリックすると学習がスタートします。
![img64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/a8be6886-ad8f-17e8-ecae-f535dac9a805.png)

学習が終了すると以下の画面が表示されます
![img65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/a23961b0-f6b5-c0ea-21e9-e9ff68b77eb6.png)


 # Evaluate
トレーニングを評価します。
1. Evaluateタブをクリックします。
![img66.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/f17052e0-e7ba-b0a0-53d1-dbc4acf4d535.png)
1. 「Want to plot predictions?」をYesに変更します。
他はデフォルトのままでいいです。
「RUN：Evaluate Network」をクリックすると評価が始まります
以下が表示されれば評価終了です。
![img66-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/2a002237-6ceb-c154-00d1-38bf10a80a02.png)

評価された結果は
`/home/(computer-name) / (Name of the Project) - (Name of the experimenter)  - (Date)/evalution rezults`フォルダに保存
![img67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/8f13dbe5-b467-6b76-1f9b-9583a4c35ddd.png)

* シンボル「+」は自分でラベルした位置。シンボル「●」がDeepLabCutが推測した位置。

# Analyze videos
学習させたモデルを使って動画を解析する
1. Analyze videosタブをクリック。
![img68.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/721525e1-9604-d237-6360-794fb455330e.png)
1. 「Choose the videos」で解析（推測）する動画を指定します。
今回は `/home/(computer-name) / (Name of the Project) - (Name of the experimenter) - (Date)/videos/m3v1mp4.mp4`

 * 「Specify the videotype」、「Specify the shuffle」はデフォルトのままでOK。
 * 「Want to save result(s) as csv」は、ラベル位置のXY座標をCSV形式で出力できます。
 * 「Want to filter the predictions?」は、ラベル部位の推定に前後のフレームの情報も使用できます
（前後のフレームの情報も考慮すると推定の精度が上昇するときがあります。）
 * 「Create labeled video(s)?」は、推測したラベル部位を動画として出力します
 * 「Include the skeleton in the video」は、でラベル部位を直線で結んだ体の骨格ラインを動画に表示します。
 * 「Want to plot the trajectories?」は、ラベル部位の軌跡を図として出力します
![trajectory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/c3e38003-5293-a137-e8a9-3b511d314168.png)

<font color="red">「Want to plot the trajectories?」がデフォルトでyesになっていますが、
一度Noをクリックし、再度Yesをクリックしてbodypartsの種類を表示してください。
これをやらないと、軌跡が表示されません!!</font>
![img69.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/11fbd36e-3c79-74fd-b24c-900da57be5d9.png)


　3. 「Analyzevideos」ボタンをクリックすると、グラフが作成されます。
　![plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/df6a8748-9b75-b20e-d74a-aa2d8a4aba47.png)
![plot-likelihood.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/23ca56fe-edbb-8804-94c2-74073d0006b5.png)

　作成されたファイルは以下に保存されます
　/home/(computer-name) / (Name of the Project) - (Name of the experimenter) - (Date)/videos/plot-poses/m3v1mp4/


# Create videos
作成したラベルを使って動画を作成します。
1. Create videosタブをクリックします
![img70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/df7f4dba-660d-6c6c-bf59-a96812330345.png)

1. 「Choose the videos」で動画を指定します。
今回は `/home/(computer-name) / (Name of the Project) - (Name of the experimenter) - (Date)/videos/m3v1mp4.mp4`
1. 今回はデフォルトのままで「RUN」ボタンをクリックします
作成された動画は
`/home/(computer-name) / (Name of the Project) - (Name of the experimenter) - (Date)/videos/`の中にあります。


解析した動画をみてラベルが正確にできていれば精度の高い結果になっていますが、
そうではない場合、修正して再度解析してみてください。
また、オプション指定でさらに精度を上げることもできます。

詳細はこちらの　[Extract outlier frames](https://note.com/sakulab/n/n1b4cb1d1713a)　を参考