# Method（アウトライン・メモ）

sections/3_method.tex に対応。1セクションずつ書いていく方針のため，まずは構成と使える事実だけをメモしておく（本文はまだ書いていない）。
事実の出典は各行末に記載。
[Notion]=AI in Medicineページ，
[Notion:西先生]=西先生からの回答｜No reflowの処置，
[config]=/home/nlab/IVUS/Config/ 内のYAML，
[code]=/home/nlab/IVUS/ 内のコード，
[tool]=/home/nlab/ivus-complication-annotation-tool，
[result]=D:\Research\Result\2026_09_18_ai_in_medicine 内の保存結果，
[user]=ユーザー（金子）の口頭情報．

## 確定した方針（2026-10-12時点）
- 主張：IVUS画像・臨床情報・プラーク特徴を入力とする比較手法（ResNet-34+LSTM，USCNet）の中で，
  2Dフレーム単位の処理＋フレーム間処理を持つKSCNetが平均AUC・F1とも最も高く，3Dモデル（USCNet）を上回った [Notion]
- 統計的検定は実施しない方針（2026-10-12）[user]．
  差は，観察された平均値とfold別の勝敗数の記述にとどめ，「有意」「統計的に優れる」等の表現は使わない
- 書ける主張（記述的な事実）：KSCNetは，医師3名の目視読影（平均AUC 0.637）および先行研究の減衰プラーク角度スコア（0.649）を
  上回る平均AUC（0.717）を示した（fold別では，それぞれ4/5，5/5 foldで上回る）．
  ResNet-LSTM（E4'，平均AUC 0.696）とは「同程度」と記述する（差は+0.020，AUCで上回るのは1/5 fold）
- 書かない主張：「IVUS画像が予測に有効」「画像の寄与」（入力に臨床変数・プラーク特徴を含み，画像の寄与は切り分けていない），
  範囲を限定しない「最良モデル」，E4'に対する「優れる」，「3D一般に劣る」（3DはUSCNetのみ）[Notion]
- Limitationsに記載：fold 5での性能低下，面積特徴（13フレーム）と画像入力（32フレーム）の範囲の違い．
  検定を実施していない点は，Limitationsには書かない [user]
- 論文に載せる学習済みモデルは，Class weightなし・batch size 4に揃えたもののみ．
  元の実験（Class weightあり・batch size 8〜16）は載せない [user]
- 入力Ablation（副表）は載せない．本文では画像のみ→画像＋臨床＋プラーク特徴のAUCの変化に1文触れる程度 [user]
- LightGBMなどの表形式の機械学習手法は使用せず，比較にも含めない [user][Notion]
- 医師の読影はMethodに含める．経験年数は具体的な数字を書かない [user]

## 3.1 Dataset
- 287例，陽性（No reflow / Slow flow）68例（23.7%），陰性（Normal）219例（76.3%）．
  病型（STEMI/NSTEMI/UA）の内訳は書かない [Notion][user]
- IVUS取得デバイス：Terumo VIEW IT（40MHz）またはAltaView（60MHz）のみを書く．
  デバイス別の症例数は把握できていないため書かない [user]
- アノテーション：血管腔・血管壁（Vessel/Lumen）領域，プラーク角度（減衰・石灰化方向）．
  プラークアノテーションがあるのは1症例あたり13フレーム [Notion]
- 5-fold CV（症例単位の分割，per-fold平均），閾値はvalidation Youden index．
  全手法が同一287症例・同一foldで評価されていることを，case_idレベルで確認済み [Notion]

## 3.2 Data Preprocessing / Annotations
### 画像入力
- 前処理：元画像 → 極座標変換（Pixel Spacing考慮）→ プローブ境界除去（30 pixel） [code: preprocess_all.py, config]
- 入力サイズ：224×224，フレーム数：32 [config]
- フレーム選択：症例ごとに約1 mm間隔の20枚（sparse）を基準に，隣接フレーム間を補間して96枚のdense集合を作り，
  そこから等間隔に32枚を抽出 [code: dense_extraction.md, dense_frame_selection]
- KSCNet，USCNet，ResNet-34+LSTMは同一の32フレーム入力 [config]

### 臨床変数（47次元） [code: PatientFeatureProcessor, config]
- 連続変数17：Age, BW, HT, sBP, HR, LVEF, Cre, BS, HbA1c, PLT, T-chol, HDL-C, LDL-C, TG, BNP, TnI, CK-MB
- カテゴリ変数13：Men, DM, HTN, DL, Smoking, HD, OMI, HF_history, TnElevation, Diagnosis, Killip, ST_deviation, CA
- 前処理：連続変数はtrain foldの平均・標準偏差でZ-score化（欠損は除外して算出），欠損は0.0に補完し，
  変数ごとに欠損フラグ（is_missing）を追加．カテゴリ変数は欠損を-1としてそのまま入力（正規化なし）
- 次元数：連続17×2（値＋欠損フラグ）＋カテゴリ13＝47
- 略称の正式名称（暫定．医師に確認予定）[user]：
  - 連続変数：Age（年齢），BW（体重），HT（身長），sBP（収縮期血圧），HR（心拍数），
    LVEF（左室駆出率），Cre（クレアチニン），BS（血糖値），HbA1c，PLT（血小板数），
    T-chol（総コレステロール），HDL-C（HDLコレステロール），LDL-C（LDLコレステロール），
    TG（中性脂肪），BNP（脳性ナトリウム利尿ペプチド），TnI（トロポニンI），CK-MB（CK-MB）
  - カテゴリ変数：Men（男性），DM（糖尿病），HTN（高血圧），DL（脂質異常症），
    Smoking（喫煙），HD（血液透析），OMI（陳旧性心筋梗塞），HF_history（心不全既往），
    TnElevation（トロポニン上昇），Diagnosis（病型），Killip（Killip分類），
    ST_deviation（ST偏位），CA（心停止）
  - 値の定義（Diagnosisの区分，Killipの範囲，ST_deviation・TnElevationの基準，
    BSの採血時点，Smokingの区分）は未確認．CAは心停止と解釈（要確認）

### プラーク面積特徴（4次元） [code: plaque_area.py, handcraft_features.py]
- 使用：減衰プラークの面積に関する4統計量（total / max / min / std）．
  石灰化プラークの面積も算出されているが，config上は使用していない
- フレームごとの面積の算出：
  医師が付与した減衰プラーク角度の扇形（中心・始点・終点で定義）と，
  血管領域から血管腔を除いた領域（Vessel − Lumen）の共通部分のピクセル数を数える．
  同一フレーム内に複数の扇形がある場合は和集合とする
- 単位換算：面積[mm²] ＝ ピクセル数 × pixel_spacing（行）× pixel_spacing（列）．
  pixel spacingは症例ごとにDICOMタグから取得
- Vesselアノテーションのないフレーム：アノテーション済みフレームから，
  血管中心と放射方向距離を線形補間してVessel輪郭を補完．
  補間に必要なアノテーションが2フレーム未満の場合など，補間に失敗したときは処理を停止
- 症例レベルへの集約：中心フレームの前後6枚（計13フレーム）のフレーム別面積に対して，合計・最大・最小・標準偏差（母標準偏差）を算出．
  プラークアノテーションが存在するのが13フレームのため [Notion]．
  画像入力（32フレーム）と範囲が異なる点は，Methodに事実として記載し，Limitationsでも触れる（再実験は行わない）[user]
- 角度が不完全なプラークアノテーションを含む症例は，面積算出の対象から除外される設計（EXCLUDED_CASE_IDS）．
  287例との関係は未確認．要確認
- 注意：cnn_handcraft.yamlのコメントには「プラーク面積 pixel」とあるが，コード上はmm²．
  コメントが古いものと判断（case_features_13.csvの値の大きさもmm²と整合）
- 特徴量のZ-score化（train fold基準）はconfigのコメント記載のみで，コード側は未確認

## 3.3 Proposed Architecture: KSCNet
- KSCNetはUSCNet（3D原型）の2D適応 [Notion]
- Stage1：フレーム単位2D KSCNet（PatchEmbed→ViT→UNETR，重み共有）→ f_i（CEA用），s_i（SMA用），seg_i
- Stage2：臨床情報＋プラーク特徴を追加トークン化し，位置Embedding＋種別Embeddingを付与してフレーム間Transformer（self-attention）
- Stage3：セグメンテーション由来の特徴（S）をqueryにしたcross-attentionで症例レベル特徴を集約
- Stage4：分類ヘッド（d→256→BN→ReLU→Dropout→1）
- 損失：Dynamic Loss．セグメンテーションのDice損失，症例分類のBCE損失とFocal損失（α=0.25，γ=2）の3項の重み付き和．
  重みはvalidationのS_Diceに応じてepochごとに更新 [code: M_Classification/src/utils/loss.py]．
  クラス重み（pos_weight）は使用しない．Focal損失のαはラベルによらず一定の0.25倍（クラス間の重み付けではない）
- config上の値：hidden_size 384，patch_size 16，num_heads 12，mlp_dim 3072，feature_size 16，
  frame_transformer_layers 2，dynamic_loss_lambda 0.1，dropout 0.0 [config: kscnet_ivus.yaml]
- セグメンテーションと合併症予測を，単一モデルで同時に解く（Dice 0.816）[Notion]

## 3.4 Baseline and Comparison Methods
比較手法は5つ（Notionの主表の行番号：0, 1, 2', 4', 5, 6）．
1. 医師3名の目視読影（下記）
2. 先行研究の減衰プラーク角度スコア（非DL）
3. ResNet-34+LSTM（画像のみ，Class weightなし・batch size 4）
4. ResNet-34+LSTM（画像＋臨床変数＋プラーク面積特徴，Class weightなし・batch size 4）
5. USCNet（3D原型．画像＋臨床変数＋プラーク面積特徴，Class weightなし・batch size 4）

提案手法：KSCNet（画像＋臨床変数＋プラーク面積特徴）．
LightGBMなどの表形式の機械学習手法は，使用せず，比較にも含めない．
臨床情報のみ・プラーク特徴なしのResNet-34+LSTM（E3）も，論文には載せない．

### 医師による読影（Method内に含める．使用可と確認済み：2026-10-01 [Notion]）
- 読影者：3名の循環器内科医．十分な経験年数を有する．経験年数の具体的な数値は書かない [user]
- 使用ツール：Streamlit製の自作アノテーションツール（ローカルWebアプリ）[tool]
- 提示内容：1症例あたり約20フレームのIVUS画像をスライダーで前後に閲覧できる [tool: README]．
  ツール上に臨床情報の入力・表示欄は確認できない（画像のみの読影．要確認）
- 入力：確信度（0〜100%）．
  50以上を陽性（No reflow / Slow flow あり），49以下を陰性として自動判定．
  判断根拠（石灰化プラーク多/少，減衰プラーク多/少，その他）と自由記述も記録 [tool]
- 評価：全287例について，3名が独立に予測 [Notion]．
  モデルと同じ5-foldのtest症例に対して，fold別に評価し，平均±標準偏差を算出．
  AUCは確信度を0〜1に正規化したスコアで算出し，
  Accuracy・Precision・Recall・F1・Specificityは確信度≥50を陽性として算出
  （モデルと異なり，閾値にYouden indexは使用しない）[code: annotation_analysis.py]
- 3名の結果の扱い：主表は3名の平均（fold別に算出してから平均）．
  個別の結果は別表とし，ROC上に3点として置く案がある [Notion: Todo]
- 医師間の一致度（Fleissのκ，全会一致率など）：本論文では副次的所見として扱う [Notion]

## 3.5 Evaluation Protocol
- 主指標はAUC，副指標はF1．Accuracy・Specificityは主張に使わない [Notion]．
  AUC, Accuracy, Precision, Recall, F1, Specificity，Dice(Vessel+Lumen領域のSegmentation用)を算出
- 5-fold CVのfoldごとに算出してから平均（pooledは使用しない），平均±標準偏差で報告 [code: environment_constraints.md]
- 2値の指標の閾値：モデルはvalidationのYouden index，医師は確信度50 [Notion][code]
- 比較の設計意図：
  - 3 vs 4：入力の追加（画像のみ→画像＋臨床＋プラーク）の変化．観察のみ（個別の寄与は主張しない）
  - 4 vs 5：2D＋系列処理と3Dの比較（入力・Class weight・batch sizeは同一．損失とdropoutはアーキテクチャごとに異なる）
  - 4 vs KSCNet：アーキテクチャの違い（入力・Class weight・batch sizeは同一．損失とdropoutは異なる）
  - 5 vs KSCNet：3D原型と2D適応の比較
  - 1（医師）vs 3：入力条件が同じ（画像のみ）の比較
  - 2（先行研究スコア）vs 全て：先行研究のスコアを上回るか
  - 注意：4，5，KSCNetは臨床変数・プラーク面積特徴も使う点を，本文で明記する必要あり
- 手法間の統計的検定は実施しない（2026-10-12）．
  差の記述は，平均±標準偏差とfold別の勝敗数にとどめる（Notion Todoの「検定」項目は，方針に合わせて要整理）

## 3.6 Implementation Details
- 計算環境：NVIDIA RTX A6000（48 GB）1枚．Python 3.10.12，PyTorch 2.4.1（CUDA 12.1），timm 0.4.12．
  archimedes・newtonのいずれも同一構成．再実験（E4'）はarchimedesで実行（memo.txt記載）[result][user]
- 学習：Adam，最大200エポック，early stopping（patience 20），
  学習率スケジューラ（ReduceLROnPlateau型：factor 0.5，patience 10，min_lr 1e-7），シード42，5-fold CV [config]
- ハイパーパラメータ探索：各foldでランダムサーチ20試行，
  validation AUCが最大の試行を最良モデルとして採用 [code: random_search.py, analyzer.py]
  - 学習率：10⁻³〜10⁻⁵を対数一様に抽出
  - Adamのβ₁：0.90〜0.99（1 − 10⁻ˣ，xは1〜2の一様乱数）
  - バッチサイズ：全モデルで4
  - weight decayはAdamのため0（使用しない）
  - 探索の乱数はシードと試行番号で決まるため，同じ試行番号では全手法で学習率・β₁が一致する [code][result]
- Class weight：全モデルで使用しない [config][result]（保存済みの全YAMLで確認）
- ResNet-34+LSTM固有：LSTM 2層，隠れ層256，dropout 0.4，損失はCross Entropy [config: cnn_handcraft.yaml]
- KSCNet・USCNet：損失はDice＋BCE＋Focalの動的重み付き和，dropout 0.0．3.3参照
- USCNet（3D原型）：入力が深さ32の3Dボリューム．KSCNetとの差はframe_transformer_layersの有無と入力次元 [config: kscnet_ivus_3d.yaml]．
  結果は 3DUSCNet_ver1 のフォルダのみを使用 [user]
- 評価対象：USCNetも，2Dと同じ287例（fold別58, 58, 58, 57, 56）の予測が保存されている [result]

## 未解決・要相談
- 3.2：略称の正式名称は暫定名称を記載済み．医師に確認する（特にCA，各変数の値の定義）[user]
- 3.2：EXCLUDED_CASE_IDSと287例の関係
- 3.2：極座標変換後のサイズ．preprocess_all.pyの既定は(254, 224)，configのimg_sizeは224×224．
  どの段階で224×224になるか未確認
- 3.2：特徴量のZ-score化（train fold基準）をコード側で確認
- 3.4：医師の読影時の提示情報（画像のみか）の確認
- 3.4：Notion主表の医師のAUC「0.636 ± 0.08」は，医師3名の平均表のStd 0.087（0.087239）と表記が異なる．確認
- 3.6：batch size 4の理由の記載．config上は下限が4に固定される仕様．GPUメモリの制約と書く前に，
  KSCNetをbatch size 8で動かしてメモリ不足になるか，確認する
- 3.6：USCNetのmemo.txtにある「seg maskのあるフレームがない7症例を除外」の意味
  （予測は287例分あるため，学習時のみの除外か，別の処理か）
- 3.6：E2'のmemo.txtが空．実行したサーバーとコミットの記録
