Windows10でDeepLabCutを使いたい（操作編）

ここでは初心者でもDeepLabCutが使えるような操作説明を記述しています。
DeepLabCut、Anacondaがインストールされているのを前提に紹介しています
DeepLabCut、Anacondaのインストール方法は[こちら](https://qiita.com/suginaga/items/5cd13c6914387e8cce7f)
参考記事は[こちら](https://note.com/sakulab/n/n5d72e45c10af?magazine_key=m550607965a5c)←(一部メニューが変更になっていたり、コツがあったので、備忘録として以下に手順を記載します）

# DeepLabCutを起動する前に
### サンプルデータをダウンロード
説明に利用するサンプルデータを[GitHubよりダウンロード](https://github.com/DeepLabCut/DeepLabCut)しておきます
1. 「Code」より「Download ZIP]をクリック
![img30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/234ffc31-f659-bc05-60fb-1045622f7e16.png)


1. エクスプローラーを開きダウンロードフォルダをクリックすると`DeepLabCut-master.zip`ファイルがあります
![img31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/d3568ca6-f3eb-a777-010a-b4d40853b42c.png)

1. ZIPファイルを展開します。
右クリックして「すべて展開」を選択

展開する場所は好きなところで結構です。（今回はc:￥User¥ユーザー名　の中にしました・・ユーザー名はあなたのPCの名前です）
![img33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/2b9330d4-511d-4e3a-7476-80bf122b8090.png)
展開されたか確認してください
![img33-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/1cfd25cb-3671-d241-6ca7-6738a817bdfe.png)


### 仮想環境に入る
DeepLabCutを起動するために仮想環境にはいります
Anaconda promptを起動します
1. スタートメニューよりAnaconda3を選択しAnaconda promptをクリックします
![img13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/d9ff468f-a870-1182-3a3c-ecb70a0815a9.png)

1.Anaconda promptが表示されます
![img14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/b95b5418-1c9a-c8fe-9340-2fe2567a0bd8.png)

1. `conda activate DEEPLABCUT`と入力し「Enter」キー
![img33-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/a384ebb4-6c59-4c10-099d-9e81a894c69b.png)



### DeepLabCutの起動
1. `python -m deeplabcut`を入力し、「Enter]
![img33-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/db113dbd-68d1-b9f7-ddf2-0a90c9268cee.png)
DeepLabCutが起動します
![img22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/91e1ba50-2517-1e4b-269f-a50c2ea8fa14.png)



# DeepLabCutの使い方
ここから本題です
# 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」を選択
プロジェクト名を入力　（今回はtest）
実験者を入力　（今回はaaa）
解析するデータを「Load Videos」　をクリックして選択
（ダウンロードしたサンプルデータを選択）
`c:￥ユーザー￥ユーザー名￥DeepLabCut-master￥examples￥openfield-Pranav-2018-10-30/videos`フォルダ内の`m3v1mp4.mp4`ファイル
![img34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/d53bb9bc-7b09-1ecf-d2ea-8394b06dac0f.png)

1. 「Copy the videos」　もチェックしOKボタンをクリック
![img35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/d97cb316-b96a-fd1b-661f-c255fb60e9da.png)


新プロジェクトのconfig.yamlファイルが作成されます。
新プロジェクトの一連ファイルは
`c:￥ユーザー￥ユーザー名￥プロジェクト名 - 実験者名  - 日付`のフォルダ内に保存されます
（例）　プロジェクト名：test　実験者名：aaa　日付：2022/5/26　の場合
![img36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/ad4c0065-ca2f-6a88-1cc0-5ec83dc59076.png)


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

config.yamlファイルを編集すると追跡ポイント数や名称を変更できます
1. 「Editconfig file」をクリック
![img37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/8db792ee-5b2e-15e3-7a18-b40d397e8169.png)

開かないときはメモ帳などを起動し、ファイルを開きます。ファイルの場所は
 `c:￥ユーザー￥ユーザー名￥プロジェクト名 - 実験者名  - 日付￥config.yaml`

1. config.yamlファイルを開きBodypartsの部分を書き換えてみる
（例）
![img38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/6ec0bef0-a22b-cbb1-425d-01548312d37f.png)



 * 自作のデータの場合は自分が追跡したいポイントのリストを記述します
<font color="red">※config.yamlファイルを変更した時は、一旦リセットボタンをクリックしてリセットし、[Load existing project」を選択し、「Select the config file」の「Browse」から、修正したプロジェクトの.yamlファイルを選びます。
これをやらないとなぜか、後半のanalyzeがうまく表示されませんでした。</font>
![img39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/1eb4830b-ec9a-c02c-5ae9-500b18302e6f.png)

![img40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/afddc7ea-0174-7359-c1a8-f5cf1f7f45dd.png)

「OK」をクリックしてプロジェクトを呼び出します
 * 以前のプロジェクトの続きをしたい場合も[Load existing project」を選択し、「Select the config file」から、再開したいプロジェクトの.yamlファイルを選びます。

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

1. Extract Framesタブを選択
![img41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/5d0321bf-cc05-2dcd-79f8-feddab8982be.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タブを選択
![img42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/965e6621-7d16-86f1-86f7-458f8ffa7824.png)

1. 「Label Frames」ボタンをクリックすると 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つのフォルダに集められています。フォルダの場所は以下です
`c:￥ユーザー￥ユーザー名￥プロジェクト名 - 実験者名  - 日付￥labeled-data￥m3v1mp4`
1. フォルダを選択して「Selevt Folder」をクリック
![img43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/42b57ca2-fde4-ce4c-3c8e-2f0aff95eb36.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タブをクリック
![img44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/27b96c3a-6b96-44fe-bb25-0e109cc0a24a.png)
今回は全てデフォルトのままでおこないます。そのままOkをクリックします。
 * 「Select the network」は使用するNeural Network
 * 「Select the augmentation method」は画像拡張（augmentation）のアルゴリズムを選択します。
※画像拡張とは、学習時にモデルの汎化性能向上や推論精度の底上げを目的に、ラベル画像に対して様々な変換を掛けて画像を増やすことです。。その他のオプションは複数のモデルを比較するためのものです。

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

 # Train
ラベルした画像を何度も反復して学習をおこないます
1. Trainタブをクリック
![img45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/4cc8e07c-c7df-dc29-d9c8-0132f0194601.png)

 * 「Display iterations」は反復する間隔
 * 「Save iterations」は保存する間隔
 * 「Maximum iterations」は反復回数
今回は100　1000　50000と指定します。
「OK」をクリックすると学習がスタートします。
![img46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/5adcb486-ec79-70e4-187e-cd700951fd21.png)

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


 # Evaluate
トレーニングを評価します。
1. Evaluateタブをクリックします。
![img47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/f7a24895-f04e-db06-d195-12f60e02871f.png)

1. すべてそのままでいいです。
「RUN：Evaluate Network」をクリックすると評価が始まります
以下が表示されれば評価終了です。
![img66-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/2a002237-6ceb-c154-00d1-38bf10a80a02.png)

評価された結果（画像ファイル）は
`c:￥ユーザー￥ユーザー名￥プロジェクト名 - 実験者名  - 日付￥evalution rezults￥iteration-0￥test1May26-trainset95shuffle1￥LabeledImages_DLC_resnet50_test1May26shuffle1_5000_snapshot-5000`フォルダに保存
* シンボル「+」は自分でラベルした位置。シンボル「●」がDeepLabCutが推測した位置。
![img48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/19920683-c640-0c64-1994-b246f20b1ac4.png)



# Analyze videos
学習させたモデルを使って動画を解析する
1. Analyze videosタブをクリック。
![img49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/67f4328a-e987-8495-e176-056edc9cc216.png)

1. 「Choose the videos」で解析（推測）する動画を指定します。
今回は `c:￥ユーザー￥ユーザー名￥プロジェクト名 - 実験者名  - 日付￥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>
![img50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/6438f7e8-c06b-0614-ad78-1f199cbeef8e.png)


　3. 「Analyze Videos」ボタンをクリックすると、いくつかグラフが作成されます。
　　作成されたファイルは以下に保存されます
　c:￥ユーザー￥ユーザー名￥プロジェクト名 - 実験者名  - 日付￥videos￥plot-poses￥m3v1mp4￥
　![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)




# Create videos
作成したラベルを使って動画を作成します。
1. Create videosタブをクリックします
![img51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/1dc56cd6-293a-5d46-5809-97a33f202f2b.png)

1. 「Choose the videos」で動画を指定します。
今回は `c:￥ユーザー￥ユーザー名￥プロジェクト名 - 実験者名  - 日付￥videos￥m3v1mp4.mp4`
1. 今回はデフォルトのままで「RUN」ボタンをクリックします
作成された動画は
`c:￥ユーザー￥ユーザー名￥プロジェクト名 - 実験者名  - 日付￥videos￥`の中にあります。


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

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