DeepLabCut は、動画に映った動物の「鼻先」「尾の付け根」などの点を、少数のラベル付きフレームから学習し、全フレームで追跡するオープンソースのツールです。はじめて使う方には、次の進め方をおすすめします。
- 真上から撮ったマウスの動画なら、まず学習済みモデルの SuperAnimal-TopViewMouse を試す(ラベリングと学習なしで座標が出る)。精度が足りなければ、自分のラベルで学習し直す
- 自分でモデルを作るなら、ラベリングは手元の PC や Mac で行い、学習と動画解析は NVIDIA の GPU を積んだ PC か Google Colab で行う
この記事では、環境の選び方から、出力された座標で総移動距離と滞在時間を出すまでを、公式のコマンドに沿って説明します。版は 2026年10月時点の最新版 3.0.2 です。DeepLabCut で何ができて何ができないかの全体像は「DeepLabCutとは|できること・できないこと」にまとめています。DeepLabCut 以外のツールとの比べ方は、「行動解析フリーソフト比較」と「行動解析ソフトの選び方と比較」で扱っています。
DeepLabCut の作業の流れ
1匹を追う single-animal プロジェクトでは、次の順に進めます。Python の関数でも、GUI(python -m deeplabcut で起動)のタブでも、同じ作業ができます。タブ名は 3.0.2 のものです。
| 段階 | 使う関数(Python) | GUI のタブ |
|---|---|---|
| プロジェクト作成 | create_new_project | 起動画面の「Create New Project」、作成後は「Manage project」 |
| フレーム抽出 | extract_frames | Extract frames |
| ラベリング | label_frames / check_labels | Label frames |
| 学習データ作成 | create_training_dataset | Create training dataset |
| 学習 | train_network | Train network |
| 評価 | evaluate_network | Evaluate network |
| 動画解析・平滑化 | analyze_videos / filterpredictions | Analyze videos |
| 確認用動画 | create_labeled_video | Create videos |
| 精度の追い込み | extract_outlier_frames → refine_labels → merge_datasets → 学習データを作り直して再学習 | Extract outlier frames (*) |
| 学習済みモデル(SuperAnimal) | video_inference_superanimal | Model Zoo |
複数の動物を追う multi-animal プロジェクトでは、個体の追跡を直す「Refine tracklets (*)」などのタブが加わります。
DeepLabCut をどの環境で動かすか(GPU PC・Mac・Google Colab)
| 環境 | 向いている人 | 注意点 |
|---|---|---|
| NVIDIA GPU 付きの PC(Windows・Linux) | 動画が多い、学習を繰り返す | 公式は VRAM 8GB 以上の NVIDIA GPU を理想としている。ドライバと CUDA 版の PyTorch の準備が要る |
| Mac(Apple シリコン) | 手元の Mac でラベリングまで済ませたい | 対応するモデルでは Apple の GPU(MPS)が自動で選ばれる。HRNet など一部のモデルは CPU で学習することになる |
| Google Colab | GPU を持っていない、まず試したい | ラベリング GUI は手元で使う。自分のデータで学習する公式ノートブックは、ラベル付け済みのプロジェクトを前提にしている(SuperAnimal のノートブックは動画だけで試せる) |
GPU がなくても動きますが、公式によると ResNet の学習と評価は CPU だとおよそ10倍遅くなります。どのデバイスが使われたかは、学習開始時のログで確かめてください。
DeepLabCut のインストール(pip・conda)
3.0 で変わったこと
3.0 の正式版は 2026年5月に公開され、2026年10月時点の最新は 3.0.2(PyPI、2026年9月23日公開)です。3.0 からは計算の土台(バックエンド)の既定が TensorFlow から PyTorch に変わりました。TensorFlow は deeplabcut[tf] を追加で入れれば使えますが、公式は 3.2 までに廃止する予定としています。
2.x 時代の解説で学習量を決めていた maxiters(反復回数)は、3.x の PyTorch では epochs で指定します。2.x で付けたラベルは 3.x でもそのまま使えます。対応する Python は 3.10〜3.12 です。
pip で入れる
公式の手順は、conda で空の環境を作り、pip で入れる方法です。NVIDIA GPU を使うときは、先に自分の CUDA に合った PyTorch を入れます(公式の例は CUDA 12.6)。
conda create -n DEEPLABCUT python=3.12
conda activate DEEPLABCUT
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126 # NVIDIA GPU のときだけ
pip install "deeplabcut[gui]" # 自分で学習する場合(次の行とどちらか一方)
pip install "deeplabcut[gui,modelzoo]" # SuperAnimal も使う場合
Mac や CPU だけの PC では、1行目(pip install torch torchvision --index-url …)を飛ばします。次の行(deeplabcut[gui] または deeplabcut[gui,modelzoo])で、DeepLabCut と一緒に通常版の PyTorch が入ります。GPU 版を先に入れていれば、要件を満たしているのでそのまま使われます(上書きで入れ直されることはありません)。
SuperAnimal(後述)を使うには、modelzoo の追加指定が要ります。正式版を入れるときは --pre を付けません(--pre はプレリリース版を入れるときの指定です)。
conda の環境ファイルを使う
GitHub の conda-environments/DEEPLABCUT.yaml をダウンロードし、conda env create -f DEEPLABCUT.yaml で作る方法もあります。この環境ファイルは Python 3.10、ffmpeg、GUI 用の pyside6、PyTorch、deeplabcut[gui,modelzoo,wandb] をまとめて入れますが、pip の指定に --pre が含まれています(3.0.2 の時点)。後日このファイルで作ると、その時点のプレリリース版が入ることがあります。
論文に使うなら版を固定する
解析結果を論文に使うなら、版を指定して入れ、環境を書き出しておきます。DeepLabCut・PyTorch・CUDA・ドライバの版も控えておきます。
pip install "deeplabcut[gui,modelzoo]==3.0.2"
conda env export > environment_dlc.yml
GPU が見えているかを確かめる
python -c "import torch; print(torch.cuda.is_available())" # NVIDIA GPU の場合
python -c "import torch; print(torch.backends.mps.is_available())" # Apple シリコンの Mac の場合
NVIDIA GPU の PC で False と出たら、ドライバか PyTorch の入れ方を見直します。CUDA 版を指定せずに入れると、CPU 版の PyTorch が入ることがあります。Mac では1行目は常に False になるので、2行目で確かめます。
プロジェクトを作り、追跡する点を決める
import deeplabcut
config_path = deeplabcut.create_new_project(
"openfield", "yamada",
["/data/mouse01.mp4", "/data/mouse02.mp4"],
working_directory="/data/dlc",
copy_videos=True,
multianimal=False,
)
作られたフォルダの config.yaml を開き、bodyparts(追跡する点)を書き換えます。点は、後でどの指標をどう判定するかから逆算して決めます。総移動距離と中心滞在なら体幹の1点、頭の向きを見るなら鼻先と両耳、といった具合です。
体幹の点を center と名付けても、名前だけでは「重心」なのか「背中の中央」なのかが決まりません。「両耳を結ぶ線の中点と尾の付け根の中間の背中」のように、毛の模様に頼らず毎回同じ位置に付けられる定義を、文章と図で決めておきます。定義があいまいな点は付ける人や日によって位置が変わり、そのまま距離や進入判定の系統的なずれになります。
フレームを抽出してラベリングする
deeplabcut.extract_frames(config_path, mode="automatic", algo="kmeans", userfeedback=False)
deeplabcut.label_frames(config_path)
deeplabcut.check_labels(config_path)
kmeans は、見た目の違うフレームを選ぶ方法です。1本あたりの枚数は config.yaml の numframes2pick(新規プロジェクトでは 20)で決まります。公式ユーザーガイドは、マウスのリーチングやオープンフィールドのような単純な実験室の行動では 100〜200 フレームで良い結果が出たとしています。これは出発点の目安で、必要な枚数は毛色・遮蔽・照明・求める精度で変わります。追加するかどうかは、別の動画で必要な精度に届いたかで判断してください。
暗い区間・壁際・立ち上がりなど条件の違う場面を含め、見えない点は付けずに飛ばします。check_labels が書き出す重ね描きの画像で、付け間違いを必ず見直します。
学習して評価する
deeplabcut.create_training_dataset(config_path)
deeplabcut.train_network(config_path, shuffle=1, epochs=200)
deeplabcut.evaluate_network(config_path, shuffles=[1], plotting=True)
create_training_dataset は、既定でラベル付きフレームの 95% を学習用、残りを検証用に分けます。この関数は、学習を行うマシンの上で実行します(手元でラベリングして Colab で学習する場合は、Colab 側で実行します)。3.x の学習量の初期値は 200 エポックです。device は既定の自動選択(NVIDIA GPU があれば cuda、Apple シリコンでは対応モデルなら mps、それ以外は cpu)に任せれば足ります。
evaluate_network は、人が付けた点と予測した点の誤差(RMSE、ピクセル単位)を、学習画像と検証画像のそれぞれについて出します。確からしさ(likelihood)が閾値 pcutoff を超えた点だけで計算した値も出ます。検証誤差が大きいとき、原因はラベル枚数とは限りません。ラベル位置の不一致、付け間違い、遮蔽、画質、撮影条件の違い、学習不足や過学習も考えられます。部位ごとの誤差と、評価で書き出される画像を合わせて見てください。許容できる誤差は、追跡する部位の大きさやラベルのばらつきなどによる、と公式もしています。
動画を解析して座標を出す
videos = ["/data/mouse01.mp4"]
deeplabcut.analyze_videos(config_path, videos, save_as_csv=True)
deeplabcut.filterpredictions(config_path, videos, filtertype="median")
deeplabcut.create_labeled_video(config_path, videos, filtered=True)
deeplabcut.plot_trajectories(config_path, videos, filtered=True)
analyze_videos の結果は、動画と同じフォルダに h5(HDF5 形式)で保存され、save_as_csv=True を付けると CSV も出ます。1行が1フレームで、列は scorer(モデルの名前)・bodyparts(点の名前)・coords(x、y、likelihood)の3段の見出しを持ちます。x と y はピクセル単位の座標、likelihood はその点の確からしさです。
filterpredictions は飛び値をならす処理で、結果は _filtered.h5 で終わる別のファイル(と CSV)に保存されます。filtertype は median(既定)、arima、spline から選べます。既定の median は、likelihood を見ずに x と y をそのフレームを中心とする 5 フレームの中央値に置き換え、likelihood の列はそのまま残します。動画の最初と最後の2フレームは、足りない分を 0 で埋めて中央値を取るため、値が偏ることがあります。
確認用動画と軌跡図は、filtered=True を付けないとフィルタ前のデータで描かれます。生データとフィルタ後のどちらを最終解析に使うかを先に決め、確認と計算のすべてを同じファイルで行ってください。フィルタの前後で総移動距離がどれだけ変わるかも、一度比べておきます。
精度が足りないときは、extract_outlier_frames で予測が乱れたフレームを拾い、refine_labels で直し、merge_datasets でまとめたうえで、create_training_dataset から作り直して再学習します。
座標から総移動距離・滞在時間を出す
DeepLabCut が出すのは座標までで、総移動距離やエリア別の滞在時間は自分で計算します。ここで大事なのは、確からしさの低い行を削除しないことです。行を消すと、消えた区間の前後が隣り合ったフレームとして扱われ、その間を直線で結んだ距離が足され、滞在時間の分母も狂います。フレームの並びを保ったまま欠測(NaN)にし、補う範囲を決めて計算します。
DeepLabCut を入れた環境(cv2・pandas・tables が一緒に入っています)で実行します。別の環境で計算する場合は pip install opencv-python pandas tables を先に入れてください。
import numpy as np, pandas as pd, cv2
video = "/data/mouse01.mp4"
h5 = "/data/mouse01DLC_xxx_filtered.h5" # 最終解析に使うと決めたファイル(実名に置き換える)
cap = cv2.VideoCapture(video)
fps = cap.get(cv2.CAP_PROP_FPS) # 動画のフレームレート(可変フレームレートは後述)
cap.release()
assert fps > 0, "フレームレートを読み取れない。動画のパスを確かめる"
df = pd.read_hdf(h5)
scorer = df.columns.get_level_values("scorer")[0]
p = df[scorer]["center"].copy() # config.yaml の bodyparts で決めた点の名前に置き換える。行=フレーム番号のまま扱う
PCUT = 0.6 # 新規プロジェクトの pcutoff の初期値。自分のデータで決め直す
MAX_GAP = 5 # 補間してよい連続欠測フレーム数(解析計画で事前に決める)
PX_PER_CM = 400 / 40 # 既知の長さからの換算(例:40cm が 400 ピクセル)
low = ~(p["likelihood"] >= PCUT) # likelihood が閾値未満、または値が無い
p.loc[low, ["x", "y"]] = np.nan
print("欠測率:", round(low.mean(), 3))
def fill_short_gaps(s, max_gap):
"""max_gap フレーム以下の欠測だけ線形補間し、長い欠測と前後端は NaN のまま残す"""
na = s.isna()
run = na.groupby((~na).cumsum()).transform("sum")
return s.interpolate(limit_area="inside").where(~na | (run <= max_gap))
x = fill_short_gaps(p["x"], MAX_GAP)
y = fill_short_gaps(p["y"], MAX_GAP)
valid = x.notna() & y.notna()
assert valid.any(), "有効なフレームが無い。点の名前と閾値を確かめる"
print("補間後の欠測率:", round(1 - valid.mean(), 3))
# 隣り合う2フレームがともに有効なときだけ距離を足す(片方が NaN なら差も NaN になり、足されない)
step_cm = np.hypot(x.diff(), y.diff()) / PX_PER_CM
print("総移動距離(cm):", round(step_cm.sum(skipna=True), 1))
cx0, cx1, cy0, cy1 = 100, 300, 100, 300 # 中心エリア(ピクセル、同じ座標系で決める)
inside = valid & x.between(cx0, cx1) & y.between(cy0, cy1)
print("中心滞在時間(秒):", round(inside.sum() / fps, 2))
print("有効な時間(秒):", round(valid.sum() / fps, 2))
print("中心滞在の割合(有効な時間に対する):", round(inside.sum() / valid.sum(), 3))
このコードは、DeepLabCut と同じ3段の見出しを持つ合成データ(短い欠測・長い欠測・低い likelihood を含む)で、手計算と同じ値になることを確かめています。CSV から読む場合は pd.read_csv(csv, header=[0, 1, 2], index_col=0) で同じ形になります。
長い欠測の間に動いた距離は足されないため、欠測が多い動画では総移動距離が小さく出ます。最小例なので、実際の解析では次を事前に決め、結果と一緒に報告します。
- 閾値:
pcutoffの 0.6 は新規プロジェクトの初期値で、妥当性が確かめられた値ではありません。公式ユーザーガイドは、よく学習したネットワークなら 0.8 以上のような高い値を例に挙げ、plot_trajectoriesが描く likelihood の図を見て決めるよう勧めています。確認用動画や、手でスコアした区間と比べて決めます - 補間の規則:何フレームまで補うか、どの方法で補うか、長い欠測をどう扱うか。欠測率は動画ごとに出します
- 時間の基準:フレーム数を秒に直すときは、その動画のフレームレートを使います。可変フレームレートの動画では、ffprobe などで各フレームの時刻を取り出して使います
- 細かな揺れ:静止中でも点が数ピクセル揺れ、距離が積み上がります。一定距離未満の移動を 0 とみなすかを決めます
座標校正:ピクセルを cm に直す
換算は、アリーナの一辺など既知の長さを画面上で測って決めます。斜めから撮ると場所によって縮尺が変わるため、四隅の座標から射影変換(OpenCV の getPerspectiveTransform など)で床面の座標に直します。広角レンズの歪みが大きい場合は、その補正も要ります。動画を切り抜いて(crop)解析した場合は座標の原点が変わるので、エリアの座標も同じ座標系で決めます。
エリア(ROI)と進入の定義
滞在時間や進入回数は、どの点がエリアに入ったら「進入」とするかで値が変わります。点が境界の上で揺れると進入回数が水増しされるため、一定フレーム以上とどまったら進入とする、などの規則を決めます。
高架式十字迷路(EPM)では、進入の基準がプロトコルによって違います。Walf と Frye のプロトコルは開放アームへの進入を「四肢すべてがアームに乗った時点」で数え、Komada らのマウスのプロトコルは体の重心がアームに入った時点で数えています。体幹の1点だけでは四肢基準を再現できず、head dipping などの姿勢の指標も測れません。四肢の位置や姿勢を見るなら、複数の点を追跡するか、目視で確かめます。試験ごとの定義は「オープンフィールド試験の解析方法」「高架式十字迷路試験の進入の定義と解析方法」で扱っています。
学習に使っていない動画で精度を確かめる
evaluate_network の検証画像は、既定では学習と同じ動画から無作為に選ばれます。200 枚をラベリングしても検証用は 10 枚ほどで、似たフレームが学習側にも入るため、新しい個体や撮影日への当てはまりを高めに見積もりがちです。研究で使うモデルは、学習に使っていない別の個体・撮影日の動画で、次を確かめます。
- 部位ごとの誤差と、確認用動画の目視
- 欠測率(閾値を当てたあとで、何割のフレームが使えないか)
- 最終的な指標(総移動距離・滞在時間)が、手でスコアした値とどれだけ一致するか
複数の動物を同時に追う場合
同じケージの複数匹を追うときは、multianimal=True のプロジェクトにします。個体(individuals)の設定、個体ごとの軌跡(tracklet)の作成と修正が加わり、手順が大きく変わります。接触や重なりで個体が入れ替わる(ID switch)と指標が直接狂うので、重なる場面は確認用動画で必ず見てください。この記事は1匹の場合だけを扱います。
SuperAnimal で学習を省く
3.x では、複数の研究室のデータを集めて事前に学習された SuperAnimal モデルが使えます(modelzoo の追加インストールが要ります)。実験用マウスを真上から撮った動画には SuperAnimal-TopViewMouse(27点)、横から撮った四足動物には SuperAnimal-Quadruped(39点)があります。
使える条件を先に確かめる
TopViewMouse のモデルカードは、対象を「真上から撮った実験用マウスの動画」とし、他の動物種や別の視点の動画には向かないとしています。ラットの動画は想定の範囲外です。学習データは主に C57BL/6J で、白いマウスのデータは1組だけとされ、照明・コントラスト・解像度が学習データと大きく違う動画では精度が落ちうると書かれています。赤外照明の動画についての記載はないため、自分の動画で確かめてください。
モデルの重みと学習データの利用条件は、DeepLabCut 本体のライセンス(LGPL-3.0)とは別です。モデルの重みはモデルカード(Hugging Face)で、学習データ(TopViewMouse-5K)は Zenodo の公開ページで、どちらも学術・非商用の目的に限って利用を許すとされています。企業での利用など、この条件に当てはまらない場合は、モデルカードに書かれた窓口に商用ライセンスを問い合わせる必要があります。
動画に当てる
deeplabcut.video_inference_superanimal(
["/data/mouse01.mp4"],
"superanimal_topviewmouse",
model_name="hrnet_w32",
detector_name="fasterrcnn_resnet50_fpn_v2",
video_adapt=False,
max_individuals=1, # 1匹の動画なら 1 を指定する
)
この例は、まず動物を検出し、その範囲の中で点を推定する Top-Down 型です。max_individuals の既定値は 10(3.0.2 の関数定義)なので、1匹の動画では 1 を指定します。縮尺の候補を与える scale_list は、公式の API 説明では Bottom-Up 型でだけ使われる引数です。video_adapt=True にすると、ラベルなしで自分の動画に合わせる追加の調整(video adaptation)を行い、そのぶん処理時間が延びます。GUI では「Model Zoo」のタブから同じ処理ができます。
出力を読み込む
出力は通常のプロジェクトと形が違います。video_adapt=False の場合、動画と同じフォルダに mouse01_superanimal_topviewmouse_hrnet_w32_fasterrcnn_resnet50_fpn_v2.h5 のような名前の h5 ができます(CSV は出ません)。列の見出しは scorer・individuals(個体。animal0、animal1 …)・bodyparts・coords の4段で、点の名前は mouse_center、tail_base、nose などです。そのため、上の距離計算のコードは center の列が見つからず、そのままでは動きません。個体と点を選んでから同じ処理に渡します。
df = pd.read_hdf("/data/mouse01_superanimal_topviewmouse_hrnet_w32_fasterrcnn_resnet50_fpn_v2.h5")
scorer = df.columns.get_level_values("scorer")[0]
p = df[scorer]["animal0"]["mouse_center"].copy() # 以降は上のコードと同じ
動物を検出できなかったフレームは、x・y・likelihood が -1 で埋まります。likelihood が閾値を下回るので、上のコードではそのまま欠測として扱われます。この読み込み方も、同じ4段の見出しを持つ合成データで確かめています。
自分のラベルで学習し直す(転移学習と fine-tuning)
精度が足りなければ、SuperAnimal の重みを出発点にして、自分のラベル付きプロジェクトで学習します。重みの借り方を決めてから学習データを作り、学習します。
from deeplabcut.modelzoo import build_weight_init
weight_init = build_weight_init(
cfg=config_path,
super_animal="superanimal_topviewmouse",
model_name="hrnet_w32",
detector_name="fasterrcnn_resnet50_fpn_v2",
with_decoder=False, # False=転移学習(出力側の層を新しく作る)
)
deeplabcut.create_training_dataset(
config_path, weight_init=weight_init,
net_type="top_down_hrnet_w32", detector_type="fasterrcnn_resnet50_fpn_v2",
)
deeplabcut.train_network(config_path, shuffle=1)
PyTorch の 3.x では、転移学習か fine-tuning かを build_weight_init の with_decoder で決めます。with_decoder=False は出力側の層を新しく作る転移学習で、自分のプロジェクトの点の名前や数が SuperAnimal と違っても使えます。with_decoder=True は出力側の層も引き継ぐ fine-tuning で、自分の点と SuperAnimal の点の対応表を、先に config.yaml に書き込んでおく必要があります。
from deeplabcut.modelzoo.utils import create_conversion_table
create_conversion_table( # fine-tuning(with_decoder=True)の前に一度だけ
config=config_path,
super_animal="superanimal_topviewmouse",
project_to_super_animal={"nose": "nose", "center": "mouse_center", "tailbase": "tail_base"},
)
左が自分のプロジェクトの点の名前、右が SuperAnimal の点の名前です。対応表を書き込んだら、上のコードの with_decoder を True に変えて build_weight_init から実行し直し、学習データを作り直して学習します。net_type と detector_type には、重みを借りるモデルと検出器の名前を指定します(公式の Colab ノートブック COLAB_YOURDATA_SuperAnimal と同じ書き方です)。
公式の Model Zoo のページの例は train_network に superanimal_name と superanimal_transfer_learning を渡していますが、3.0.2 の関数の説明では、この2つは TensorFlow を使う場合だけの引数で、PyTorch では使われません。
Google Colab で使う
公式の Colab ノートブックのうち、まず使うのは次の3本です。
- COLAB_DEMO_mouse_openfield:同梱のマウスのオープンフィールド動画で、一連の流れを試すデモ
- COLAB_YOURDATA_TrainNetwork_VideoAnalysis:ラベル付け済みの自分のプロジェクトで、学習と動画解析を行う
- COLAB_YOURDATA_SuperAnimal:SuperAnimal を自分の動画で試す
自分のデータで使うときは、「ランタイム → ランタイムのタイプを変更」で GPU を選び、ノートブックのインストールのセルを実行し(ランタイムの再起動を求められたら再起動し)、Google Drive を /content/drive にマウントします。ラベリングは手元の PC で済ませてからプロジェクトのフォルダを Drive に上げ、config.yaml の project_path が Drive 上のパスになっているかを確かめます(公式ノートブックは手で書き換えるよう案内しています)。公式ノートブックのインストール行は !pip install --pre deeplabcut なので、正式版で揃えたい場合は版を指定して入れます。
つまずきどころ
- GPU が使われない:
torch.cuda.is_available()がFalseなら、ドライバと PyTorch の CUDA 版の組み合わせを見直します。TensorFlow を使う場合、Windows ネイティブでの GPU 対応は TensorFlow 2.10 までで終わっています(公式は WSL を勧めています) - Mac で学習が遅い:MPS に対応していないモデルは CPU で学習します。ResNet 系を選ぶか、学習だけを GPU の PC や Colab に移します
- 動画の条件:照明の変化、毛色と床のコントラスト不足、反射、カメラの揺れは精度を下げます
- 古い解説のコードが動かない:2.x の
maxitersやShufflesは、3.x ではmax_iters(TensorFlow の場合)・epochs(PyTorch の場合)やshufflesに名前が変わっています
DeepLabCut と SLEAP の違い
SLEAP も、人が点を付けたフレームで学習し、動物の部位の座標を推定するオープンソースのソフトです(2022年に Nature Methods で発表。現在は米国のソーク研究所の研究室が開発を続けています)。どちらも1匹にも複数の個体にも使え、2026年10月時点では計算の土台もどちらも PyTorch です(SLEAP は 1.5 から)。主な違いは次のとおりです。
| 項目 | DeepLabCut(3.0.2) | SLEAP(1.6.5) |
|---|---|---|
| もとの設計 | 1匹の、自分で決めた部位の追跡(複数個体の追跡は 2.2 から) | 複数個体の姿勢の追跡 |
| 学習せずに試す | 真上から撮った実験用マウスの動画なら、学習済みモデルの SuperAnimal-TopViewMouse を試せる(照明や撮影条件が学習データと違うと精度が落ちうる) | 自分でラベルを付けて学習するのが基本の流れ |
| ラベル付けの進め方 | フレームを抽出してラベルを付け、学習後に予測が乱れたフレームを拾って直す | ラベル付け・学習・予測を GUI の中で繰り返し、予測を直したものを次のラベルにする |
| 入れ方 | conda の環境に pip で入れる。Python 3.10〜3.12 | uv で入れる。Python 3.11〜3.13 |
| 結果のファイル | h5 と CSV | プロジェクトの .slp から、解析用の HDF5・CSV・NWB に書き出す |
| ライセンス | LGPL-3.0 | The Clear BSD License(BSD 系) |
1匹のマウスを真上から撮った動画で、まず座標を出してみたいなら、学習済みモデルを試せる DeepLabCut から始めると手早く進みます。同じ画面に複数の個体がいて、個体の取り違えを見直しながら追跡するなら、SLEAP も候補になります。どちらの出力も座標なので、指標は上の「座標から総移動距離・滞在時間を出す」と同じように自分で計算します。ほかの無料ソフトも含めた比べ方は「行動解析フリーソフト比較」で扱っています。
よくある質問
回答は、2026年10月7日に DeepLabCut の公式ドキュメントと 3.0.2 のソースコードで確かめた内容です。
DeepLabCut はどういう仕組みで部位の位置を推定するのですか?
深層学習の画像認識のネットワークを使います。一般の写真を大量に集めた ImageNet であらかじめ学習したネットワーク(ResNet や HRNet など)を出発点にし、人が点を付けたフレームで学び直させます(転移学習)。一から学習するよりも少ないラベルで済むのはこのためで、原著論文(Mathis ら、2018年)もこの点を示しています。学習したモデルは、各フレームで点ごとに座標と確からしさ(likelihood)を出します。3.0.2 では、新しく学習を始めるときに ImageNet で学習した重みを読み込むのが既定です。
推奨のスペックは? CPU だけでも動きますか?
公式のインストール文書は、VRAM 8GB 以上の NVIDIA の GPU を理想としています。GPU は必須ではなく CPU でも動きますが、ResNet の学習と評価はおよそ10倍遅くなるとされています。プロジェクトの管理とラベル付けは CPU で足りるので、ラベル付けは手元の PC で行い、学習だけを GPU の PC や Google Colab に移す分担もできます。Apple シリコンの Mac では、対応するモデルなら Mac の GPU(MPS)が使われます。OS は Windows・Mac・Linux、Python は 3.10〜3.12 です。
TensorFlow はどの版を使えばよいですか?
3.x の既定は PyTorch なので、TensorFlow を入れなくても使えます。TensorFlow で動かす場合は pip install "deeplabcut[tf]" で入れると、Python の版に合った TensorFlow(3.0.2 の指定では 2.12〜2.17 のどれか)が一緒に入ります。公式は、2.18 より新しい TensorFlow には対応しない方針で、TensorFlow で動かす仕組みそのものも遅くとも 3.2 で廃止する予定としています。Windows ネイティブで TensorFlow の GPU が使えるのは TensorFlow 2.10 までなので、公式は Windows では WSL を勧めています。これから始めるなら、既定の PyTorch で進めるのが無難です。
体幹1点の指標で足りる試験なら
この記事を掲載しているのは、行動解析サービス Be-Chaseの運営元です。以下は自社サービスの説明にあたります。
採用するプロトコルが、総移動距離や「体の中心がエリアに入った時間・回数」で指標を定義している場合は、DeepLabCut の環境構築・ラベリング・学習・計算コードを省く選択肢もあります。Be-Chaseは、ブラウザから動画をアップロードしてエリアなどを設定すると、動物を体の中心の1点として追跡し、総移動距離・エリアごとの滞在時間と進入回数・ヒートマップなどを CSV と画像で出すクラウドサービスです。四肢の進入や鼻先・姿勢の指標が必要な試験には向かず、その場合は DeepLabCut のような複数点の追跡が適しています。
どちらを使う場合も、代表的な動画で、手のスコアや既存の方法と結果が一致するかを確かめてください。クラウドに動画を上げてよいかは、所属機関のデータ管理の規程も確認が必要です。Be-Chaseは無料プラン(14日間・解析20分まで)で試せます。手元の動画が自動追跡に向くかは、登録なしで使える動画適性チェッカーで確かめられます。
記事の内容は 2026年10月時点の公式資料と 3.0.2 のソースコードで確かめていますが、DeepLabCut は更新が続いています。誤りや古くなった点に気づかれた方は、お問い合わせからお知らせください。
参考資料
- DeepLabCut 公式ドキュメント「Installation」 https://deeplabcut.github.io/DeepLabCut/docs/installation.html
- DeepLabCut 公式ドキュメント「DeepLabCut User Guide (for single animal projects)」 https://deeplabcut.github.io/DeepLabCut/docs/standardDeepLabCut_UserGuide.html
- DeepLabCut 公式ドキュメント「DeepLabCut Model Zoo」 https://deeplabcut.github.io/DeepLabCut/docs/ModelZoo.html
- SuperAnimal-TopViewMouse のモデルカード(Hugging Face) https://huggingface.co/mwmathis/DeepLabCutModelZoo-SuperAnimal-TopViewMouse
- SuperAnimal-TopViewMouse-5K(学習データ、Zenodo) https://zenodo.org/records/10618947
- Ye, S. et al. SuperAnimal pretrained pose estimation models for behavioral analysis. Nat Commun 15, 5165 (2024). https://doi.org/10.1038/s41467-024-48792-2
- Walf, A. A. & Frye, C. A. The use of the elevated plus maze as an assay of anxiety-related behavior in rodents. Nat Protoc 2, 322–328 (2007). https://doi.org/10.1038/nprot.2007.44
- Komada, M., Takao, K. & Miyakawa, T. Elevated plus maze for mice. J Vis Exp (22), 1088 (2008). https://doi.org/10.3791/1088
- Mathis, A. et al. DeepLabCut: markerless pose estimation of user-defined body parts with deep learning. Nat Neurosci 21, 1281–1289 (2018). https://doi.org/10.1038/s41593-018-0209-y
- Pereira, T. D. et al. SLEAP: A deep learning system for multi-animal pose tracking. Nat Methods 19, 486–495 (2022). https://doi.org/10.1038/s41592-022-01426-1
- SLEAP 公式ドキュメント「Installation」 https://docs.sleap.ai/latest/installation/
