diff --git a/CLAUDE.md b/CLAUDE.md index 660f71d..978cd33 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ ## 開発進捗 -最新: /setup フェーズ 3(環境構築)まで完了.次はフェーズ 4(仕様設計) +最新: /setup フェーズ 4(仕様設計)まで完了.次はフェーズ 5(規約整備) ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). ## 必須ルール(コード実装時) diff --git "a/docs/04_SPEC/SPEC_01_\347\224\273\351\235\242\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_01_\347\224\273\351\235\242\344\273\225\346\247\230.md" new file mode 100644 index 0000000..bd2d4f6 --- /dev/null +++ "b/docs/04_SPEC/SPEC_01_\347\224\273\351\235\242\344\273\225\346\247\230.md" @@ -0,0 +1,54 @@ +# 画面仕様 (Screen Specification) + +現行アプリの画面構成を踏襲する.画面は 2 つ(メイン画面・結果画面). + +## 画面遷移 (Screen Flow) + +```text +メイン画面 + ├─ 変換行列 CSV 選択 → 画像 PNG 選択 → 画像上を 1〜4 点クリック + ├─ [舌色診断] → 結果画面(モードレス表示) + └─ [診断続行] → 入力をリセットして次の診断へ +``` + +## メイン画面 (Main Window) + +| 要素 | 仕様 | +| --- | --- | +| 変換行列選択 | ファイル参照(`.csv` のみ受付.他拡張子はエラー表示) | +| 画像選択 | ファイル参照(`.png` のみ受付).読込時に中央基準で 1024×1280 にクロップ | +| 画像表示 | クロップ後画像を 1/2 縮小表示.未読込時はプレースホルダ画像 | +| ROI 指定 | 画像上の左クリックで 51×51 px の ROI を追加(最大 4 点.5 点目はエラー).クリック位置に赤枠を描画,クリック済みマーク(●1〜●4)を表示 | +| リセット | 右クリックで全クリックを取り消し,画像を元に戻す | +| [舌色診断] ボタン | 1 点以上クリックで有効化.診断を実行し結果画面を開く.実行後は再クリック防止のため無効化 | +| L\*a\*b\* 表示 | 診断時に算出した L\*・a\*・b\* を表示 | +| 5 色スコア表示 | 紫・暗赤・紅・淡紅・淡白 の各一致率(%)を表示 | +| [診断続行] ボタン | 診断後に有効化.「同じ変換行列を使用するか」を確認し,画像・クリック状態をリセット | + +### 入力ガード(エラー表示)(Input Guards) + +- 変換行列未読込でクリック → 「変換行列を読み込んでください」 +- 画像未読込でクリック → 「画像を読み込んでください」 +- クリック 0 点で診断 → 「1 点以上 4 点以下クリックしてください」 + +## 結果画面 (Result Window) + +| 要素 | 仕様 | +| --- | --- | +| 診断画像 | クロップ後の元画像を 1/2 縮小表示 | +| 結果パネル | 5 色の行(色名 + 説明)を一覧表示し,**上位 2 色のみ**スコア(%)と下線を描画 | +| 言語切替ボタン | 日本語 ⇔ 英語を切替(ボタンラベルは切替先の言語名) | +| 診断失敗表示 | 診断失敗時(SPEC_02「診断失敗の判定」参照)に「Diagnosis failed / Please try again.」を表示 | +| 注記 | 「本結果は疾患の診断を行うものではない」「表示画像は明るさ補正されている」 | + +### 5 色の表示内容 (Color Rows) + +| 色名(日) | 色名(英) | 説明(英語版) | +| --- | --- | --- | +| 淡紅 | Pink | Normal | +| 紅 | Red | Hot flush / feverish | +| 暗赤 | Dark red | Blood slightly thick | +| 紫 | Purple | Blood is thick | +| 淡白 | Pale red | Cold / fatigue / anemia | + +※ 現行の日本語版は文字入り背景画像(`img_student2.bmp`)を使用している.新実装では日英とも描画で生成し,画像アセット依存を無くす(見た目は現行踏襲). diff --git "a/docs/04_SPEC/SPEC_02_\350\250\272\346\226\255\343\203\255\343\202\270\343\203\203\343\202\257\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_02_\350\250\272\346\226\255\343\203\255\343\202\270\343\203\203\343\202\257\344\273\225\346\247\230.md" new file mode 100644 index 0000000..5dd88ca --- /dev/null +++ "b/docs/04_SPEC/SPEC_02_\350\250\272\346\226\255\343\203\255\343\202\270\343\203\203\343\202\257\344\273\225\346\247\230.md" @@ -0,0 +1,64 @@ +# 診断ロジック仕様 (Diagnosis Logic Specification) + +診断結果は現行実装と一致させる.本仕様は現行コード(`org/src`)の解析結果を正とする. + +## 処理パイプライン (Pipeline) + +```text +ROI 平均 RGB → (1) 多項式変換で XYZ → (2) Lab 変換 → (3) SVM 分類 → 5 色スコア・上位 2 色 +``` + +### (0) ROI 平均色 + +- クリック点ごとに 51×51 px の矩形 ROI の平均 BGR を算出 +- 複数点クリック時は各 ROI 平均の平均(全クリックの合算 ÷ クリック数)を診断に使用 + +### (1) RGB → XYZ(多項式回帰) + +変換行列 CSV の係数 `a[0..16], b[0..16], c[0..16]` を用い,R, G, B の 3 次までの多項式(17 項: 1 次 3 項 + 2 次クロス 3 項 + 2 乗 3 項 + 3 次 7 項 + 定数項)で X, Y, Z を計算する.負値は 0 にクリップする. + +```text +X = a0*R + a1*G + a2*B + + a3*R*G + a4*R*B + a5*G*B + + a6*R^2 + a7*G^2 + a8*B^2 + + a9*R^2*B + a10*R^2*G + a11*G^2*R + a12*G^2*B + a13*B^2*R + a14*B^2*G + + a15*R*G*B + + a16 +(Y, Z も係数 b, c で同形) +``` + +### (2) XYZ → L\*a\*b\* + +白色点 Xn=102.07, Yn=100.0, Zn=79.41(固定)とし,立方根で算出する: + +- L\* = 116 (Y/Yn)^(1/3) − 16 +- a\* = 500 ((X/Xn)^(1/3) − (Y/Yn)^(1/3)) +- b\* = 200 ((Y/Yn)^(1/3) − (Z/Zn)^(1/3)) + +※ CIE 標準の低輝度側条件分岐(t ≤ (6/29)³ のときの線形近似)は現行実装に無いため**意図的に実装しない**(結果同一性優先). + +### (3) SVM 分類 + +- 学習データ: `data.csv` の 84 サンプル(入力: L\*a\*b\* 3 次元,出力: 190 列 = 医師 38 名 × 5 色の 0/1 評価) +- 出力 190 列それぞれについて 2 クラス SVM を**診断のたびに学習**し,入力 Lab を予測する(正例が 2 未満の列は学習せずスコア 0) +- SVM パラメータ: C_SVC / RBF カーネル,γ=0.011,C=12.0,終了条件 EPS 1000 回・FLT_EPSILON +- 色ごとに 38 医師分の予測値を平均 → 5 色の一致率(0〜1)を百分率で表示する +- スコア降順で上位 2 色を主要ラベルとする + +## 診断失敗の判定 (Failure Detection) + +5 色スコア(% 整数)が特定の組(淡紅 11・紅 5・暗赤 0・紫 42・淡白 3)と完全一致した場合,現行実装は「Diagnosis failed」と表示する. + +※ これは「学習不能時に SVM が返す既知の出力パターン」をマジックナンバーで検出する現行のワークアラウンド.新実装では**学習不能・予測失敗を直接検出**して失敗表示する(表示仕様は現行と同じ). + +## データファイル形式 (Data File Formats) + +### 変換行列 CSV(ユーザーが診断時に選択) + +- 17 行 × 3 列(ヘッダなし).各行が `a[i], b[i], c[i]`(X, Y, Z 用係数) +- 撮影環境(カメラ・照明)ごとのキャリブレーション結果として作成されるファイル + +### data.csv(学習データ.リポジトリの `data/` に同梱予定) + +- 1 行目: ヘッダ(`L,a,b,紫,暗赤,紅,淡紅,淡白,…` の繰り返し) +- 2 行目以降: 84 サンプル.列 1〜3 が L\*a\*b\*,列 4〜193 が医師 38 名 × 5 色の 0/1(各医師 5 列の one-hot) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 2ce9969..13fa92a 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -14,3 +14,5 @@ - 設計判断: 技術スタックは Python + PySide6 + opencv-python を採用.MFC 継続・C# 案は Mac 対応の可能性が無いため却下(ユーザー要件: 当面 Windows,将来 Mac も視野).SVM は現行と同じ OpenCV 実装(`cv2.ml.SVM`)を使い診断結果の同一性を担保する方針 - 旧実装は `org/` に置き参照専用とする(.gitignore で Git 管理外) - [x] **/setup フェーズ 3 完了(環境構築)**: ENV_02(メンバー用)・ENV_03(管理者用)を作成.「どのデバイスでも clone → uv sync で開発再開できる」を方針とし,環境定義は pyproject.toml / uv.lock でリポジトリ内に持たせる(デバイス側は git / gh / uv のみ).ENV_04(開発コマンド)は pyproject 作成時に確定させるため後回し.GitHub リポジトリ作成はユーザー実施待ち(ENV_03 参照) +- [x] **/setup フェーズ 4 完了(仕様設計)**: 旧実装の解析から SPEC_01(画面仕様)・SPEC_02(診断ロジック仕様)を作成. + - 設計判断: ① 診断失敗検出は現行のマジックナンバー比較(スコア 42/0/5/11/3 一致)をやめ原因の直接検出に変更 / ② 日本語結果画面は文字入りビットマップ背景をやめ描画生成に変更(アセット非依存・表示は現行踏襲)/ ③ Lab 変換は CIE 標準の低輝度分岐を持たない現行式を意図的に踏襲(結果同一性優先)