PLAN_02 ステップ 5「回帰テスト」で使う 旧実装 exe の入出力ペア を採取する手順.
本作業は人間が行う(PLAN_02「人間が行う作業」).採取した CSV を
tests/fixtures/regression/ に置くと,uv run pytest の回帰テストが自動で有効になる.
本手順の操作は scripts/auto_capture.py で全自動化済み(ステップ 5 で使用し,12 ケースの採取に成功).
旧 exe の起動 → 変換行列・画像の読込 → クリック → 診断 → 8 値の読取 → CSV 追記を 1 枚ごとに繰り返す.
uv run python scripts/auto_capture.py --images-dir <単色PNGフォルダ> --matrix <変換行列.csv> --out <出力CSV> --verbose
--single <ファイル名> で 1 枚試すことを推奨scripts/read_legacy_values.py は起動中の旧 exe から 8 値を読み取るだけの単体ツール(旧実装のバグで紫スコアが画面表示から読めないため,WM_GETTEXT で取得する)新実装(src/tiasjudge/core/)が旧実装と同じ診断結果を返すことを証明する(PLAN_01 成功基準・M1).
そのために «同じ入力に対する旧 exe の出力» を固定データとして採取する.
旧 exe には RGB や L*a*b* を直接入力する画面が無い(org/src を確認済み).
入力経路は「PNG 画像を読み込み → 画像上をクリック → その ROI の平均色」だけであり,
さらにクリック位置を手作業で再現できないという問題がある(PLAN_02 の注記).
そこで次の方式で採取する.
※ 「Lab → スコア」を単独で採取することは,旧 exe に Lab の入力手段が無いためできない. またメイン画面の L*a*b* 表示は整数に丸められているため,表示された Lab を入力として 使い回すと SVM の予測が変わりうる.したがって Lab は «出力側の照合対象» としてのみ扱う (形式定義 README の ③ の注意を参照).
org/src/tonguediagnosisMFC2/x64/Release/tonguediagnosisMFC2.exe(または Debug)data.csv と img/img_student2.bmp が必要
(org/src/tonguediagnosisMFC2/ 直下でそのまま実行するのが確実)リポジトリ直下で次を実行する(生成先はリポジトリ外・作業用フォルダを推奨).
uv run python scripts/generate_regression_images.py --out-dir <出力先フォルダ>
rgb_156_102_098.png のように RGB がそのまま入る(採取時の取り違え防止)--color 156,102,98 --color 120,70,70(複数指定可)1 色(1 枚)につき次を 1 回行う.
紫 xx%・暗赤 xx%・紅 xx%・淡紅 xx%・淡白 xx%L* xx・a* xx・b* xx%3.0lf のため.小数は表示されない)failed 列に yes,出ていなければ noscripts/generate_regression_images.py の既定 12 色がそのまま以下をカバーする.
最低でも「代表色 5 点 + 境界値 2 点 + 域外 2 点」を採取する.
| 種類 | 色(R,G,B) | 意図 |
|---|---|---|
| 代表 | 156,102,98 | 基準色(旧実装コメントの平均 BGR 由来) |
| 代表 | 180,120,115 | やや明るい舌色 |
| 代表 | 205,145,140 | 淡い舌色(淡紅・淡白寄り) |
| 代表 | 140,85,85 | やや暗い舌色 |
| 代表 | 115,62,68 | 暗い舌色(暗赤・紫寄り) |
| 代表 | 170,92,112 | 赤紫寄り |
| 代表 | 196,74,74 | 鮮やかな紅寄り |
| 代表 | 150,110,130 | 青み寄り |
| 境界 | 255,255,255 | 明るさの上限 |
| 境界 | 0,0,0 | XYZ が 0 にクリップされる(L* = -16 になる想定) |
| 失敗 | 255,0,0 | 学習データ域外(「Diagnosis failed」が出るか確認する) |
| 失敗 | 0,0,255 | 学習データ域外 |
※ 実際の舌画像で «上位 2 色が入れ替わる境目» に近い色が分かっている場合は, その前後の色も追加すると回帰テストの価値が上がる.
生成スクリプトが出力した雛形を使い,2 つの CSV を作る. 列名・列の意味・許容誤差は tests/fixtures/regression/README.md が正.
tests/fixtures/regression/rgb_to_lab.csv
matrix,r,g,b,l_star,a_star,b_star,note translateMatrix.csv,156,102,98,55,22,7,基準色
tests/fixtures/regression/rgb_to_scores.csv
matrix,r,g,b,purple,dark_red,crimson,pink,pale,failed,note translateMatrix.csv,156,102,98,16,61,11,5,0,no,基準色
記入のルール.
a* や b*)はマイナス記号を付けて書くmatrix 列には使った変換行列 CSV のファイル名を書くtests/fixtures/regression/matrices/ にコピーする(必須)# で始まる行はコメントとして無視される(採取日・環境のメモに使ってよい)CSV を置いたら,リポジトリ直下で次を実行する(ENV_04).
uv run pytest tests/test_regression.py -vv
新実装(プロダクションコード)をその場で直さない.次の順に切り分けて記録する.
画面表示は整数までなので,L*a*b* の照合はどうしても ±0.5 の幅を持つ. より厳密に照合したい場合は,旧実装を Visual Studio で Debug ビルドして次を採取する.
CalcLab() の直後に TRACE("L=%.6f a=%.6f b=%.6f\n", m_tongueL, m_tonguea, m_tongueb); を追加し,
出力ウィンドウの値を rgb_to_lab.csv に書く(この場合は小数のまま記入してよい.
テストの許容誤差 0.51 のままでも通るが,より厳しい照合が必要なら
tests/test_regression.py の LAB_DISPLAY_TOLERANCE を下げる)m_tongueL/a/b に任意の値を代入してから CalcSVM() を呼ぶ改造版を作れば,
「Lab → スコア」の組(README の ③ lab_to_scores.csv)も採取できる※ 旧実装の改造は参照専用の org/ を書き換えない(Git 管理外・原本保持).
コピーを別フォルダに作って行うこと.