diff --git "a/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" "b/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" index 78fcebc..c1c236b 100644 --- "a/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" +++ "b/docs/02_ENV/ENV_01_\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.md" @@ -38,6 +38,7 @@ | 画像の読み込み | 使わない(基盤は画像の中身を読まない) | 画素を扱うのは使う側.ダミーデータの生成だけ Pillow を開発用の依存に入れる | - 実行時の依存は **pydantic だけ**にする(使う側の依存と衝突しにくくするため) +- 取り込みで対応表の xlsx を読むための **openpyxl** は,任意の依存(`[project.optional-dependencies]` の `import`)にする.研究室 PC では `uv sync --no-dev --extra import` で入れ,使う側には入れない ## 開発ツール (Development Tools) 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 d15b896..917e727 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" @@ -45,11 +45,12 @@ | データ | 内容 | 原本の置き場所(研究室 PC) | | --- | --- | --- | -| 舌色データセット | 舌領域を切り出した舌画像(PNG).舌色 5 分類+程度のラベルごとに 9 フォルダ・1085 枚.1 患者 1 枚(2026-09-27 確認) | `C:\Users\Papin\clinical-data\TIASJudgeModel\` | +| 舌色データセット | 舌領域を切り出した舌画像(PNG).舌色 5 分類+程度のラベルごとに 9 フォルダ・1085 枚.**1 患者 1 枚ではない**(約 450 人.2 枚以上の患者がいる.下記) | `C:\Users\Papin\clinical-data\TIASJudgeModel\` | | セグメンテーション用データ | ResUNet の開発時の画像と正解マスク | `C:\Users\Papin\clinical-data\TongueSegmentation\` | - 舌色データセットは DeepTIAS 2.7 の Image&Calib モードの出力(色補正後の画像を枠で切り出し,マスク外を黒にしたもの)から作られている(TIASJudgeModel の `SPEC_04`) - ラベルは現在フォルダ名で表現されている.基盤に登録するときは,フォルダ名から読み取ったラベルを目録の項目として記録する +- 画像の番号(ファイル名)と,DeepTIAS の出力側の患者 ID・何枚目の画像かの対応は,研究室 PC の対応表(`C:\Users\Papin\clinical-data\DeepTIAS後_ID_番号.xlsx`)にある.2026-10-03 に件数だけを照合し,1085 枚が約 450 人分(2 枚以上の患者が 239 人・874 枚)であることが分かった(TIASJudgeModel の「1 患者 1 枚」の前提は誤りで,ユーザーも確認済み).患者単位で扱うには,この対応表を取り込みに使う必要がある ### 表せるようにする関係 (Relationships) @@ -63,7 +64,7 @@ └── 由来: 元データ・プログラム名・プログラムの版・作成日時 ``` -- 現在は「1 患者 1 枚」だが,**同じ患者の複数回の撮影・複数枚**に対応する(経時的な撮影を含む) +- 現在のデータにも**同じ患者の複数枚**がある.複数回の撮影・経時的な撮影にも対応する - ラベルは 1 つの撮影に複数付きうる(所見の種類が増える,評価者が複数いる等) ### 今後増やす候補 (Future Data Candidates) 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 0f58262..a866324 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,12 +14,12 @@ | --- | --- | --- | | 1 | **設定と目録の土台**: `config.py`(設定ファイルの読み込み・検証),`catalog/`(接続・マイグレーションの適用),`migrations/0001`(SPEC_02 の全表と最初の種類),`tiasdata init` | 一時ディレクトリの設定ファイルから `init` で目録ができ,`PRAGMA user_version` が最新になる.テスト(設定ファイル・マイグレーション)が通る | | 2 | **ストア**: `store.py`(ハッシュ・コピー・照合),テスト用のダミーデータ(小さい画像・取り込み元のフォルダ)を作る `conftest.py` | 同じ中身が 1 つにまとまり,コピー後の照合・上書きしないことがテストで確かめられる | -| 3 | **取り込みと点検**: `kinds/`(`tongue_color` の値の型),`importers/tongue_color_folders`(9 フォルダ → 症例・撮影・ファイル・所見・由来),`tiasdata import`・`stats`・`check` | ダミーの 9 フォルダを取り込め,2 回実行しても同じ結果になる.想定外の構成で停止する.出力に元のファイル名が出ない | +| 3 | **取り込みと点検**: `kinds/`(`tongue_color` の値の型),`importers/tongue_color_folders`(9 フォルダ+対応表の xlsx → 症例・撮影・ファイル・所見・由来.患者 ID は `identity.sqlite` へ),`tiasdata import`・`stats`・`check` | ダミーの 9 フォルダと対応表を取り込め,同じ患者の複数枚が同じ症例にまとまる.2 回実行しても同じ結果になる.想定外の構成・対応表に無い番号で停止する.出力に患者 ID・元のファイル名が出ない | | 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 と一致する.`check` が問題 0 件 | +| 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 件 | | 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 が現行の manifest と同じ構成(件数・`label`・`severity` の内訳・1 患者 1 枚)になる.実験記録にバンドルの指紋が残る.研究室 PC の固定パスを書かずに済む | +| 8 | **TIASJudgeModel の切り替え**: TIASJudgeModel にサブモジュールを追加し,`tiasdata.load("tongue_color", version=1)` から現行の manifest の形に変換して学習・評価に使う(TIASJudgeModel 側の作業ブランチで行う) | 変換した manifest の件数・`label`・`severity` の内訳が現行の manifest と一致し,`patient_id` が患者単位(約 450 人)になる.患者単位の分割で交差検証をやり直し,現行(画像単位)の成績との差を記録する.実験記録にバンドルの指紋が残る.研究室 PC の固定パスを書かずに済む | - Step 6 の前に,立ち上げの成果物(`chore/project-setup`)を `main` に取り込む - Step 6・7 はコード(Step 7 の `deliver`)と運用(研究室 PC・サーバでの実行)が混ざる.運用の手順と結果は ENV_02・ENV_03 に記録する 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 b6e62a9..df6e9c3 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" @@ -29,7 +29,7 @@ | --- | --- | | 目録(`catalog.sqlite`) | 症例・撮影・ファイル・ラベル・由来・データセットの版・受け渡しの記録([SPEC_02](SPEC_02_データモデル.md)) | | ストア(`store/`) | 登録したファイルの実体.中身の SHA-256 をファイル名にし,変更しない | -| 対応表(`identity.sqlite`) | 実際の患者 ID ↔ 研究用 ID.目録とは別のファイル・別のフォルダに置く.現在のデータには実際の患者 ID が無いため空 | +| 対応表(`identity.sqlite`) | 実際の患者 ID ↔ 研究用 ID.目録とは別のファイル・別のフォルダに置く.現在の舌色データは対応表の xlsx から作る | | バンドル | データセットの 1 つの版を,manifest とファイルのコピーにまとめたもの.計算サーバ・Python 以外のツールへ渡す単位([SPEC_03](SPEC_03_データセットと受け渡し.md)) | | ライブラリ(`tiasdata`) | 目録の操作(研究室 PC)と,バンドルの読み込み・検証(どこでも) | | CLI(`tiasdata`) | 取り込み・データセットの版の作成・バンドルの書き出し・受け渡し・点検(研究室 PC) | @@ -91,6 +91,7 @@ [sources.tiasjudgemodel] # 取り込み元(名前で指定する) path = "C:/Users/Papin/clinical-data/TIASJudgeModel" importer = "tongue_color_folders" +patient_map = "C:/Users/Papin/clinical-data/DeepTIAS後_ID_番号.xlsx" # 画像の番号 → 患者 ID・何枚目(患者 ID は identity.sqlite にだけ入れる) [servers.newton] # 受け渡し先 host = "hasegawa@192.168.23.14" diff --git "a/docs/04_SPEC/SPEC_02_\343\203\207\343\203\274\343\202\277\343\203\242\343\203\207\343\203\253.md" "b/docs/04_SPEC/SPEC_02_\343\203\207\343\203\274\343\202\277\343\203\242\343\203\207\343\203\253.md" index a96996c..d39dbe0 100644 --- "a/docs/04_SPEC/SPEC_02_\343\203\207\343\203\274\343\202\277\343\203\242\343\203\207\343\203\253.md" +++ "b/docs/04_SPEC/SPEC_02_\343\203\207\343\203\274\343\202\277\343\203\242\343\203\207\343\203\253.md" @@ -28,7 +28,8 @@ | データセットの版 | 1 から始まる整数 | `1` | - 研究用 ID は基盤が振る.実際の患者 ID・カルテ番号は目録に入れない(対応表 `identity.sqlite` にだけ置く) -- 現在の舌色データは実際の患者 ID が無く,1 患者 1 枚であるため,**画像 1 枚ごとに症例と撮影を 1 つずつ**作る(対応表は使わない) +- 現在の舌色データは 1 患者 1 枚ではない(PLAN_01「現在あるデータ」).取り込みでは研究室 PC の対応表の xlsx(画像の番号 → 患者 ID・何枚目)を読み,**患者 ID ごとに症例を 1 つ**,**画像 1 枚ごとに撮影を 1 つ**作る.患者 ID は対応表 `identity.sqlite` にだけ入れる +- 同じ患者の複数枚が同じ日の撮影か別の日の撮影かは,現在のデータからは分からないため,撮影日(`captured_on`)は NULL にする ## 表の定義 (Tables) @@ -153,7 +154,7 @@ ## 対応表 (Identity Map) -`identity.sqlite`(目録とは別のファイル・別のフォルダ).実際の患者 ID が分かるデータを取り込むときだけ使う. +`identity.sqlite`(目録とは別のファイル・別のフォルダ).実際の患者 ID が分かるデータを取り込むときに使う(現在の舌色データも対象). | 列 | 内容 | | --- | --- | 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 dfa452c..69f89fa 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" @@ -70,7 +70,7 @@ | `severity` | `tongue_color.severity` | - TIASJudgeModel 側は `tiasdata.load()` でバンドルを読み,自分の manifest の形に変換して使う(変換は TIASJudgeModel 側の実装).基盤側は使う側ごとの形式を持たない -- 現在のデータは 1 患者 1 枚のため,`subject_id` は TIASJudgeModel の現行の `patient_id`(画像 ID)と同じ分け方になる +- `subject_id` は患者単位である.TIASJudgeModel の現行の `patient_id` は画像 ID(「1 患者 1 枚」という誤った前提)のため,**切り替えると分割が患者単位に変わり,交差検証の成績が変わりうる**(同じ患者の画像が学習と評価に分かれなくなる) ## 計算サーバへの受け渡し (Delivery) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index cd6fb7a..ce4e3da 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -15,3 +15,6 @@ - 設計判断: 目録は SQLite + SHA-256 名のストア(取り込み時にコピー.原本参照より版の再現が確実).計算サーバへは版ごとのバンドル(`SHA256SUMS` 付き)を直送.所見は種類の定義+ JSON 値で持ち,種類の追加で表を作り直さない - 運用: 研究室 PC は手元 PC から `ssh labpc` で操作し,研究室 PC では編集しない.研究室 PC に uv 0.12.22・Python 3.12.15 を導入済み.検証プロファイルは作らない(CLI はテストと `tiasdata check` で確認する) - 未実装・後段: `main` がまだ存在しない(GitHub・GitBucket とも空).取り込み後に研究室 PC へ clone する(ENV_02).次は PLAN_02 Step 1 +- [x] **舌色データが 1 患者 1 枚でないことの反映**: 研究室 PC の対応表(`DeepTIAS後_ID_番号.xlsx`)と件数だけで照合し,1085 枚が約 450 人分(2 枚以上の患者 239 人・874 枚)と判明(2026-10-03).取り込みで対応表を読み,患者単位で症例をまとめる設計に直した(PLAN_01・PLAN_02・SPEC_01〜03・ENV_01) + - 影響: TIASJudgeModel は画像 ID を `patient_id` にしており,同じ患者の画像が学習と評価に分かれている可能性がある.基盤経由に切り替える Step 8 で患者単位の分割に直し,成績の差を記録する + - 判断: xlsx を読む openpyxl は任意の依存(`import`)にし,使う側には入れない