| 項目 | 方針 |
|---|---|
| リサイズ | アスペクト比を保って 224×224 に収め,余白は黒で埋める(元画像は幅 449〜900・高さ 279〜1025 でばらつく) |
| 正規化 | ImageNet の mean / std(事前学習の統計に合わせる) |
| マスク外領域 | 黒 (0, 0, 0)(実データで確認済み.TEST_01).リサイズ時のパディングも黒で統一する |
色を変える拡張は既定で無効にする. 舌の色そのものが正解ラベルであり,color jitter・彩度変更・ホワイトバランス変更はラベルを壊す.
| 使う | 使わない(既定) |
|---|---|
| 左右反転・微小回転・微小スケール・ランダムクロップ | 色相・彩度・明度ジッタ・グレースケール化・強い正規化 |
※ 撮影条件差の吸収のために色系の拡張を試す場合は,独立した実験として効果を測る.
| 項目 | 初期設定 |
|---|---|
| アーキテクチャ | ConvNeXt-Tiny(timm・ImageNet 事前学習) |
| 出力 | 5 クラス |
| 学習方式 | 全層ファインチューニング(データが少ないと判断した場合は段階的凍結を試す) |
| 最適化 | AdamW + cosine annealing(warmup 付き) |
| 早期終了 | 検証セットの macro F1 を基準にする |
まず 1 本を通すことを優先し,比較は timm での差し替えで後から行う.
設定 YAML の model・train 節で与える(SPEC_01「設定ファイル」).既定値は次のとおり.
| 項目 | 既定値 | 備考 |
|---|---|---|
model.name | convnext_tiny | timm のモデル名 |
model.pretrained | true | ImageNet 事前学習の重み(初回はサーバがダウンロードする).合成データの試験では false |
train.image_size | 224 | アスペクト比を保って長辺を合わせ,余白を黒で埋める(レターボックス) |
train.batch_size | 32 | — |
train.max_epochs | 40 | — |
train.patience | 8 | 検証の macro F1 がこのエポック数改善しなければ打ち切る |
train.lr | 1e-4 | AdamW |
train.weight_decay | 0.05 | AdamW |
train.warmup_epochs | 2 | 線形 warmup の後 cosine で減衰 |
train.inner_val_ratio | 0.15 | 交差検証の各 fold で,学習側から早期終了用の検証データを取る割合(下記) |
train.num_workers | 4 | DataLoader |
train.amp | true | CUDA のときだけ混合精度 |
cuda(CUDA_VISIBLE_DEVICES で割り当てられた GPU),無ければ CPU1 つのジョブで 5 つの fold を順に学習・評価し,1 つの実験ディレクトリ runs/<実験ID>/ にまとめて書き出す.「ややあり込み」と「ややあり除外」は別のジョブ(別の実験 ID)として回す.
data.severities に関わらず同じ分割.上記「程度(ややあり)の扱い」)train.inner_val_ratio の患者を検証用に取る(患者単位・9 グループ層化.seed は分割と同じ設定から決める)data.severities を学習用と検証用にだけ適用する(held_out には適用しない.下記)held_out は data.severities に関わらず全程度の画像で評価し,次の部分集合ごとに指標を出す.これで 2 つの条件のジョブを同じ土俵で比べられる.
| 部分集合 | 内容 | 用途 |
|---|---|---|
all | held_out の全画像 | ややあり込みの全体性能 |
common | held_out のうち strong と normal | 2 条件の比較(両条件とも学習に含まれる部分) |
mild | held_out のうち mild | 境界例の扱い |
common と all)mild では加えて予測の内訳を出す: 淡紅と予測された割合・元のクラスと予測された割合・その他のクラスと予測された割合(クラス別と全体)predictions.csv に保存し,回収しないSPEC_01「実験の出力」の名前に従う.
| ファイル | 内容 | 回収 |
|---|---|---|
config.yaml | 解決済み設定・git ハッシュ・seed | する |
metrics.json | fold ごと・fold 平均の指標(上記の部分集合ごと),各 fold の最良エポック,所要時間(下記) | する |
history.csv | fold・エポックごとの学習損失・検証損失・検証 macro F1・学習率・そのエポックの所要秒数 | する |
confusion_matrix.csv | 全 fold 合計の混同行列(common と all) | する |
log.txt | ログ | する |
figures/*.png | 学習曲線・混同行列 | する |
split.json・predictions.csv | 分割と個票の予測(患者 ID を含む) | しない |
checkpoints/fold<k>.pt | 各 fold の最良の重み | --with-checkpoints のときだけ |
所要時間の記録(2026-09-28 ユーザー要望): metrics.json に次を含める.モデル間・条件間で計算コストも比べられるようにするため.
すべての分割は患者単位で行う. 同一患者の画像が複数の分割に跨ってはならない.
現在のデータセットは 1 患者 1 枚であることを確認済みのため(2026-09-27.TEST_01),画像単位の分割が患者単位の分割と一致する.ただし実装は常に patient_id 単位で分割し,将来同一患者の複数枚が追加されても正しく動くようにする.
| 局面 | 方式 |
|---|---|
| 日常の試行 | 患者単位の単一分割(train / val / test).クラス分布を層化する |
| 結論を出すとき | 患者単位の 5-fold 交差検証 |
patient_id と seed から決定的に生成し,config.yaml に記録する<label>_<severity> の 9 グループ)で行う.「ややあり除外」の条件で mild を抜いた後も,各分割のクラス比が保たれるようにするため(下記「程度(ややあり)の扱い」).最小のグループは 51 枚で,比率 0.15 なら各分割に 8 枚程度入る
label と severity で決める.同じ患者に複数の severity がある場合(将来の複数枚)は,最も強いもの(strong > mild > normal)を使うStratifiedKFold(shuffle あり・seed 指定.層化ラベルは層化グループ)を使う.評価側を held_out と呼ぶ(fold 内でさらに val を取るかは Step 4・5 で決める).患者数が fold 数に満たないグループがあれば停止するruns/ にのみ保存する.SPEC_01「回収ホワイトリスト」)「ややあり」(mild)は,臨床上は淡紅(正常)と判断されることが多い境界例である(2026-09-27 ユーザー確認).学習に入れるか否かで結果が変わりうるため,入れる場合と入れない場合の両方で実験する.
設定 data.severities(SPEC_01「設定ファイル」)で使う程度を選ぶ.
| 条件 | data.severities | 使う画像 | 枚数 |
|---|---|---|---|
| ややあり込み | [strong, mild, normal](既定) | すべて | 1085 |
| ややあり除外 | [strong, normal] | 「あり」と淡紅(正常) | 754 |
label は元のまま(5 クラス).「ややあり」を淡紅に付け替える扱いは行わないnormal のみ,他の 4 クラスは strong が残るため)data.severities に関わらず,manifest 全体(1085 枚)で 1 回だけ行う.条件ごとの除外は,分割の後に各分割(train / val / test)から該当する画像を取り除いて適用する| 評価 | 対象 | 目的 |
|---|---|---|
| 条件間の比較 | test のうち strong と normal(両条件に共通する部分) | 同じデータで 2 つの条件のモデルを比べる |
| ややあり込みモデルの層別評価 | test 全体と,mild の部分 | 境界例でどれだけ誤るか(「評価指標」の層別評価) |
| ややあり除外モデルに mild を推論させる | test のうち mild | mild の画像が 淡紅と予測される割合と元のクラスと予測される割合を出す.臨床で淡紅と判断されやすいという知見がデータ上でも成り立つかを確かめる |
mild の画像に対して淡紅と予測することを「誤り」と断定しない.上表の割合として報告し,解釈は人間が行う実データのクラス分布は最大 / 最小 = 380 / 104 ≒ 3.7 倍(TEST_01).中程度の不均衡であり,初回は対策を入れずに素の結果を見る.混同行列でどのクラスが落ちているかを確認してから,クラス重み付き損失等を独立した実験として追加し,効果を切り分けて評価する.
程度ラベル(severity)を含めた 9 クラス分類は採らない(最小クラス 51 枚・不均衡 6.6 倍となり学習が不安定になる.目的は TIASjudge の 5 分類の置き換えであるため).
| 指標 | 役割 |
|---|---|
| macro F1 | 主指標(クラス不均衡下で少数クラスを無視できないため) |
| accuracy | 参考(クラス分布に引っ張られる) |
| クラス別 precision / recall | どのクラスが弱いかの特定 |
| 混同行列 | 誤りの方向(隣接クラスとの混同か,飛んだ誤りか)の確認 |
severity ごと(strong / mild)にクラス別 recall を出す.「ややあり」(mild)は境界例であり誤りが集中すると予想されるため,全体の指標だけでは改善の効果が見えない既存 TIASjudge のルールベース診断を同一テストセットで実行し,同じ指標で並べる.実装の取り込み方(移植 / 別リポジトリ参照)は未定とし,ベースライン実装に着手する時点で決める.
config.yaml に git コミットハッシュとともに記録するtorch.use_deterministic_algorithms)は速度とのトレードオフのため求めない.代わりに同一設定で複数 seed を回して振れ幅を確認する