diff --git a/CLAUDE.md b/CLAUDE.md index 0afcc4e..6e3cd7f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,7 +5,7 @@ ## 開発進捗 -最新: データセット構成を調査し SPEC・ENV_03 に反映.次は PLAN_02 の Step 1(基盤: 設定スキーマ・合成データ・manifest・患者単位分割) +最新: 臨床データ 1085 枚を Newton へ転送完了.次は PLAN_02 の Step 1(基盤: 設定スキーマ・合成データ・manifest・患者単位分割) ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). ## 必須ルール(コード実装時) diff --git "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index 78b951a..e1142dc 100644 --- "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -77,15 +77,26 @@ | `淡白_あり` | `images/pale_strong` | | `淡白_ややあり` | `images/pale_mild` | +### 研究室 PC から Newton への鍵設定 (Key Setup) + +研究室 PC から Newton へ非対話で転送するため,**研究室 PC 専用の鍵**を作って Newton に登録する(2026-09-27 に実施済み). + +- 研究室 PC の鍵: `C:\Users\Papin\.ssh\id_ed25519_newton`(パスフレーズなし.コメントは `papin-DESKTOP-1QLOO91-to-Newton-TIASJudgeModel`) +- Newton 側: 上記の公開鍵を `~/.ssh/authorized_keys` に追記済み +- 初回接続時は Newton のホスト鍵を受け入れる必要がある(`-o StrictHostKeyChecking=accept-new`) + +※ Windows の OpenSSH サーバーは **SSH エージェント転送に対応していない**ため,手元の鍵を研究室 PC 経由で使い回すことはできない(専用鍵が必要になる理由). + ### 手順 (Procedure) 1. 研究室 PC で作業する(**`hostname` で研究室 PC であることを確かめてから実行する**) 2. PowerShell で以下を実行する(対応表どおりに 9 フォルダを転送する) ```powershell - $src = "C:\Users\Papin\clinical-data\TIASJudgeModel" - $dst = "hasegawa@192.168.23.14:~/data/TIASJudgeModel/images" - $map = @{ + $key = "$env:USERPROFILE\.ssh\id_ed25519_newton" + $root = "C:\Users\Papin\clinical-data\TIASJudgeModel" + $rhost = "hasegawa@192.168.23.14" + $map = [ordered]@{ "淡紅(正常)" = "light_red_normal" "暗赤紅_あり" = "dark_red_strong" "暗赤紅_ややあり" = "dark_red_mild" @@ -96,13 +107,19 @@ "淡白_あり" = "pale_strong" "淡白_ややあり" = "pale_mild" } - ssh hasegawa@192.168.23.14 "mkdir -p ~/data/TIASJudgeModel/images" foreach ($k in $map.Keys) { - ssh hasegawa@192.168.23.14 "mkdir -p ~/data/TIASJudgeModel/images/$($map[$k])" - scp "$src\$k\*.png" "$dst/$($map[$k])/" + $slug = $map[$k] + ssh -i $key $rhost "mkdir -p ~/data/TIASJudgeModel/images/$slug" + $files = @(Get-ChildItem -LiteralPath (Join-Path $root $k) -File -Filter *.png) + for ($i = 0; $i -lt $files.Count; $i += 100) { + $chunk = $files[$i..([Math]::Min($i+99, $files.Count-1))] | ForEach-Object { $_.FullName } + scp -i $key -q @chunk ($rhost + ":~/data/TIASJudgeModel/images/" + $slug + "/") + } } ``` + ※ `scp "...\*.png"` のようにワイルドカードを渡す方式は使わない(PowerShell はネイティブコマンドの引数を展開しないため).ファイル一覧を列挙して 100 件ずつ渡す(コマンドライン長の上限を避けるため). + 3. コピー後に件数を突き合わせる ```powershell @@ -112,6 +129,10 @@ 4. 原本は研究室 PC に残す(Newton 側は作業用コピー) +### 実施記録 (Completion Record) + +2026-09-27 に上記手順で転送完了.Newton 側 `~/data/TIASJudgeModel/images/` に **9 ディレクトリ・1085 ファイル(443 MB)**.研究室 PC 側の件数と完全一致し,非 PNG は 0 件.ディレクトリ権限は `drwx------`.転送は研究室 PC → Newton の直送であり,手元 PC は制御コマンドのみを送っている(画像は手元を通っていない). + 以降は再転送しない.データセットの内容確認(枚数・クラス分布・破損チェック)はサーバ上のコマンドで行い,**集計結果のみ**を手元で見る. ※ 研究室 PC から Newton への鍵が未登録の場合はパスワードを求められる. diff --git "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" index ac37eb8..461c9e5 100644 --- "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" +++ "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" @@ -11,7 +11,7 @@ | 3 | データセット集計(実データの素性把握) | **臨床データのコピー完了**・倫理確認 | | 4 | 学習パイプライン最小版(ConvNeXt-Tiny を 1 本通す) | Step 2・3 | | 5 | 評価・レポート生成(指標・混同行列・`runs/` 出力) | Step 4 | -| 6 | ベースライン比較(TIASjudge のルールベース) | Step 5 | +| 6 | ベースライン比較(TIASjudge のルールベース)※ 後回し | Step 5 | | 7 | 実験反復(不均衡対策・モデル比較・解像度検討) | Step 6 | | 8 | 結論(5-fold 交差検証・評価レポート・配布形式の判断) | Step 7 | @@ -48,6 +48,8 @@ ## Step 6: ベースライン比較 (Baseline) +> ⚠ **一旦後回しとする**(2026-09-27 のユーザー判断).入力条件の違い(TIASjudge は撮影画像から ROI を取るが,本データセットは舌領域を黒背景で切り出した画像)を揃える設計判断が必要なため,機械学習側のパイプラインを先に通す.Step 5 の後に Step 7 へ進み,本ステップは条件が整った時点で実施する. + - **成果物**: `baseline/`(TIASjudge のルールベース診断),比較レポート - **完了条件**: 同一テストセットでルールベースと機械学習モデルの指標が並べて出る - **ここで決める**: ルールベースを移植するか別リポジトリを参照するか(SPEC_02 の未確定事項) diff --git "a/docs/06_TEST/TEST_01_\343\203\207\343\203\274\343\202\277\343\202\273\343\203\203\343\203\210\346\247\213\346\210\220\350\252\277\346\237\273.md" "b/docs/06_TEST/TEST_01_\343\203\207\343\203\274\343\202\277\343\202\273\343\203\203\343\203\210\346\247\213\346\210\220\350\252\277\346\237\273.md" index 495de30..969a3a0 100644 --- "a/docs/06_TEST/TEST_01_\343\203\207\343\203\274\343\202\277\343\202\273\343\203\203\343\203\210\346\247\213\346\210\220\350\252\277\346\237\273.md" +++ "b/docs/06_TEST/TEST_01_\343\203\207\343\203\274\343\202\277\343\202\273\343\203\203\343\203\210\346\247\213\346\210\220\350\252\277\346\237\273.md" @@ -43,10 +43,26 @@ サイズが画像ごとに異なることから,舌領域のバウンディングボックスで切り出されていると考えられる. +## データの由来 (Provenance) + +2026-09-27 にユーザーへ確認した事項. + +| 項目 | 内容 | +| --- | --- | +| 撮影 | **TIAS(SmTIAS 系の撮影システム)**で撮影されたもの | +| セグメンテーション | **専用の機械学習モデル**による自動切り出し(手動ではない) | +| 患者と画像の対応 | **1 患者 1 枚**(確定) | +| データ利用 | 機械学習での利用について問題ないことを確認済み | +| ファイル名 | 1085 件すべて ASCII 文字のみ(日本語・非 ASCII を含まない) | +| ファイルの更新日時 | 2025-11-04〜2025-12-05(1073 件が 2025-11).これはセグメンテーション出力時の日付であり,撮影日時ではない | + +※ 自動セグメンテーションのため,切り出し誤差がノイズ源になりうる(誤分類の分析時に考慮する). +※ 撮影日時・端末・撮影設定のメタデータは本データセットには含まれない. + ## 確定した事項 (Resolved Items) - **マスク外は黒 (0, 0, 0)**.リサイズ時のパディングも黒で統一すれば背景が一貫する -- **1 患者 1 枚**(2026-09-27 にユーザーが確認).画像単位の分割が患者単位の分割と一致する +- **1 患者 1 枚**(2026-09-27 にユーザーが確定).画像単位の分割が患者単位の分割と一致する - クラス名は「暗赤紅」(SPEC_01 のクラス定義を修正した) - 程度(あり / ややあり)は manifest の `severity` 列として保持し,学習は 5 クラスで行う @@ -55,6 +71,7 @@ - 入力解像度 224 で足りるか(平均 675×614 から約 1/3 に縮小するため,微細な色ムラが失われないかを検証する) - 黒背景が面積の大半を占める画像があり,正規化や統計の取り方(画像全体か舌領域内のみか)を検証する必要がある - 医師ラベルの評価者間一致率は不明(分かれば性能の上限の目安になる) +- 自動セグメンテーションの精度(切り出し誤差がどの程度あるか)は未評価 ## 調査方法 (Method) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 083f8bb..3030b21 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -49,3 +49,11 @@ - 運用上の発見: 研究室 PC は「ドキュメント」が OneDrive(大学テナント)にリダイレクトされているため,臨床データをそこに置くとクラウドへ同期される.プロファイル直下の独自フォルダ(`clinical-data`)を使う方針を ENV_03 に明記した - 調査の技術メモ: 研究室 PC の PowerShell 出力は CP932 で返るため取得側で UTF-8 変換が必要.複雑なスクリプトは `-EncodedCommand`(UTF-16LE + Base64)で渡すと引用符の問題を回避できる +## 臨床データの転送(Step 3 の前提) + +- [x] **研究室 PC から Newton へ臨床データ 1085 枚(443 MB)を転送**: 研究室 PC 上で `scp` を実行させる形にし,画像は研究室 LAN 内で直送した(手元 PC は制御コマンドのみ).件数はフォルダごとに元と完全一致,非 PNG は 0 件.手順と実施記録は [ENV_03](02_ENV/ENV_03_管理者用環境構築手順.md). + - 失敗パターン: ① 研究室 PC には Newton 用の鍵が無く非対話のパスワード認証は不可 / ② **Windows の OpenSSH サーバーはエージェント転送に非対応**のため手元の鍵を貸せない / ③ Newton から研究室 PC を引く経路も不可(研究室 PC の sshd は Tailscale 範囲のみ許可)→ 研究室 PC 専用鍵を作って Newton に登録する方式で解決 + - 判断: 手元 PC を中継する方式は技術的には可能だが,臨床データが手元を通るため方針違反として採らなかった + - 実装上の注意: PowerShell はネイティブコマンドの引数を展開しないため `scp "...\*.png"` は使えない.ファイルを列挙して 100 件ずつ渡す(コマンドライン長の上限対策).日本語フォルダ名は `