diff --git a/drafts/ja/3_method.md b/drafts/ja/3_method.md index c688c03..5942009 100644 --- a/drafts/ja/3_method.md +++ b/drafts/ja/3_method.md @@ -1,35 +1,177 @@ # Method(アウトライン・メモ) -sections/3_method.tex に対応。1セクションずつ書いていく方針のため,まずは構成と使える事実だけをメモしておく(本文はまだ書いていない)。事実の出典は各行末に記載([Notion]=AI in Medicineページ / USCNetをIVUS画像を用いて実験ページ、[Notion:西先生]=西先生からの回答|No reflowの処置)。 +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例のACS(STEMI 171 / NSTEMI 109 / UA 7),陽性68例(23.7%),5-fold CV,per-fold平均,閾値はvalidation Youden index [Notion] -- IVUS取得デバイス:Terumo VIEW IT(40MHz)またはAltaView(60MHz)。ほとんどがVIEW ITだが2018年頃からAltaViewの使用が増加 [Notion:西先生] -- アノテーション:血管腔・血管壁(Vessel/Lumen)領域,プラーク角度(減衰・石灰化方向)[Notion] +- 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+CEの平均 セグ損失 + クラス重み付きBCE,動的重み付け) +- 損失: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 -- 先行研究の減衰プラーク角度スコア(非DL) -- LightGBM(臨床+注釈特徴 / 臨床のみ) -- ResNet-34+LSTM(画像のみ / 画像+臨床+プラーク特徴) -- KSCNet(提案手法) -- 医師3名の目視読影:扱い要相談(共同研究先の判断待ち) +比較手法は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 -- Accuracy, Precision, Recall, F1, AUC, PR-AUC, Specificity,キャリブレーション(傾き・切片・Brier) -- 比較の設計意図:3 vs 4(入力の寄与,アーキテクチャ固定)/4 vs 5(アーキテクチャの寄与,入力固定)/2 vs (4,5)(画像は表形式を超えるか)/1 vs 全て(先行研究を超えるか) +- 主指標は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:フレーム数・入力サイズ。「32フレーム・base_processed_96」という設計値があるが,E2(ResNet系のdense 32フレーム対応)が未実施のため確定記述にしてよいか要相談 -- 3.2:特徴量の内訳表記が2通りある(「臨床47+プラーク面積4」と「連続17/カテゴリ13+プラーク面積4」)。要整理 -- 3.4:医師3名の比較をMethodに含めるか(結果はNotionで「保留」,共同研究先の判断待ち) +- 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が空.実行したサーバーとコミットの記録