diff --git "a/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" "b/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" index 00c5fef..33ea87a 100644 --- "a/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" +++ "b/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" @@ -53,7 +53,7 @@ - ラベルは現在フォルダ名で表現されている.基盤に登録するときは,フォルダ名から読み取ったラベルを目録の項目として記録する - 画像の番号(ファイル名)と,DeepTIAS の出力側の患者 ID・何枚目の画像かの対応は,研究室 PC の対応表(`E:\clinical-data\DeepTIAS後_ID_番号.xlsx`)にある.2026-10-03 に件数だけを照合し,1085 枚が約 450 人分(2 枚以上の患者が 239 人・874 枚)であることが分かった(TIASJudgeModel の「1 患者 1 枚」の前提は誤りで,ユーザーも確認済み).患者単位で扱うには,この対応表を取り込みに使う必要がある - DeepTIAS の出力(元は患者 ID のフォルダ `DeepTIAS後_亥鼻_村上_2025.08修正`)は,2026-10-03 に舌色データセットで使った画像の分だけを番号ごとのフォルダへ移し,残り(使わない出力 約 8GB)を削除した(元のデータは研究室のサーバにある).各番号の画像は `2-cropped` × `3-resized`(127 超)で作り直したものと画素で一致する(完全一致 1073・違う画素 1% 未満 12).経緯は `docs/PROGRESS.md` -- 舌色データセットには**同じ写真の重複**が 5 組ある(2026-10-03 確認).ファイルが同一で対応表の患者 ID が違う 2 組(122/184・548/566.ラベルは同じ),ほぼ同じ画像(違う画素約 0.7%)が連番で 2 回登録された 3 組(381/382・508/509・515/516.うち 381/382 は程度,515/516 は舌色のラベルが違う).382・509・516 のフォルダの DeepTIAS 出力は,それぞれ 381・508・515 の出力のコピー(元の出力は見つからなかった) +- 舌色データセットには**同じ写真の重複**が 5 組ある(2026-10-03 確認).ファイルが同一で対応表の患者 ID が違う 2 組(122/184・548/566.ラベルは同じ),ほぼ同じ画像(違う画素約 0.7%)が連番で 2 回登録された 3 組(381/382・508/509・515/516.うち 381/382 は程度,515/516 は舌色のラベルが違う).382・509・516 のフォルダの DeepTIAS 出力は,それぞれ 381・508・515 の出力のコピー(元の出力は見つからなかった).扱いは,確かめられるまで 9 枚を保留にする(2026-10-06.`holds/tiasjudgemodel.toml`・PLAN_02) ### 表せるようにする関係 (Relationships) 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 e2c4592..8e7a036 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" @@ -14,15 +14,19 @@ | --- | --- | --- | | 1 | **設定と目録の土台**: `config.py`(設定ファイルの読み込み・検証),`catalog/`(接続・マイグレーションの適用),`catalog/migrations/catalog/0001`(SPEC_02 の全表と最初の種類)・`identity/0001`(対応表),`tiasdata init`(2026-10-06 完了) | 一時ディレクトリの設定ファイルから `init` で目録ができ,`PRAGMA user_version` が最新になる.テスト(設定ファイル・マイグレーション)が通る | | 2 | **ストア**: `store.py`(ハッシュ・コピー・照合),テスト用のダミーデータ(小さい画像・取り込み元のフォルダ)を作る `conftest.py`(2026-10-06 完了) | 同じ中身が 1 つにまとまり,コピー後の照合・上書きしないことがテストで確かめられる | -| 3 | **取り込みと点検**: `kinds/`(`tongue_color` の値の型),`importers/tongue_color_folders`(9 フォルダ+対応表の xlsx → 症例・撮影・ファイル・所見・由来.患者 ID は `identity.sqlite` へ),`tiasdata import`・`stats`・`check` | ダミーの 9 フォルダと対応表を取り込め,同じ患者の複数枚が同じ症例にまとまる.2 回実行しても同じ結果になる.想定外の構成・対応表に無い番号で停止する.出力に患者 ID・元のファイル名が出ない.`check` がストアの書き込み可能なファイル(読み取り専用が外れたもの)の数を報告する | +| 3 | **取り込みと点検**: `kinds/`(`tongue_color` の値の型),`importers/tongue_color_folders`(9 フォルダ+対応表の xlsx → 症例・撮影・ファイル・所見・由来.患者 ID は `identity.sqlite` へ),`tiasdata import`・`stats`・`check` | ダミーの 9 フォルダと対応表を取り込め,同じ患者の複数枚が同じ症例にまとまる.2 回実行しても同じ結果になる.想定外の構成・対応表に無い番号で停止する.保留リストの番号を飛ばし,保留の件数を報告する.出力に患者 ID・元のファイル名が出ない.`check` がストアの書き込み可能なファイル(読み取り専用が外れたもの)の数を報告する | | 4 | **データセットと版**: `datasets/tongue_color.toml`,`datasets.py`(定義の評価・版の作成),`tiasdata dataset freeze`・`list`・`show` | 所見を足す・訂正しても過去の版の構成が変わらない.構成が同じなら版を作らない.ダミーの所見の種類を 1 つ足しても既存の表を変えずに済む | | 5 | **バンドル**: `bundle.py`(書き出し・読み込み・検証),`tiasdata export`,公開 API(`load`・`open_bundle`・`Bundle.fingerprint`) | 書き出したバンドルを目録なしで読める.改変・欠けを検出する.同じ版から同じ `manifest.csv` が得られる | -| 6 | **研究室 PC での運用開始**: 立ち上げの成果物と Step 1〜5 を `main` に取り込む → 研究室 PC に GitHub から clone・設定ファイル作成・`init` → 舌色データ(1085 枚)を取り込み → `check`・`stats` → 版 1 を作成 → `tiasdata backup` | すべて手元 PC から SSH で行える.件数が 1085 枚・9 グループで TIASJudgeModel の TEST_01 と一致し,症例が約 450(2026-10-03 の照合値)になる.`check` が問題 0 件 | +| 6 | **研究室 PC での運用開始**: 立ち上げの成果物と Step 1〜5 を `main` に取り込む → 研究室 PC に GitHub から clone・設定ファイル作成・`init` → 舌色データ(1085 枚)を取り込み → `check`・`stats` → 版 1 を作成 → `tiasdata backup` | すべて手元 PC から SSH で行える.取り込み 1076 枚+保留 9 枚が 1085 枚・9 グループで TIASJudgeModel の TEST_01 と一致し,症例が約 450(2026-10-03 の照合値)になる.`check` が問題 0 件 | | 7 | **計算サーバへの受け渡し**: `deliver.py`(tar・scp・展開・`sha256sum -c`・記録),`tiasdata deliver` | 版 1 を Newton・Archimedes に渡し,両方で照合が通り,`deliveries` に記録される.データが手元 PC を通らない | -| 8 | **TIASJudgeModel の切り替え**: TIASJudgeModel にサブモジュールを追加し,`tiasdata.load("tongue_color", version=1)` から現行の manifest の形に変換して学習・評価に使う(TIASJudgeModel 側の作業ブランチで行う) | 変換した manifest の件数・`label`・`severity` の内訳が現行の manifest と一致し,`patient_id` が患者単位(約 450 人)になる.患者単位の分割で交差検証をやり直し,現行(画像単位)の成績との差を記録する.実験記録にバンドルの指紋が残る.研究室 PC の固定パスを書かずに済む | +| 8 | **TIASJudgeModel の切り替え**: TIASJudgeModel にサブモジュールを追加し,`tiasdata.load("tongue_color", version=1)` から現行の manifest の形に変換して学習・評価に使う(TIASJudgeModel 側の作業ブランチで行う) | 変換した manifest の件数・`label`・`severity` の内訳が,現行の manifest から保留の 9 枚を除いたものと一致し,`patient_id` が患者単位(約 450 人)になる.患者単位の分割で交差検証をやり直し,現行(画像単位)の成績との差を記録する.実験記録にバンドルの指紋が残る.研究室 PC の固定パスを書かずに済む | - Step 6 の前に,立ち上げの成果物(`chore/project-setup`)を `main` に取り込む -- **Step 3 までに決めること**: 舌色データセットの重複 5 組(PLAN_01「現在あるデータ」)の扱い.特にファイルが同一の 2 組(122/184・548/566)は,SPEC_02 の「同じ中身を別の撮影として登録しようとしたら停止する」に当たり,このままでは取り込みが止まる(どちらを残すか・両方を別の撮影として許すか・除外するか).ラベルが違う 2 組(381/382・515/516)の正解の扱いも決める +- **舌色データセットの重複 5 組の扱い**(2026-10-06 のユーザー判断): 基盤では正解を推測で決めず,確かめられるまで**保留**にする.保留リスト `holds/tiasjudgemodel.toml`(SPEC_03「保留リスト」)に 9 枚を載せ,取り込みで飛ばす + - ファイルが同一で患者 ID が食い違う 2 組(122/184・548/566): 両方とも保留.研究室のサーバの元のデータでどちらの患者かを確かめる + - ラベルが違う 2 組(381/382・515/516): 両方とも保留.評価者に正しいラベルを確かめる + - ラベルが同じ重複の 1 組(508/509): DeepTIAS の出力と完全一致する 508 を残し,509 だけ保留 + - 確かめ終わったらリストから外して取り込み直し,データセットの新しい版を作る - Step 6・7 はコード(Step 7 の `deliver`)と運用(研究室 PC・サーバでの実行)が混ざる.運用の手順と結果は ENV_02・ENV_03 に記録する - Step 8 の終了時点で PLAN_01 の成功基準 1〜7 を確認する diff --git "a/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" "b/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" index 73ddc3b..372a868 100644 --- "a/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" +++ "b/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" @@ -66,6 +66,7 @@ │ ├── deliver.py # 計算サーバへの受け渡し │ └── cli.py # エントリポイント ├── datasets/ # データセットの定義(TOML) +├── holds/ # 取り込み元ごとの保留リスト(TOML.SPEC_03「保留リスト」) ├── tests/ # ダミーデータのみで動くテスト └── docs/ ``` diff --git "a/docs/04_SPEC/SPEC_03_\343\203\207\343\203\274\343\202\277\343\202\273\343\203\203\343\203\210\343\201\250\345\217\227\343\201\221\346\270\241\343\201\227.md" "b/docs/04_SPEC/SPEC_03_\343\203\207\343\203\274\343\202\277\343\202\273\343\203\203\343\203\210\343\201\250\345\217\227\343\201\221\346\270\241\343\201\227.md" index d088f5e..142b15e 100644 --- "a/docs/04_SPEC/SPEC_03_\343\203\207\343\203\274\343\202\277\343\202\273\343\203\203\343\203\210\343\201\250\345\217\227\343\201\221\346\270\241\343\201\227.md" +++ "b/docs/04_SPEC/SPEC_03_\343\203\207\343\203\274\343\202\277\343\202\273\343\203\203\343\203\210\343\201\250\345\217\227\343\201\221\346\270\241\343\201\227.md" @@ -108,7 +108,7 @@ | コマンド | 役割 | | --- | --- | | `tiasdata init` | 設定ファイルに従って目録・ストアを作り,マイグレーションを適用する | -| `tiasdata import <取り込み元>` | 取り込み元を読み,ファイルをストアにコピーして症例・撮影・ファイル・所見・由来を登録する(取り込み元の形ごとに importer を用意する.最初は舌色の 9 フォルダ `tongue_color_folders`) | +| `tiasdata import <取り込み元>` | 取り込み元を読み,ファイルをストアにコピーして症例・撮影・ファイル・所見・由来を登録する(取り込み元の形ごとに importer を用意する.最初は舌色の 9 フォルダ `tongue_color_folders`).保留リストの番号は飛ばし,件数を報告する | | `tiasdata dataset list` / `show <名前>` | データセットと版の一覧・件数 | | `tiasdata dataset freeze <名前>` | 新しい版を作る | | `tiasdata export <名前> --version <版>` | バンドルを `bundles/` に書き出す | @@ -121,6 +121,16 @@ - 登録・版の作成は 1 つのトランザクションで行い,途中で失敗したら何も残さない - 問題を見つけたら黙って飛ばさず,件数と理由を表示して停止する(`check`・`stats` は止めずに件数を報告する) +## 保留リスト (Hold List) + +取り込み元のデータに,基盤では正解を決められない問題(同じ写真の重複・患者 ID やラベルの食い違い等)があるとき,確かめられるまで取り込まずに**保留**にする.推測で片方を選んで版に固定しないため. + +- `holds/<取り込み元の名前>.toml` に置く(リポジトリで管理し,PR で変更する).患者 ID は書かない +- 1 件ごとに `number`(取り込み元での番号)・`reason`(理由)・`resolve`(確かめる方法)・`since`(保留にした日)を書く +- `tiasdata import` は保留の番号を飛ばし,保留の件数を報告する(黙って外さない).保留リストにあるのに取り込み元に無い番号は停止する(リストの誤りを見逃さないため) +- 確かめ終わったら行を消して取り込み直し,データセットの新しい版を作る.過去の版は変わらない +- 最初の保留リストは `holds/tiasjudgemodel.toml`(舌色データセットの重複 5 組のうち 9 枚.PLAN_02「舌色データセットの重複 5 組の扱い」) + ## 出力の規則 (Output Rules) CLI の出力・ログ・エラーメッセージに出してよいもの・出さないもの.Claude が SSH 経由で CLI を実行し,その出力を読むことを前提にする. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index d73df2e..9698c18 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -32,3 +32,5 @@ - 設計判断: ストアのファイルは読み取り専用にする(誤操作対策.「直したい」場合も書き換えず,新しいファイル・所見の訂正・新しい版で扱う.本当に消す場合は将来の専用コマンドで記録を残して消す).store フォルダが無ければ作らずに止める.同じ中身で拡張子が違うファイルは Step 3 の取り込みで止める - 追加の判断: 既にあるファイルを再利用したとき(同じ中身を再び取り込んだとき)も読み取り専用を付け直す(バックアップからの復元・手作業等で属性が外れたファイルを守り直すため).取り込みで触らないファイルの属性は,Step 3 の `check` で書き込み可能なファイルの数として報告する - 未実装・後段: POSIX(os.link)の分岐は Windows では未検証 +- [x] **舌色データセットの重複 5 組の扱いを決めた**: 基盤では正解を推測で決めず,確かめられるまで保留にする(2026-10-06).保留リスト `holds/tiasjudgemodel.toml` に 9 枚(122・184・548・566・381・382・515・516・509)を載せ,取り込みで飛ばして件数を報告する(SPEC_03「保留リスト」).508/509 は DeepTIAS の出力と完全一致する 508 を残す + - 未実装・後段: 122/184・548/566 は研究室のサーバの元のデータで患者を,381/382・515/516 は評価者にラベルを確かめる diff --git a/holds/tiasjudgemodel.toml b/holds/tiasjudgemodel.toml new file mode 100644 index 0000000..59cac3e --- /dev/null +++ b/holds/tiasjudgemodel.toml @@ -0,0 +1,60 @@ +# 取り込み元 tiasjudgemodel(舌色データセット)の保留リスト +# +# ここに載せた番号(画像のファイル名の番号)は取り込みで飛ばし,件数を報告する(SPEC_03「保留リスト」). +# 確かめ終わったら行を消して取り込み直し,データセットの新しい版を作る.過去の版は変わらない. +# 患者 ID は書かない(番号はファイル名の連番で,個人をたどれる情報を含まない). +# 経緯は docs/03_PLAN/PLAN_01_要件定義書.md「現在あるデータ」・docs/PROGRESS.md(2026-10-03) + +[[hold]] +number = 122 +reason = "184 と同じ写真(ファイルが同一).対応表では 184 と別の患者 ID になっている" +resolve = "研究室のサーバの元のデータで,どちらの患者の写真かを確かめる" +since = "2026-10-06" + +[[hold]] +number = 184 +reason = "122 と同じ写真(ファイルが同一).対応表では 122 と別の患者 ID になっている" +resolve = "研究室のサーバの元のデータで,どちらの患者の写真かを確かめる" +since = "2026-10-06" + +[[hold]] +number = 548 +reason = "566 と同じ写真(ファイルが同一).対応表では 566 と別の患者 ID になっている" +resolve = "研究室のサーバの元のデータで,どちらの患者の写真かを確かめる" +since = "2026-10-06" + +[[hold]] +number = 566 +reason = "548 と同じ写真(ファイルが同一).対応表では 548 と別の患者 ID になっている" +resolve = "研究室のサーバの元のデータで,どちらの患者の写真かを確かめる" +since = "2026-10-06" + +[[hold]] +number = 381 +reason = "382 とほぼ同じ画像(違う画素 約 0.7%)で,程度のラベルが違う(381: 紅_ややあり / 382: 紅_あり)" +resolve = "評価者にどちらのラベルが正しいかを確かめる" +since = "2026-10-06" + +[[hold]] +number = 382 +reason = "381 とほぼ同じ画像(違う画素 約 0.7%)で,程度のラベルが違う(381: 紅_ややあり / 382: 紅_あり)" +resolve = "評価者にどちらのラベルが正しいかを確かめる" +since = "2026-10-06" + +[[hold]] +number = 515 +reason = "516 とほぼ同じ画像(違う画素 約 0.7%)で,舌色のラベルが違う(515: 紫_ややあり / 516: 暗赤紅_ややあり)" +resolve = "評価者にどちらのラベルが正しいかを確かめる" +since = "2026-10-06" + +[[hold]] +number = 516 +reason = "515 とほぼ同じ画像(違う画素 約 0.7%)で,舌色のラベルが違う(515: 紫_ややあり / 516: 暗赤紅_ややあり)" +resolve = "評価者にどちらのラベルが正しいかを確かめる" +since = "2026-10-06" + +[[hold]] +number = 509 +reason = "508 と同じ写真を処理し直した重複(違う画素 約 0.7%.ラベルは同じ).DeepTIAS の出力と完全一致するのは 508" +resolve = "不要(508 を残す).重複なので保留のままでよい" +since = "2026-10-06"