runs/<実験ID>/ に閉じる.同じ設定と seed で同じ結果に辿れるようにするTIASJudgeModel/ ├── configs/ # 実験設定 YAML ├── src/tias_judge_model/ │ ├── schema.py # pydantic 設定スキーマ │ ├── data/ # manifest 読み込み・Dataset・分割・前処理 │ ├── models/ # timm ラッパ(アーキテクチャ差し替え点) │ ├── training/ # 学習ループ・損失・スケジューラ │ ├── evaluation/ # 指標・混同行列・レポート生成 │ ├── baseline/ # ルールベース比較(扱いは未定) │ ├── remote/ # リモート実行(tar over ssh・tmux・回収) │ └── cli/ # エントリポイント ├── scripts/ # 合成データ生成・manifest 生成 ├── tests/ ├── data/ # .gitignore(合成データ.実データは置かない) └── runs/ # .gitignore(実験結果)
依存方向は cli → training / evaluation → data / models の一方向とする.data と models は CLI・学習ループを import しない.
元データは研究室 PC の C:\Users\Papin\clinical-data\TIASJudgeModel\ にラベルごとの 9 フォルダとして置かれている(ENV_03).サーバへコピーした後の配置(~/data/TIASJudgeModel/):
~/data/TIASJudgeModel/ ├── images/ │ ├── light_red_normal/ # ラベル_程度のスラッグごとのディレクトリ │ ├── dark_red_strong/ │ ├── dark_red_mild/ │ ├── purple_strong/ │ ├── purple_mild/ │ ├── red_strong/ │ ├── red_mild/ │ ├── pale_strong/ │ └── pale_mild/ └── manifest.csv # 学習が読む唯一の入口
ディレクトリ名は <label>_<severity> のスラッグとする(研究室 PC 側の日本語フォルダ名との対応は ENV_03.日本語名のまま転送すると文字コード差で壊れるため).
manifest.csv の列:
| 列名 | 内容 | 備考 |
|---|---|---|
image_path | images/ からの相対パス | — |
patient_id | 患者を一意に識別する ID | 必須.分割の単位になる |
label | 舌色 5 分類のいずれか | 元データのフォルダ名に由来 |
severity | 程度(strong / mild / normal) | 学習には使わず,評価の層別分析に使う |
note | 任意の備考 | 除外理由等 |
label と severity を決める(対応表は TEST_01 データセット構成調査)patient_id について: 現在のデータセットは 1 患者 1 枚であることを確認済み(2026-09-27).したがって画像 ID をそのまま patient_id とする.この前提が崩れる(同一患者の複数枚が追加される)場合は,実際の患者 ID を入れ直す必要がある(同一患者が分割を跨ぐと評価が壊れるため).分割処理は常に patient_id 単位で行い,前提が変わってもコードを変えずに済むようにする読み込み時・生成時とも,問題があれば黙って除外せず ValueError で停止する(.claude/rules/error-handling.md).メッセージは行番号・件数・クラス名のみで示し,患者 ID・ファイル名を含めない.
| 対象 | 停止する条件 |
|---|---|
| 読み込み | 必須列(image_path・patient_id・label・severity)の欠落,patient_id が空,未知の label / severity,無効な組み合わせ,image_path の重複,同一 patient_id に異なる label,image_path が絶対パス・.. を含む・区切りが \ |
| 生成 | images/ 直下の想定外のディレクトリ名・ファイル,クラスディレクトリ内のサブディレクトリ・PNG 以外のファイル,画像が 0 枚のクラスディレクトリ(クラスが欠けたまま学習が進むのを防ぐため),ファイル名の stem の重複(患者 ID と見なせなくなるため) |
note 列は読み込み時に省略できる(無ければ空文字)patient_id で同じ label の複数行は許す(1 患者複数枚に備える)実験条件は configs/*.yaml に置き,pydantic で検証する(未知のキーは拒否する).
| キー | 内容 | 既定値 |
|---|---|---|
data.root | データのルート(images/ と manifest を含む).~ を展開する.相対パスはカレントディレクトリ基準 | なし(必須) |
data.manifest | manifest のパス.相対パスは data.root 基準 | manifest.csv |
split.seed | 分割の seed | 42 |
split.val_ratio・split.test_ratio | 単一分割の比率.各 0 より大きく,合計 1 未満 | 0.15・0.15 |
split.n_folds | 交差検証の fold 数(2 以上) | 5 |
TIAS_DATA_ROOT が設定されていれば data.root より優先する(サーバと手元で同じ設定ファイルを使い回せるようにするため)内部表現は英字 slug,表示は日本語とし,整数 ID を固定して混同行列の軸をぶらさない.
| ID | slug | 表示 |
|---|---|---|
| 0 | pale | 淡白 |
| 1 | light_red | 淡紅 |
| 2 | red | 紅 |
| 3 | dark_red | 暗赤紅 |
| 4 | purple | 紫 |
※ 表示名は元データのフォルダ名に合わせている(「暗赤紅」).順序尺度として扱えるかは未確定(SPEC_02 参照).
runs/<実験ID>/ ├── config.yaml # 解決済み設定 + git コミットハッシュ + seed ├── history.csv # エポックごとの損失・指標 ├── metrics.json # 最終指標(macro F1・accuracy・クラス別) ├── confusion_matrix.csv # 混同行列の数値 ├── log.txt ├── figures/ # 図専用(学習曲線・混同行列等).症例画像は書き込まない │ └── confusion_matrix.png ├── split.json # 分割結果(患者 ID を含む.回収しない) └── checkpoints/best.pt
実験 ID の書式: YYYYmmdd-HHMMSS_<設定ファイル名>_<git短縮ハッシュ>
figures/ には図だけを置き,症例画像(舌画像そのもの・切り出し・誤分類例の画像)を書き込まない.回収ホワイトリストが figures/*.png を回収対象にしているため手元へ回収できるのは以下の名前が一致するファイルのみ.列挙外のファイルは回収しない(拡張子や中身での判断はしない).リモート実行ツール(SPEC_03)がこの制約を実装する.
回収する(runs/<実験ID>/ 配下) | 回収しない |
|---|---|
config.yaml・history.csv・metrics.json・confusion_matrix.csv・log.txt | 上記以外のすべて(split.json・個票の予測・画像・manifest 等) |
figures/*.png | figures/ 以外にある *.png |
checkpoints/*.pt(明示的に指定したときのみ) | 指定が無いときの checkpoints/ |
runs/_remote_logs/<ジョブ名>.log)はファイルとしては回収せず,tias-remote logs で表示して確認する(ログに個人情報を出さない規則が前提..claude/rules/coding-style.md)~/data/TIASJudgeModel/)からは何も回収しない| コマンド | 役割 | 実行場所 |
|---|---|---|
| データセット集計 | 枚数・患者数・クラス分布・画像サイズ・破損チェック | サーバ(結果の要約のみ手元へ) |
| 学習 | 設定 YAML を受け取って学習する | サーバ |
| 評価 | 学習済み run の評価・レポート生成 | サーバ |
| リモート実行 | コード送信・ジョブ実行・結果回収・GPU 空き確認(複数サーバ.SPEC_03) | 手元 |
コマンド名は実装時に確定し,ENV_04 開発コマンドに記載する.