diff --git a/.claude/hooks/check_sync.sh b/.claude/hooks/check_sync.sh deleted file mode 100644 index 3d05aa3..0000000 --- a/.claude/hooks/check_sync.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env bash -# SessionStart hook: ローカルブランチが origin と同期しているかをチェックし, -# JSON で systemMessage (UI 表示) と additionalContext (モデルに注入) を出力する. -# 読み取り専用 (git fetch のみ). 失敗してもセッション開始は阻害しない. -# -# GUIDE_03「直列運用」「main を常に動作可能」を補助する目的で, -# 古い main から作業を始めるミスをセッション開始時に可視化する. - -# JSON 整形は Python に任せる (jq 非依存. 既存 hook も Python を利用). -# python3 / python / py の差は run_python.sh が吸収する (見つからなければ非ブロックで失敗). -emit() { - local msg="$1" - PYTHONIOENCODING=utf-8 bash "$(dirname "$0")/run_python.sh" - "$msg" <<'PY' -import json, sys -msg = sys.argv[1] -print(json.dumps({ - "systemMessage": msg, - "hookSpecificOutput": { - "hookEventName": "SessionStart", - "additionalContext": msg, - }, -}, ensure_ascii=False)) -PY -} - -# git リポジトリ外なら静かに終了 -git rev-parse --is-inside-work-tree >/dev/null 2>&1 || exit 0 - -# origin が未設定なら静かにスキップ (個人 clone・ローカル実験用途) -git remote get-url origin >/dev/null 2>&1 || exit 0 - -# fetch (5 秒で打ち切り). 失敗 = オフライン等. 警告だけ出して継続. -if ! timeout 5 git fetch --quiet origin 2>/dev/null; then - emit "[sync-check] origin への fetch に失敗 — オフラインの可能性" - exit 0 -fi - -BRANCH=$(git branch --show-current) -# detached HEAD は判定できないので静かに終了 -[ -z "$BRANCH" ] && exit 0 - -LOCAL=$(git rev-parse HEAD 2>/dev/null) || exit 0 -REMOTE=$(git rev-parse "@{u}" 2>/dev/null) -if [ -z "$REMOTE" ]; then - emit "[sync-check] $BRANCH は upstream 未設定" - exit 0 -fi -BASE=$(git merge-base HEAD "@{u}") - -DIRTY="" -[ -n "$(git status --porcelain)" ] && DIRTY=" / 未コミット変更あり" - -if [ "$LOCAL" = "$REMOTE" ]; then - emit "[sync-check] ✓ $BRANCH は origin と同期${DIRTY}" -elif [ "$LOCAL" = "$BASE" ]; then - AHEAD=$(git rev-list --count "HEAD..@{u}") - emit "[sync-check] ⚠ $BRANCH は origin より ${AHEAD} コミット遅れ — \`git pull\` 推奨${DIRTY}" -elif [ "$REMOTE" = "$BASE" ]; then - AHEAD=$(git rev-list --count "@{u}..HEAD") - emit "[sync-check] ℹ $BRANCH は origin より ${AHEAD} コミット先行${DIRTY}" -else - AHEAD=$(git rev-list --count "@{u}..HEAD") - BEHIND=$(git rev-list --count "HEAD..@{u}") - emit "[sync-check] ⚠ $BRANCH は origin と分岐 (先行 ${AHEAD} / 遅れ ${BEHIND}) — rebase/merge が必要${DIRTY}" -fi diff --git a/.claude/project-mode b/.claude/project-mode new file mode 100644 index 0000000..ceeec84 --- /dev/null +++ b/.claude/project-mode @@ -0,0 +1 @@ +solo diff --git a/.claude/rules/coding-style.md b/.claude/rules/coding-style.md new file mode 100644 index 0000000..6888f01 --- /dev/null +++ b/.claude/rules/coding-style.md @@ -0,0 +1,48 @@ +--- +paths: ["Tongue extraction/**/*.cs", "DeepTIAS.Tests/**/*.cs"] +--- + +# コーディング規約 (Coding Style) + +C# のコードを書くときは本規約に従うこと.基本は Microsoft の [C# のコーディング規則](https://learn.microsoft.com/ja-jp/dotnet/csharp/fundamentals/coding-style/coding-conventions) と [識別子の名前付け規則](https://learn.microsoft.com/ja-jp/dotnet/csharp/fundamentals/coding-style/identifier-names) に従い,本規約ではプロジェクト固有の点だけを定める. + +## 既存コードの扱い (Legacy Code) + +- 引き継いだコードは命名が混在している(`path_outputDir`・`mat_input` のようなスネークケースのローカル変数,`Button_start_Click` のようなハンドラ名). +- **新しく書くコードは本規約に従う.**既存コードの名前を変えるのは,その箇所を整理・修正するときに限る.名前を変えるためだけの一括変更はしない(差分が大きくなり,挙動を変えていないことの確認が難しくなるため). +- WinForms デザイナが生成する名前(`button_start`・`Form1_Load` 等)は,デザイナとの対応が崩れるため変えない. + +## 命名 (Naming) + +| 対象 | 形式 | 例 | +| --- | --- | --- | +| クラス・メソッド・プロパティ・定数 | PascalCase | `TongueDetector`,`DetectTongue`,`ScoreThreshold` | +| ローカル変数・引数 | camelCase | `outputDir`,`inputImage` | +| private フィールド | `_` + camelCase | `_session` | +| インターフェース | `I` + PascalCase | `IFeatureExtractor` | + +- 画像処理の変数は,型が分かる名前にする(`Mat` なら `mask`・`binaryImage`,パスなら `maskPath` のように `Path`・`Dir` を付ける). +- 論文や手法の名前(`Chiu`・`FiveClick` 等)は既存の呼び方をそのまま使う. + +## 書式 (Formatting) + +- インデントはスペース 4 つ.波かっこは次の行に置く(Visual Studio の既定). +- `var` は右辺から型が明らかなときだけ使う. +- `using` は `System` 系を先頭にし,未使用のものは残さない. + +## マジックナンバー (Magic Numbers) + +- 解析結果に影響する数値(検出スコアのしきい値 0.5,小領域除去の面積 500,領域分割の比率 0.2 等)は,名前の付いた定数にまとめる.値は変えない([解析処理仕様](../../docs/04_SPEC/SPEC_02_解析処理仕様.md) が基準). +- 定数には,何を表し,単位は何か(画素・比率等)をコメントで書く. + +## 外部の実行ファイル・DLL の呼び出し (External Binaries) + +- 外部 exe(`TongueFeatures.exe`・`TongueAnalysis.exe`)を呼ぶ処理は 1 か所にまとめ,引数の並びと出力ファイルをコメントに書く. +- ネイティブ DLL の `DllImport` 宣言は専用のクラスにまとめる. + +## コメント (Comments) + +- コメントは日本語で書く. +- 「何をしているか」ではなく「なぜそうしているか」を書く(手法の根拠となる論文,値を決めた理由等). +- public なクラス・メソッドには `///` の XML ドキュメントコメントで,役割・引数・戻り値を書く. +- 使わなくなったコードはコメントアウトで残さず削除する(履歴は git に残る). diff --git a/.claude/rules/error-handling.md b/.claude/rules/error-handling.md new file mode 100644 index 0000000..7a02b90 --- /dev/null +++ b/.claude/rules/error-handling.md @@ -0,0 +1,29 @@ +--- +paths: ["Tongue extraction/**/*.cs"] +--- + +# エラー処理方針 (Error Handling) + +例外処理・ログ出力を書くときは本方針に従うこと. + +## エラーの分類と扱い (Error Categories) + +| 分類 | 例 | 扱い | +| --- | --- | --- | +| 画像 1 枚だけの失敗 | 舌を検出できない,舌領域が 1 つにまとまらない | その画像を失敗として記録し,次の画像へ進む.`analysis.csv` の失敗行の形式(`<画像名>,Tongue detection error` 等)は変えない | +| 解析を続けられない失敗 | モデル・外部 exe・DLL が見つからない,入力フォルダが無い | 解析を止め,原因(どのファイルが無いか)をダイアログで伝える | +| 想定外の例外 | 上記以外 | 解析を止め,ダイアログで伝え,ログに詳細を残す.画面を操作できる状態に戻す | + +## 決まり (Rules) + +- **例外を握りつぶさない.**`catch` だけで何もしない,または `catch { }` で原因を捨てる書き方をしない.捕まえた例外はログに残す. +- 捕まえる例外の型をできるだけ具体的にする(`catch (Exception)` は最上位の処理だけにする). +- `BackgroundWorker` で解析するときは `RunWorkerCompleted` で `e.Error` を確認し,例外を画面に伝える. +- 外部 exe を呼んだら終了コードと出力ファイルの有無を確認し,失敗なら「画像 1 枚だけの失敗」として扱う. +- ダイアログ(`MessageBox`)は画面のスレッドから出す(解析スレッドからは `Invoke` を使う). + +## ログ (Logging) + +- 解析のログは出力フォルダに `log.txt` として書き出す(画像ごとの開始・終了・失敗理由,想定外の例外の詳細). +- `Console.WriteLine` は WinForms アプリでは見えないため,確認用の出力に使わない. +- デバッグ用の表示(`Cv2.ImShow`・`Cv2.WaitKey`・出力先の固定等)をコミットに残さない. diff --git a/.claude/rules/project-structure.md b/.claude/rules/project-structure.md new file mode 100644 index 0000000..724a66c --- /dev/null +++ b/.claude/rules/project-structure.md @@ -0,0 +1,44 @@ +--- +paths: ["Tongue extraction/**", "DeepTIAS.Tests/**", "Tongue extraction.sln"] +--- + +# プロジェクト構成 (Project Structure) + +ファイルを追加・移動するときは本規約に従うこと. + +## ディレクトリ構成 (Directory Layout) + +```text +DeepTIAS/ +├── Tongue extraction.sln # ソリューション +├── Tongue extraction/ # アプリ本体(DeepTIAS2.7.csproj) +│ ├── Form1.cs # 画面と解析の流れ +│ ├── ColorExtractor_fiveClick.cs # 領域分割(Chiu 法・拡張 Chiu 法・5 点法) +│ ├── Program.cs # エントリポイント +│ ├── Properties/ # アセンブリ情報・リソース・設定 +│ └── models/ # 学習済みモデル(Git LFS) +├── DeepTIAS.Tests/ # テストプロジェクト(MSTest.作成予定) +├── ColorSubdivision/ # 試作プロジェクト(ソリューション外.保守対象外) +└── docs/ # ドキュメント +``` + +- フォルダ名 `Tongue extraction`(スペース入り)とプロジェクト名 `DeepTIAS2.7` は,参照の張り替えが多いため当面変えない. + +## 追加するコードの置き場所 (Where New Code Goes) + +`Form1.cs` に解析処理が集中しているため,整理で切り出すコードは以下のフォルダに置く.フォルダは実際にファイルを置くときに作る. + +| フォルダ | 置くもの | 例 | +| --- | --- | --- | +| `Tongue extraction/Analysis/` | 解析の各工程(画面に依存しない処理) | 舌検出,舌領域抽出,形状特徴 | +| `Tongue extraction/External/` | 外部 exe・ネイティブ DLL の呼び出し | `TongueFeatures.exe` の起動,`DllImport` 宣言 | +| `Tongue extraction/IO/` | 入出力フォルダ・CSV の読み書き | 出力フォルダの作成,`analysis.csv` の追記 | + +- **画面(`Form1`)には,画面の更新と操作の受け付けだけを残す.**解析処理は画面の部品(`PictureBox` 等)に触れないようにし,テストから呼べる形にする. +- 1 ファイル 1 クラスを基本とする.ファイル名はクラス名と同じにする. +- 旧形式の csproj はファイルを自動で取り込まないため,追加したファイルは csproj の `` にも登録する(Visual Studio から追加すれば自動で登録される). + +## 実行時に必要なファイル (Runtime Files) + +- モデル・外部バイナリ・雛形フォルダなど,実行時に exe と同じ場所に必要なファイルは,csproj で「出力ディレクトリにコピー」(`CopyToOutputDirectory`)を指定し,ビルドだけで揃うようにする. +- 大きなバイナリ(モデル・exe・DLL)は Git LFS で管理する.新しい拡張子を追加するときは先に `git lfs track` で対象にする. diff --git a/.claude/rules/testing.md b/.claude/rules/testing.md new file mode 100644 index 0000000..75cd5e4 --- /dev/null +++ b/.claude/rules/testing.md @@ -0,0 +1,35 @@ +--- +paths: ["DeepTIAS.Tests/**", "Tongue extraction/**/*.cs"] +--- + +# テスト方針 (Testing) + +テストを書く・実行するときは本方針に従うこと.フレームワークは MSTest を使う([技術スタック](../../docs/02_ENV/ENV_01_技術スタック.md)). + +## テストの種類 (Test Types) + +| 種類 | 目的 | 対象 | +| --- | --- | --- | +| 回帰テスト | コード整理の前後で解析結果が変わらないことを確かめる | サンプル画像を解析した `analysis.csv` と,旧ビルドで出した正解の比較 | +| 単体テスト | 切り出した処理が単体で正しく動くことを確かめる | 領域分割,形状特徴,CSV の組み立て等,画面に依存しない処理 | + +- **回帰テストを最優先する.**本プロジェクトの目的は「解析結果を変えずに整理する」ことであり,その保証の中心になる. +- 画面(`Form1`)の操作は自動テストの対象にしない.人が動作確認する. + +## 回帰テストの決まり (Regression Tests) + +- 正解データ(入力画像と,旧ビルドで出した `analysis.csv`・中間画像)は `DeepTIAS.Tests/TestData/` に置き,Git LFS で管理する. +- 比較は `analysis.csv` の列構成(見出し行)と値で行う.小数の値は,浮動小数点の誤差を考えて許容誤差を決めて比べる(許容誤差は正解データ作成時に決め,テストコードに理由を書く). +- 正解データを作り直すのは,解析結果を変える変更をユーザーが承認したときだけとする.テストを通すために正解データを書き換えてはならない. +- 外部 exe・モデルを使うため時間がかかる.テスト名やカテゴリで単体テストと区別し,単体テストだけを素早く回せるようにする. + +## 単体テストの決まり (Unit Tests) + +- テストメソッド名は `対象_条件_期待結果` の形にする(例: `Get3areaMask_EmptyMask_ReturnsEmpty`). +- 画像を使うテストは,小さな画像をテストコード内で作るか,`TestData/` の画像を使う.PC ごとの絶対パスを書かない. +- 1 つのテストでは 1 つのことだけを確かめる. + +## 実行タイミング (When to Run) + +- コードを変更したら,コミット前に単体テストと回帰テストの両方を実行し,すべて通ることを確認する. +- 実行コマンドは [開発コマンド](../../docs/02_ENV/ENV_04_開発コマンド.md) に記載する. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..072ade1 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,27 @@ +# 依存パッケージの定期更新 PR(Dependabot version updates) +# 脆弱性検出(Dependabot alerts / security updates)はリポジトリ設定で有効化する(本ファイルとは独立に動く.ENV_03 参照) +# 更新頻度は monthly: 保守中心のプロジェクトで,OpenCvSharp・OnnxRuntime 等の更新は解析結果を変えうるため,1 件ずつ確認できる頻度にする +version: 2 +updates: + - package-ecosystem: "nuget" + directory: "/Tongue extraction" + schedule: + interval: "monthly" + open-pull-requests-limit: 5 + commit-message: + prefix: "[update]" + groups: + minor-and-patch: + update-types: + - "minor" + - "patch" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + commit-message: + prefix: "[update]" + groups: + actions: + patterns: + - "*" diff --git a/.gitignore b/.gitignore index a1fa515..e28ee7d 100644 --- a/.gitignore +++ b/.gitignore @@ -22,9 +22,15 @@ # .claude/hooks/ の Python フックとそのテスト(tests/test_hooks.py)が生成するバイトコードキャッシュ __pycache__/ -# -- プロジェクト立ち上げ時に有効化する(.claude/rules/git-conventions.md 参照) -- -# .env -# .env.* -# node_modules/ -# build/ -# dist/ +# -- DeepTIAS(C# / Visual Studio) -- +# ビルド出力 +[Bb]in/ +[Oo]bj/ +# NuGet で復元されるパッケージ +packages/ +# Visual Studio の作業フォルダ・個人設定 +.vs/ +*.suo +*.user +# テスト結果 +TestResults/ diff --git a/CLAUDE.md b/CLAUDE.md index 68cde5b..5e29b6e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,15 +1,21 @@ -# プロジェクト名 +# DeepTIAS - +TIAS(舌画像撮影システム)で撮影した舌画像を解析し,深層学習による舌領域の検出・抽出と色・形状などの特徴量算出を行う Windows デスクトップアプリ.前任者から引き継いだ C# WinForms 版 DeepTIAS v2.7 をベースに開発を継続する. ## 開発進捗 -最新: GUIDE_01 に従いプロジェクト立ち上げ中 +最新: プロジェクト立ち上げ完了.次は PLAN_02 ステップ 1(実行に必要なファイルの取り込み) ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). ## 必須ルール(コード実装時) - +### DeepTIAS 固有 + +- **解析結果(`analysis.csv` の列構成と値)を変えない**.コード整理の合格基準であり,変える必要がある場合は必ずユーザーの承認を得る([PLAN_01](docs/03_PLAN/PLAN_01_要件定義書.md)・[SPEC_02](docs/04_SPEC/SPEC_02_解析処理仕様.md)) +- 回帰テストの正解データを,テストを通すために書き換えない(`.claude/rules/testing.md`) +- ソースの無い外部バイナリ(`TongueFeatures.exe`・`TongueAnalysis.exe`・ネイティブ DLL)は作り直さずに使う +- モデル・exe・DLL などの大きなバイナリは Git LFS で管理する(新しい拡張子は先に `git lfs track`) +- コーディング規約・構成・テスト・エラー処理は `.claude/rules/`(coding-style / project-structure / testing / error-handling)に定義されている(該当ファイル編集時に自動ロードされる) ### Git 運用 @@ -70,15 +76,21 @@ ### 02_ENV(環境) - +- 技術スタック: docs/02_ENV/ENV_01_技術スタック.md +- 環境構築手順: docs/02_ENV/ENV_02_環境構築手順.md +- 管理者用環境構築手順: docs/02_ENV/ENV_03_管理者用環境構築手順.md +- 開発コマンド: docs/02_ENV/ENV_04_開発コマンド.md ### 03_PLAN(計画) - +- 要件定義書: docs/03_PLAN/PLAN_01_要件定義書.md +- 開発ステップ: docs/03_PLAN/PLAN_02_開発ステップ.md ### 04_SPEC(仕様・設計) - +- 画面仕様: docs/04_SPEC/SPEC_01_画面仕様.md +- 解析処理仕様: docs/04_SPEC/SPEC_02_解析処理仕様.md +- 入出力仕様: docs/04_SPEC/SPEC_03_入出力仕様.md ### 05_TECH(技術設計) diff --git a/ColorSubdivision/ColorSubdivision.csproj.user b/ColorSubdivision/ColorSubdivision.csproj.user deleted file mode 100644 index 51f6223..0000000 --- a/ColorSubdivision/ColorSubdivision.csproj.user +++ /dev/null @@ -1,13 +0,0 @@ - - - - publish\ - - - - - - en-US - false - - \ No newline at end of file diff --git a/Tongue extraction/DeepTIAS2.7.csproj b/Tongue extraction/DeepTIAS2.7.csproj index b0c7421..cda6dde 100644 --- a/Tongue extraction/DeepTIAS2.7.csproj +++ b/Tongue extraction/DeepTIAS2.7.csproj @@ -125,6 +125,9 @@ PreserveNewest + + PreserveNewest + @@ -132,9 +135,6 @@ - - Always - diff --git a/Tongue extraction/DeepTIAS2.7.csproj.user b/Tongue extraction/DeepTIAS2.7.csproj.user deleted file mode 100644 index aeeb0cb..0000000 --- a/Tongue extraction/DeepTIAS2.7.csproj.user +++ /dev/null @@ -1,13 +0,0 @@ - - - - publish\ - - - - - - ja-JP - false - - \ No newline at end of file diff --git a/Tongue extraction/models/ResUNet.onnx b/Tongue extraction/models/ResUNet.onnx new file mode 100644 index 0000000..fbba675 --- /dev/null +++ b/Tongue extraction/models/ResUNet.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb701b8c42bdd35cb9e7b58cb2f95273160a9dc7d0b7fcf67313602e239dea79 +size 71189535 diff --git "a/docs/01_GUIDE/GUIDE_03_\343\203\201\343\203\274\343\203\240\351\226\213\347\231\272\343\203\253\343\203\274\343\203\253.md" "b/docs/01_GUIDE/GUIDE_03_\343\203\201\343\203\274\343\203\240\351\226\213\347\231\272\343\203\253\343\203\274\343\203\253.md" deleted file mode 100644 index 7561097..0000000 --- "a/docs/01_GUIDE/GUIDE_03_\343\203\201\343\203\274\343\203\240\351\226\213\347\231\272\343\203\253\343\203\274\343\203\253.md" +++ /dev/null @@ -1,152 +0,0 @@ -# チーム開発ルール (Team Development Rules) - -チーム全員が Claude Code を用い,人間が直接コードを書くことはほぼない前提で,並行開発を破綻させずに進めるための協調ルールを定義する. - -> 本ガイドは**チーム開発モード**(`/setup` で team を選択したプロジェクト)でのみ有効.個人開発モード(solo)のプロジェクトには本ファイルは配置されない.なお `/task-create`・`/task-start`・`/task-handoff` は共通層の skill であり,solo でも Issue ベースのタスク管理に使用できる(その場合,本ガイドのチーム協調ルールは適用されない). - -Git の規約は `.claude/rules/git-conventions.md`(push・PR・マージ手順は `.claude/skills/commit/reference.md`),1 タスクの実装パイプラインは [GUIDE_02](GUIDE_02_エージェント運用ルール.md) に従う.本ガイドはそれらの上に立つ「複数人が同時に動くときの調整」を扱う. - -## 基本方針 (Basic Policy) - -- 全員が Claude Code で開発し,実装はエージェントが行う(チーム規模はプロジェクトによる). -- 原則として並行作業を行わず,1 人ずつ直列で開発する.急ぎではないため,スループットより単純さと `main` の整合性を優先する.これは禁止ではなく既定のスタンスであり,状況に応じた判断は妨げない(詳細は「作業の直列化」). -- 人間の本質的な役割は「AI にできない判断と確認」(GUIDE_02 と同じ).加えて「共有設定の番人」を担う. -- 進捗・タスクは GitHub Issues と git 履歴で追う.`CLAUDE.md` には進捗を書かない(この点は solo 既定の進捗記録ルール `.claude/rules/progress-log.md` を**上書き**する). -- `main` は常に動作可能な状態を保つ(`.claude/rules/git-conventions.md`).壊れたら他の作業より優先して直す. - -## タスク管理 (Task Management) - -進捗管理の補助として GitHub Issues と Projects を用いる.`gh` コマンドでの具体的な操作手順(スコープ・Projects 操作・トラブル対応)は `.claude/skills/task-start/reference.md` を参照. - -### Issue (Issue) - -Issue は**進捗管理の補助**として使う.追跡したい作業に対して立て,PR と紐付けてボードで可視化する. - -- 作業 1 単位 = 1 Issue を推奨する.既に Issue がある作業は,新たに作らずそれに従って進める(重複 Issue を作らない). -- **Issue は着手・PR 作成・マージのいずれの段階でも必須としない**.小さい変更(typo・1 行修正等)や試験的・探索的な作業は Issue 無しで進めてよい. -- ただし**追跡する価値のある作業には Issue を立てるのが望ましい**(後追いと進捗可視化のため).特に複数回の `/implement` に跨る作業や,他メンバーに見えていてほしい作業は Issue を作る. -- PR と Issue を紐付ける場合は本文に `Closes #` を記載する.マージ時に Issue が自動クローズされ,ボードのカードも `Done` へ移る. -- Issue 本文には少なくとも「やること」を書く.「完了条件(受け入れ基準)」は非自明な作業のみで構わない. -- 担当者は明確にしておくのが望ましい(重複着手を避けるため). -- Issue は最初に書き切らなくてよい.作業途中の進捗・確定事項は `/task-handoff` の進捗メモとして Issue に集約し,完了は PR の `Closes #<番号>` によるマージ時の自動クローズで反映する(`/implement` のフローでは Issue を更新しない). - -### Project ボード (Project Board) - -> ⚠ **既定では未使用**.タスク管理は Issue ベース(`gh issue list`)で運用する.Project ボードはチームが拡大したり Issue が常時 10 件超になった等の局面で再導入する想定.以下は将来導入時の参考. - -- 列: `Todo` / `In Progress` / `In Review` / `Done`. -- Issue をカードとして配置し,状態を移動して可視化する. -- マージ連動の自動化を設定し,カード移動の手作業を最小化する(設定は管理者作業.「管理者の初期設定」参照). - -### タスクの流れ (Task Flow) - -Issue を立てる場合の標準フロー(小さい変更や探索的作業はこの限りでない). - -```text -1. Issue 起票(完了条件を明記) -2. 自分にアサイン(ボード未使用のためアサインのみ.ボード運用復活時は In Progress へ移動) -3. main から作業ブランチ作成(git-conventions ルール) -4. /implement に Issue の内容を渡して実装(GUIDE_02) -5. PR 作成,本文に "Closes #<番号>" -6. セルフマージ条件を確認 → マージ -7. マージで Issue 自動クローズ → カード自動 Done -``` - -- 上記 1 は `/task-create`(事前定義用),2 と 3 は `/task-start `(既存 Issue から着手)で半自動化できる.Issue 無しで進める場合はどちらも不要. -- Claude へのタスク文脈は `CLAUDE.md` ではなく Issue から渡す.`gh issue view ` で取得する. - -## ブランチと PR (Branch & PR) - -`.claude/rules/git-conventions.md` に従う.チーム運用上の追加事項のみ以下に定める. - -- ブランチ命名は git-conventions ルールの基本形式(`[プレフィックス][概要]`)に従う.ブランチ名に Issue 番号は含めなくてよい. -- branch↔Issue の紐付けは PR 本文の `Closes #<番号>` で行う.マージ時に Issue が自動クローズされる.既存 Issue からブランチを作る場合は `gh issue develop` でネイティブにリンクできる(`.claude/skills/task-start/reference.md`). -- PR の `--title` はコミットメッセージと同じ書式(`[タグ] 内容`,`.claude/rules/git-conventions.md`). - -## レビューとマージ (Review & Merge) - -誰も手書きしない体制では,マージ条件が唯一の品質ゲートとなる.本プロジェクトは**条件付きセルフマージ**を採用する.他メンバーの Approve 待ちは原則作らない代わりに,作者自身が満たすべき条件を実質的なゲートとして定める. - -### 通常の機能 PR (Feature PR) - -次を全て満たせば,作者がセルフマージしてよい. - -- CI で全テストが緑である. -- 作者自身が Phase 1 の動作確認(実機・ブラウザ等,AI にできない確認)を済ませている(GUIDE_02). -- `/implement` のパイプラインをスキップせず完走している. -- 対応 Issue がある場合は完了条件を満たしている(Issue 無しの PR は不要). -- 共有設定(`CLAUDE.md` のルール部・`.claude/`)の変更を含まない. - -※ レビューは任意.他メンバーはコメントしてよいが,マージをブロックしない. - -### 共有設定を変更する PR (Shared Config PR) - -`CLAUDE.md` のルール部や `.claude/` を変更する PR は,全員の Claude の挙動を変えるため例外とする. - -- 機能 PR に混ぜず,専用 PR とする(「共有設定の扱い」参照). -- 他メンバー 1 名の Approve を必須とする(セルフマージ不可). - -### Dependabot の依存更新 PR (Dependabot PR) - -Dependabot が作成する依存更新 PR(security updates / version updates)は,人間が書いた PR ではないため上記の「`/implement` 完走」「Phase 1 動作確認」を満たせない.代わりに `/deps-update` のゲートを品質ゲートとする(`.claude/skills/deps-update/SKILL.md`). - -- **`/deps-update` がマージしてよいもの**: メジャー更新でなく,競合が無く,CI 緑(CI 未構築ならローカル検証緑)の PR.`gh pr merge --merge` で取り込む.これは「AI が `main` へマージする」唯一の例外である(GUIDE_02「コミットルール」). -- **人間が判断するもの**: メジャー更新(`0.x` のマイナー更新を含む),CI 赤,修正版の無い alert,Dependabot が PR を作れなかった alert.`/deps-update` が影響分析と推奨(そのままマージ/`/implement` で追従/`@dependabot ignore` で見送り)を PR コメントと完了報告に出すので,それを見て決める. -- 依存更新 PR は共有設定(`CLAUDE.md`・`.claude/`)を変更しないため,他メンバーの Approve は不要.`main` にブランチ保護(必須レビュー)を設定している場合は `/deps-update` はマージできないので,マージ可と判定した一覧を提示するにとどまり,人間がマージする. -- `/deps-update` を実行するのは原則 1 名(管理者またはその週の担当)とし,マージ後はチームに周知して全員が `git pull` する(直列運用のため,他メンバーの作業ブランチは次の rebase で追従する). - -### CI 構築までの暫定ゲート (Interim Gate) - -CI が未構築の間は「CI 緑」を以下で代替する.CI 構築後はこの節を削除する. - -- `/implement` を完走している. -- ローカルで全テストが緑である. -- 作者自身が Phase 1 の動作確認を済ませている. - -## 共有設定の扱い (Shared Configuration) - -`CLAUDE.md` と `.claude/`(agents・skills・rules・hooks・settings.json・template-overrides.md)は全員の Claude の挙動を決める共有インフラである. - -- **git 追跡を継続する**.untrack や `.gitignore` 化はしない(履歴の保全と挙動の統一のため). -- **進捗は `CLAUDE.md` に書かない**.進捗は Issues と git 履歴で追う(「タスク管理」参照). -- **変更は「チームルール変更」カテゴリ**として扱う. - - 機能 PR に混ぜない.専用 PR とする(ブランチは `chore/` または `docs/`). - - 他メンバー 1 名の Approve を必須とする. - - マージ後はチームに周知し,全員が `git pull` して Claude セッションを再起動する. - - ※ Claude はセッション開始時に `CLAUDE.md` を読むため,古いまま動くと文脈がずれる. -- **例外: ドキュメント一覧への追記**は,そのドキュメントを追加する PR と同じ PR で行ってよい.衝突しても両方の行を残せば解決できる. -- **個人・マシン固有の設定**は `.claude/settings.local.json` に置く.これは `.gitignore` 対象とし,共有の `settings.json` を個人都合で汚さない. - -## 作業の直列化 (Serialized Work) - -- 原則として,同時に進行中のコード作業は 1 件とする(進行中の Issue は原則 1 件.Project ボード運用復活時は `In Progress` 列も同様). -- 次の作業に着手してよいのは,前の作業の PR が `main` にマージされた後とする(マージ条件は「レビューとマージ」参照). -- タスクは小さく保つ.直列運用では,1 単位が小さいほど次の人の待ち時間が短くなる. -- 直列運用により並行コンフリクトと共有設定のドリフトは原理的にほぼ発生しない.例外的に並行が生じてコンフリクトした場合は `.claude/skills/commit/reference.md` の rebase 手順をフォールバックとして用いる. -- `main` を壊した場合は他作業より優先して復旧する.自分で対処できない場合は直ちにチームへ報告する(`.claude/skills/commit/reference.md`「間違えて main にコミットしてしまった場合」). - -## メンバーのオンボーディング (Onboarding) - -新メンバー参加時の手順. - -1. リポジトリへのコラボレーター招待を承認する(GitHub の通知,または `https://github.com///invitations`). -2. リポジトリを clone する. -3. `ENV_02_環境構築手順.md`(GUIDE_01 参照,立ち上げ時に作成)に従い開発環境を構築する. -4. `gh auth login` で GitHub CLI を認証する.Projects も操作する場合は `project` スコープを含める(`.claude/skills/task-start/reference.md`「必要なスコープ」). -5. 必要なら `.claude/settings.local.json` を用意する(個人設定.git 追跡されない). -6. 最初に `CLAUDE.md` と `docs/01_GUIDE/` を読む(特に本ガイドと GUIDE_02).Git 規約は `.claude/rules/git-conventions.md` にある. -7. `.gitignore` が整備されていることを確認する(`.claude/rules/git-conventions.md`). - -## 管理者の初期設定 (Admin Setup) - -以下は外部サービス操作を含み,原則として AI には実施できない(`gh` で操作できる設定のみ例外として注記する).ルール確定後に管理者(人間)が一度だけ行う. - -- GitHub リポジトリの作成,メンバー招待. - - リポジトリ作成後,**GitHub リポジトリのセキュリティ設定**(Dependabot alerts / security updates の有効化)は AI が `gh api` で行う(`/setup` の Phase 3・7 で実行.コマンド・検証・トラブル対応は `.claude/skills/setup/reference.md`「GitHub リポジトリのセキュリティ設定」,背景は GUIDE_01「環境構築」).`/setup` 完了後にリポジトリを作成した場合は,同 `reference.md` または `ENV_03_管理者用環境構築手順.md` に転記したコマンドを実行する(管理者が直接実行してもよい). -- (既定では未使用)GitHub Project の作成,列(`Todo` / `In Progress` / `In Review` / `Done`)の定義. -- (既定では未使用)マージ連動の自動化設定(PR マージ時に Issue クローズ・カードを `Done` へ移動). -- Issue テンプレートの用意(「やること」「完了条件」欄). -- 共有設定変更 PR に他メンバー Approve を求める運用の周知(必要なら `main` のブランチ保護設定). -- CI の構築(全テストを実行し,緑をマージ条件にできる状態にする). - -※ 完了するまでは本ガイドの「CI 構築までの暫定ゲート」を適用する. 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" new file mode 100644 index 0000000..7522deb --- /dev/null +++ "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" @@ -0,0 +1,74 @@ +# 技術スタック (Tech Stack) + +引き継いだ DeepTIAS v2.7 の技術構成を記録し,今後の開発で使う技術を定める. +既存アプリの保守が目的のため,言語・フレームワークは現行を維持し,新規に選定するのは開発環境とテスト基盤のみとする. + +## アプリケーション (Application) + +| 項目 | 採用技術 | 備考 | +| --- | --- | --- | +| 言語 | C#(7.3) | .NET Framework 4.8 の既定バージョン | +| フレームワーク | .NET Framework 4.8 | 旧形式の csproj(SDK 形式ではない) | +| UI | Windows Forms | 画面は `Form1` の 1 画面のみ | +| 対象プラットフォーム | Windows x64 | ネイティブ DLL が x64 のため | +| パッケージ管理 | NuGet(`packages.config`) | `PackageReference` への移行は行わない | + +## 主要ライブラリ (Libraries) + +| ライブラリ | バージョン | 用途 | +| --- | --- | --- | +| OpenCvSharp4(+ Extensions,runtime.win) | 4.9.0.20240103 | 画像の読み書き・二値化・輪郭検出・描画 | +| TensorFlowSharp | 1.15.1 | 舌検出モデル(`Detection_Normal.pb`)の推論 | +| Microsoft.ML.OnnxRuntime | 1.9.0 | 舌領域抽出モデル(`ResUNet.onnx`)の推論 | + +- ※ Microsoft.ML(1.6.0 一式),Newtonsoft.Json,OpenCvSharp.WpfExtensions,OpenCvSharp.Blob 等はコードから使われていないため,コード整理で参照を削除する. + +## 学習済みモデル (Models) + +| ファイル | 形式 | 用途 | +| --- | --- | --- | +| `models/Detection_Normal.pb` | TensorFlow(Object Detection API) | 舌の矩形検出(入力 256×256) | +| `models/ResUNet.onnx` | ONNX(PyTorch 1.10 から出力) | 舌領域のセグメンテーション(入力 1×3×256×256) | +| `models/ResUnet_0.9518.pb` | ONNX(拡張子は `.pb`,PyTorch 1.8 から出力) | 未使用.旧版の ResUNet と思われる | + +- ※ モデルは Git LFS で管理する(`.gitattributes` で `*.pb`・`*.onnx` を対象にしている). + +## 外部バイナリ (External Binaries) + +ソースコードが無く,ビルド済みのまま使うもの.Git LFS で管理する. + +| ファイル | 種類 | 用途 | 注意点 | +| --- | --- | --- | --- | +| `RemoveSmallRegionDLL.dll` | ネイティブ DLL(C++) | 二値画像の小領域除去 | OpenCV 3.2(`opencv_world320.dll`)に依存 | +| `TongueAnalysisDLL.dll` | ネイティブ DLL(C++) | 宣言のみで未使用 | デバッグビルド | +| `python/TongueFeatures.exe` | PyInstaller で exe 化した Python | 色統計量・GLCM 特徴量の算出 | 約 116 MB | +| `rgb2lab/TongueAnalysis.exe` | ネイティブ exe(C++) | カラーチャートによる色補正(L\*a\*b\* 変換) | デバッグビルド.VC++ のデバッグ用ランタイムが必要 | + +## 開発環境 (Development Environment) + +| 項目 | 採用技術 | 備考 | +| --- | --- | --- | +| OS | Windows 11 | | +| IDE | Visual Studio 2022 Community | ワークロード「.NET デスクトップ開発」「C++ によるデスクトップ開発」 | +| ビルド | MSBuild(Visual Studio 2022 付属) | コマンドラインでは `msbuild` を使う | +| NuGet 復元 | `msbuild -t:restore -p:RestorePackagesConfig=true` | `nuget.exe` を別途入れずに済む | +| テスト | MSTest | .NET Framework 4.8 のテストプロジェクトとして作る | +| バージョン管理 | Git + Git LFS,GitHub | | + +## 選定理由 (Rationale) + +### IDE + +- Visual Studio 2022 Community を採用する.WinForms のデザイナ(画面の見た目の編集)とデバッガが使え,C# の WinForms 開発では標準的なため. +- 「C++ によるデスクトップ開発」ワークロードも入れる.`rgb2lab\TongueAnalysis.exe` がデバッグビルドで,VC++ のデバッグ用ランタイム(`ucrtbased.dll` 等)が無いと起動しないため. +- ※ VS Code + Build Tools も候補にしたが,WinForms デザイナが使えず画面の変更時に `Form1.Designer.cs` を手で書く必要があるため不採用とした. + +### テストフレームワーク + +- MSTest を採用する.Visual Studio に最初から入っており,後任の学生も追加の知識なしで使えるため. +- 主なテストは回帰テストとする.旧ビルドで出した `analysis.csv` を正解とし,整理後のコードで同じ入力を解析した結果が一致するかを確認する. + +## 維持するもの・変えないもの (What We Keep) + +- .NET Framework 4.8 から .NET 8 以降への移行は行わない(TensorFlowSharp が .NET Framework 向けで,移行すると推論部分の作り直しが必要になるため). +- 外部バイナリは作り直さずにそのまま使う. diff --git "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" new file mode 100644 index 0000000..281786f --- /dev/null +++ "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -0,0 +1,62 @@ +# 環境構築手順 (Environment Setup) + +DeepTIAS をビルド・実行するための開発環境の構築手順.新しく参加したメンバーや,PC を入れ替えたときに上から順に行う. + +## 前提 (Prerequisites) + +- Windows 10 / 11(x64),メモリ 8 GB 以上 +- GitHub のアカウントがあり,リポジトリ `rintoHasegawa/DeepTIAS` へのアクセス権を持っていること + +## 手順 (Steps) + +### 1. Visual Studio 2022 Community を入れる + +ワークロード「.NET デスクトップ開発」と「C++ によるデスクトップ開発」を選んでインストールする. +コマンドで入れる場合は以下を実行する. + +```powershell +winget install Microsoft.VisualStudio.2022.Community --override "--add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended --passive" +``` + +- ※ 「C++ によるデスクトップ開発」は `rgb2lab\TongueAnalysis.exe`(Calib モードで使う)が必要とする VC++ のデバッグ用ランタイムを入れるために必要. + +### 2. Git・Git LFS・GitHub CLI・Python を入れる + +```powershell +winget install Git.Git GitHub.cli Python.Python.3.12 +git lfs install +``` + +- ※ Git for Windows には Git LFS が同梱されている. +- ※ Python は Claude Code のフック実行に使う(アプリ自体は Python を使わない). + +### 3. リポジトリを取得する + +```powershell +git clone https://github.com/rintoHasegawa/DeepTIAS.git +cd DeepTIAS +git lfs pull +``` + +- ※ モデル(`*.pb`,`*.onnx`)は Git LFS で管理している.`git lfs pull` 後に `Tongue extraction\models\` の各ファイルが数十 MB あることを確認する(数百バイトしか無ければ LFS の取得に失敗している). + +### 4. ビルドする + +Visual Studio で `Tongue extraction.sln` を開き,構成を `Release`・プラットフォームを `x64` にしてビルドする.NuGet パッケージは初回ビルド時に自動で復元される. +コマンドでビルドする場合は [ENV_04_開発コマンド](ENV_04_開発コマンド.md) を参照する. + +### 5. 入力データを置いて実行する + +※ 未検証(実行に必要な外部バイナリの取り込み後に確定する) + +アプリは作業ディレクトリを基準に `..\Input`・`..\Output` を読み書きする.ビルド出力 `Tongue extraction\bin\x64\Release\` から起動する場合,入力は以下に置く. + +```text +Tongue extraction\bin\x64\ +├── Input\ +│ ├── TongueImage\ # 舌画像(.bmp) +│ └── CalibrationColorChart\ # カラーチャート画像(Calib モードのみ.舌画像と同名) +├── Output\ # 解析結果(実行時に作られる) +└── Release\ + └── DeepTIAS2.7.exe +``` 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" new file mode 100644 index 0000000..fd25534 --- /dev/null +++ "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" @@ -0,0 +1,34 @@ +# 管理者用環境構築手順 (Admin Setup) + +プロジェクト作成時に一度だけ行う初期設定. + +## GitHub リポジトリ (GitHub Repository) + +- リポジトリ: `rintoHasegawa/DeepTIAS`(Private)※ 作成済み +- メンバーを追加するときは,GitHub の Settings → Collaborators から招待する + +## Git LFS + +- `.gitattributes` で `*.pb`・`*.onnx` を Git LFS の対象にしている ※ 設定済み +- 重みや大きなバイナリを別の拡張子で追加するときは,先に `git lfs track "*.拡張子"` で対象に加える +- ※ GitHub の LFS 無料枠はストレージ・転送量とも 10 GiB + +## GitHub リポジトリのセキュリティ設定 (Security Settings) + +Dependabot alerts と Dependabot security updates を有効化する(リポジトリごとに既定で OFF). + +```bash +gh api -X PUT repos/rintoHasegawa/DeepTIAS/vulnerability-alerts +gh api -X PUT repos/rintoHasegawa/DeepTIAS/automated-security-fixes +``` + +有効化を確認する. + +```bash +gh api repos/rintoHasegawa/DeepTIAS/vulnerability-alerts # 204 なら有効 +gh api repos/rintoHasegawa/DeepTIAS/automated-security-fixes # {"enabled":true} なら有効 +``` + +## テンプレートとの同期 (Template Sync) + +- テンプレート(`rintoHasegawa/programming-template`)の更新は `/sync-template` で取り込む diff --git "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" new file mode 100644 index 0000000..a3a7f45 --- /dev/null +++ "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" @@ -0,0 +1,14 @@ +# 開発コマンド (Development Commands) + +コマンドは PowerShell から実行する.`msbuild` は「Developer PowerShell for VS 2022」で使える.通常の PowerShell では `& "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe"` のようにフルパスで呼ぶ. + +| 用途 | コマンド | +| --- | --- | +| NuGet 復元 | `msbuild "Tongue extraction.sln" -t:restore -p:RestorePackagesConfig=true` | +| ビルド | `msbuild "Tongue extraction.sln" -p:Configuration=Release -p:Platform=x64` | +| 実行 | `cd "Tongue extraction\bin\x64\Release"; .\DeepTIAS2.7.exe`(作業ディレクトリを exe の場所にして起動する) | +| テスト | 未定(テストプロジェクト作成後に記入) | + +- ※ 復元・ビルドは Visual Studio Build Tools 2022(17.14)の MSBuild で動作を確認した.Community 版の MSBuild のパスは未検証. +- ※ ビルド時の警告「規則セット ファイル "MinimumRecommendedRules.ruleset" を検出できませんでした」は Build 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" new file mode 100644 index 0000000..cda1124 --- /dev/null +++ "b/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" @@ -0,0 +1,77 @@ +# 要件定義書 (Requirements Definition) + +## 背景 (Background) + +- DeepTIAS は,TIAS(舌画像撮影システム)で撮影した舌画像を一括解析し,舌の形状・色・テクスチャの特徴量を CSV に出力する Windows デスクトップアプリである. +- 前任者が開発した v2.7(C# WinForms,2021 年 12 月版)を引き継いだ.ソースコードは本リポジトリに,実行に必要なバイナリ一式は旧ビルド出力フォルダ(`DeepTIAS2.7.1-Latest`)にのみ存在する. +- 現状,リポジトリ単体ではビルド・実行できない(NuGet パッケージ未復元,ネイティブ DLL・外部 exe・雛形フォルダの欠落,csproj のリポジトリ外参照).また配布済み exe は現行ソースと一致しない(旧ソースは OpenCvSharp3 / .NET 4.7.1,現行ソースは OpenCvSharp4 / .NET 4.8). + +## 目的 (Goals) + +1. リポジトリを clone して手順どおりに進めれば,誰でもビルド・実行できる状態にする. +2. 解析結果を変えずに,コードを保守しやすい形に整理する. + +## 対象ユーザー (Target Users) + +- 研究室で舌画像の解析を行う研究者・学生(アプリの利用者) +- DeepTIAS を今後保守・改良する開発者(引き継ぎ先を含む) + +## 現行機能 (Current Features) + +### 解析モード (Analysis Modes) + +| モード | 入力 | 概要 | +| --- | --- | --- | +| Image(画像のみ) | `..\Input\TongueImage\` の画像 | RGB で解析する(1 枚あたり約 15〜30 秒) | +| Image&Calib(画像とカラーチャート) | 上記+`..\Input\CalibrationColorChart\` の同名画像 | カラーチャートで色補正し,L\*a\*b\* で解析する(1 枚あたり約 5 分) | + +### 処理の流れ (Pipeline) + +1. 舌検出: TensorFlow モデル(`Detection_Normal.pb`)で舌の矩形を検出する +2. 舌領域抽出: ONNX モデル(`ResUNet.onnx`)でセグメンテーションし,二値化・小領域除去(`RemoveSmallRegionDLL.dll`)でマスクを作る +3. 形状特徴: 幅・高さ・面積・外接矩形を算出する +4. 領域分割: Chiu 法(3 領域),拡張 Chiu 法(4 領域),5 点法の自動版(4 領域)でマスクを分割する +5. 色・テクスチャ特徴: 領域ごとに色統計量(最小・中央値・平均・最大・分散・歪度・尖度)と GLCM 特徴量を算出する(`python\TongueFeatures.exe`) +6. 出力: `..\Output\<日時>\` に中間画像と,全画像を 1 行ずつまとめた `analysis.csv`(305 列)を書き出す +7. 色補正(Image&Calib のみ): 解析前に `rgb2lab\TongueAnalysis.exe` でカラーチャートから L\*a\*b\* 画像を作る + +## スコープ (Scope) + +### やること (In Scope) + +- ビルド・実行環境の整備 + - 実行に必要なバイナリ(ネイティブ DLL・外部 exe・色補正データ・出力雛形)をリポジトリに取り込み,Git LFS で管理する + - csproj の壊れた参照(リポジトリ外パス,存在しないファイル,絶対パス)を直し,NuGet 復元だけでビルドできるようにする + - ビルド出力フォルダに実行ファイル一式が揃うようにする +- 実行を妨げる不具合の修正 + - デバッグ用の残骸(`Cv2.ImShow` / `WaitKey` で処理が止まる,Calib モードの出力先が `Output\debug` 固定) + - Start を 2 回押すと処理が重複して走る,例外が握りつぶされて操作不能になる +- コード整理 + - 未使用コード・ファイル(`Form1 - backups.cs`,未使用の Settings,未使用メソッド,未使用 NuGet 参照)の削除 + - 2 つの解析モードでほぼ重複している処理(約 420 行)の共通化 + - 解析結果(`analysis.csv`)が整理前後で変わらないことを確かめるテストの整備 + +### やらないこと (Out of Scope) + +- 新しい解析機能の追加,解析手法・パラメータの変更 +- モデルの再学習・差し替え +- ソースの無い外部バイナリ(`TongueFeatures.exe`,`TongueAnalysis.exe`,`TongueAnalysisDLL.dll`,`RemoveSmallRegionDLL.dll`)の作り直し +- `ColorSubdivision`(ソリューション外の試作プロジェクト)の保守 + +## 非機能要件 (Non-functional Requirements) + +- 動作環境: Windows 10 / 11(x64),.NET Framework 4.8,メモリ 8 GB 以上 +- 互換性: 整理の前後で,同じ入力に対する `analysis.csv` の列構成と値が一致すること +- 性能: 1 枚あたりの処理時間を現状より悪化させないこと + +## 制約・リスク (Constraints & Risks) + +- 外部バイナリにはソースが無く,不具合があっても修正できない. +- `rgb2lab\TongueAnalysis.exe` と `TongueAnalysisDLL.dll` はデバッグビルドで,Visual Studio のデバッグ用ランタイム(`ucrtbased.dll` 等)が入った PC でしか動かない可能性がある. +- 入出力のパスが作業ディレクトリ基準(`..\Input`,`..\Output`)で固定されている. +- 解析の正しさを確かめる基準は,旧ビルドでの実行結果しか無い. + +## 未決事項 (Open Questions) + +- Calib モードの出力先を `Output\debug` に固定しているのは意図的か(現行ソースだけにあり,配布済み exe には無い) +- .NET Framework 4.8 から新しい .NET への移行を将来の対象にするか 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" new file mode 100644 index 0000000..fe0be73 --- /dev/null +++ "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" @@ -0,0 +1,83 @@ +# 開発ステップ (Development Steps) + +[要件定義書](PLAN_01_要件定義書.md) の目的(1. 誰でもビルド・実行できる状態にする,2. 解析結果を変えずにコードを整理する)を達成するための作業順序を定める. + +## 進め方の方針 (Approach) + +- **先に「結果が変わらないこと」を確かめる手段を作り,それからコードを整理する.**回帰テスト(ステップ 3)より前には,解析結果に影響しない変更だけを行う. +- 各ステップは `/implement` で進め,ステップごとに作業ブランチを切って `main` に取り込む. + +## ステップ一覧 (Steps) + +| # | ステップ | 目的 | 解析結果への影響 | +| --- | --- | --- | --- | +| 1 | 実行に必要なファイルの取り込み | ビルドだけで実行ファイル一式が揃うようにする | なし | +| 2 | 実行を妨げる不具合の修正 | 解析を最後まで安定して回せるようにする | なし | +| 3 | テストプロジェクトと回帰テストの作成 | 整理の前後で結果が変わらないことを確かめる手段を作る | なし | +| 4 | 未使用コード・参照の削除 | 読む量を減らし,不要な依存(脆弱性のある Newtonsoft.Json 等)をなくす | なし(回帰テストで確認) | +| 5 | 解析処理の切り出しと重複の統合 | 画面から解析処理を分け,2 モードの重複(約 420 行)をなくす | なし(回帰テストで確認) | +| 6 | エラー処理とログの整備 | 失敗の原因が分かるようにする | なし(回帰テストで確認) | + +## 各ステップの内容 (Step Details) + +### 1. 実行に必要なファイルの取り込み + +- 旧ビルド出力(`DeepTIAS2.7.1-Latest`)から,ソースに無く実行に必要なファイルを取り込む + - ネイティブ DLL: `RemoveSmallRegionDLL.dll`(と依存する `opencv_world320.dll`),`TongueAnalysisDLL.dll` + - 外部 exe: `python/TongueFeatures.exe`,`rgb2lab/`(`TongueAnalysis.exe` と色補正データ,依存する OpenCV 3.4 のデバッグ版 DLL) + - 出力雛形: `template_outputDir/`,`template_outputDir_withCalib/` +- `*.exe`・`*.dll` を Git LFS の対象に加える +- csproj に「出力ディレクトリにコピー」を指定し,ビルドだけで `bin\x64\Release\` に揃うようにする +- 完了条件: clone → ビルド → 起動 → サンプル画像 1 枚を Image モードで解析し,`analysis.csv` が出力される +- ※ 旧ビルド出力はリポジトリ外にあり,Claude はフックの制限で読めない.取り込むファイルはユーザーがリポジトリ内にコピーする(コピー先と一覧は着手時に示す) + +### 2. 実行を妨げる不具合の修正 + +- 二値画像のウィンドウ(`Cv2.ImShow`・`Cv2.WaitKey`)で解析が止まる箇所を削除する +- Start を押すたびに解析処理が重複して登録される不具合を直す.モード選択を解析後に押せる状態に戻す +- 解析中の例外を `RunWorkerCompleted` で受け取り,画面に表示して操作できる状態に戻す +- Image&Calib の出力先が `Output\debug` に固定されている件は,ユーザーの判断を得てから直す([要件定義書](PLAN_01_要件定義書.md) の未決事項) +- 完了条件: 複数枚の画像を両モードで続けて解析でき,途中で止まらない + +### 3. テストプロジェクトと回帰テストの作成 + +- MSTest のテストプロジェクト `DeepTIAS.Tests` をソリューションに追加する +- サンプル画像で正解データ(`analysis.csv` と中間画像)を作り,`DeepTIAS.Tests/TestData/` に置く +- 解析を実行して正解データと比べる回帰テストを作る(両モード) +- 開発コマンド([ENV_04](../02_ENV/ENV_04_開発コマンド.md))にテストの実行コマンドを追記する +- 完了条件: 回帰テストが通り,わざと解析結果を変えると失敗する + +### 4. 未使用コード・参照の削除 + +- 使われていないファイル(`Form1 - backups.cs`,`Settings.Designer.cs`・`Settings1.Designer.cs`)を削除する +- 使われていないメソッド・フィールド・`DllImport` 宣言・`using` を削除する +- 使われていない NuGet 参照(Microsoft.ML 一式,Newtonsoft.Json,OpenCvSharp.WpfExtensions 等)と,リポジトリ外を指す参照(OpenCvSharp.Blob,v4.7.1 の絶対パス)を削除する +- 使われていないモデル `models/ResUnet_0.9518.pb` の扱いを決める(削除するか,別の場所に保管するか) + +### 5. 解析処理の切り出しと重複の統合 + +- `Form1.cs` の解析処理を,画面に依存しないクラスに切り出す(置き場所は `.claude/rules/project-structure.md`) +- Image と Image&Calib でほぼ同じ処理を 1 つにまとめ,違い(色補正の有無,雛形,チャネル)だけを分ける +- 解析結果に影響する数値を名前付きの定数にまとめる +- 切り出した処理に単体テストを追加する + +### 6. エラー処理とログの整備 + +- `.claude/rules/error-handling.md` に沿って,握りつぶしている例外をなくし,失敗の原因をダイアログとログで伝える +- 外部 exe の終了コードと出力ファイルを確認する +- 出力フォルダに `log.txt` を書き出す + +## 対象外 (Out of Scope) + +要件定義書の「やらないこと」のとおり,新機能の追加,解析手法の変更,モデルの差し替え,外部バイナリの作り直しは本計画に含めない. + +## 未決事項 (Open Questions) + +- 回帰テストの正解データを何で作るか(下記) + +### 正解データの作り方 + +配布済みの旧 exe(2021 年版)は現行ソースからビルドしたものではない(OpenCvSharp3 / .NET 4.7.1 時点のソース).そのため,旧 exe と現行ソースの解析結果が一致するとは限らない. + +- **案 A(推奨)**: ステップ 2 完了時点の現行ソースで解析した結果を正解データにする.旧 exe の結果とも比べ,差があれば記録しておく(差の原因調査は本計画の対象外) +- **案 B**: 旧 exe の結果を正解データにする.現行ソースの結果と差がある場合,整理を始める前に差の原因を調べる必要がある 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..78e8ff8 --- /dev/null +++ "b/docs/04_SPEC/SPEC_01_\347\224\273\351\235\242\344\273\225\346\247\230.md" @@ -0,0 +1,66 @@ +# 画面仕様 (Screen Specification) + +DeepTIAS の画面構成と操作を定める.本書は v2.7 時点の動作を記録したものであり,[要件定義書](../03_PLAN/PLAN_01_要件定義書.md) で修正対象とした不具合は「既知の不具合」として区別して記す. + +## 画面構成 (Layout) + +画面は 1 つ(`Form1`,タイトル「DeepTIAS2.7」).処理の途中経過を画像で表示するパネルと,操作・状態表示の領域からなる. + +### 操作部 (Controls) + +| 部品 | 表示 | 役割 | +| --- | --- | --- | +| モード選択 | `Image(画像のみ)` / `Image&Calib(画像とカラーチャート)` | 解析モードを選ぶ.既定は `Image(画像のみ)` | +| Start ボタン | `Start` | 解析を開始する | +| Pause ボタン | `Pause` / `Continue` | 解析を一時停止・再開する.解析中のみ押せる | + +### 画像表示パネル (Image Panels) + +各パネルの見出しラベルは,その処理を実行している間だけ背景が赤になり,進行中の工程を示す. + +| 見出し | 表示する画像 | +| --- | --- | +| Input | 入力した舌画像 | +| Calibration | 色補正後の画像(Image&Calib のみ) | +| Detection | 検出した舌の矩形を描いた画像 | +| Segmentation | セグメンテーション結果(二値画像) | +| Mask | 元画像サイズに戻したマスク | +| Extraction | マスクで切り出した舌 | +| view | 領域分割の結果 | +| view2 | 未使用(常に空) | + +### 状態表示 (Status) + +| 表示 | 内容 | +| --- | --- | +| 状態 | 実行中の工程(日本語) | +| Processing File | 処理中のファイル名.待機中は `None` | +| Total Progress | 処理済み枚数 / 全枚数(例: `Total Progress: 3/10`) | + +## 操作の流れ (Operation Flow) + +1. 入力画像を所定のフォルダに置く([入出力仕様](SPEC_03_入出力仕様.md)) +2. モードを選ぶ +3. Start を押す.Start とモード選択が押せなくなり,Pause が押せるようになる +4. 画像を 1 枚ずつ解析し,各パネルと状態表示が更新される +5. Pause を押すと,処理中の画像を終えた時点で停止する.ボタンが `Continue` に変わり,押すと再開する +6. 全画像を処理すると「Finished!」のメッセージが出る.Start が再び押せるようになり,Pause は押せなくなる + +## エラー時の表示 (Error Display) + +| 状況 | 表示・動作 | +| --- | --- | +| 舌を検出できない | 表示なし.`analysis.csv` に `<画像名>,Tongue detection error` を書き,次の画像へ進む | +| 舌領域が 1 つにまとまらない | 表示なし.`analysis.csv` に `<画像名>,Tongue segmentation error` を書き,次の画像へ進む | +| 小領域除去 DLL を呼べない | エラーダイアログ(`Unable to reprocess! ...`)を出し,残りの画像を処理せずに終了する | +| 上記以外の例外 | 表示されない(既知の不具合を参照) | + +## 既知の不具合 (Known Issues) + +[要件定義書](../03_PLAN/PLAN_01_要件定義書.md) の「実行を妨げる不具合の修正」で直す対象. + +- 舌領域が 1 つにまとまらない画像で,二値画像のウィンドウ(`dst2`)が開き,キーを押すまで解析が止まる +- 2 回目以降に Start を押すと,押した回数だけ解析が重複して実行される +- モード選択は一度 Start を押すと押せないままになる(モードを変えるにはアプリの再起動が必要) +- 解析中に想定外の例外が起きると,何も表示されずに止まり,Start も押せないままになる +- Pause の停止は画像 1 枚ごとにしか効かない(1 枚の処理中は止まらない) diff --git "a/docs/04_SPEC/SPEC_02_\350\247\243\346\236\220\345\207\246\347\220\206\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_02_\350\247\243\346\236\220\345\207\246\347\220\206\344\273\225\346\247\230.md" new file mode 100644 index 0000000..2efe236 --- /dev/null +++ "b/docs/04_SPEC/SPEC_02_\350\247\243\346\236\220\345\207\246\347\220\206\344\273\225\346\247\230.md" @@ -0,0 +1,91 @@ +# 解析処理仕様 (Analysis Pipeline Specification) + +1 枚の舌画像から特徴量を得るまでの処理を定める.本書は v2.7 時点の動作を記録したものであり,コード整理ではここに書いた処理結果を変えないことを合格基準とする([要件定義書](../03_PLAN/PLAN_01_要件定義書.md) の非機能要件). + +## 全体の流れ (Overview) + +```text +入力画像 + │ (Image&Calib のみ)色補正 → L*a*b* 画像 + ▼ +1. 舌検出 ──────────── 失敗 → "Tongue detection error" + ▼ +2. 舌領域抽出(セグメンテーション → 二値化 → 必要なら小領域除去) + │ 失敗 → "Tongue segmentation error" + ▼ +3. マスク作成・舌の切り出し + ▼ +4. 形状特徴の算出 + ▼ +5. 領域分割(Chiu 法・拡張 Chiu 法・5 点法) + ▼ +6. 領域ごとの色・テクスチャ特徴の算出 + ▼ +7. analysis.csv に 1 行追記 +``` + +## 色補正 (Color Calibration) + +Image&Calib モードのみ.舌画像と,同名のカラーチャート画像を使う. + +- `rgb2lab\TongueAnalysis.exe <舌画像> <カラーチャート画像> <出力CSV>` を実行し,画素ごとの L\*a\*b\* 値を CSV に得る +- CSV から L\*a\*b\* 画像を作り,BGR に変換して表示・後続処理に使う +- 以降の舌検出・舌領域抽出はこの補正後の画像で行う.舌の切り出しは元の画像で行う +- 色特徴(手順 6)は L\*a\*b\* の値で算出する + +## 1. 舌検出 (Tongue Detection) + +| 項目 | 内容 | +| --- | --- | +| モデル | `models/Detection_Normal.pb`(TensorFlow Object Detection API) | +| 前処理 | 画像を JPEG にエンコード → 256×256 に縮小 | +| 採用する矩形 | スコアが 0.5 を超える検出のうち,最もスコアが高いもの | +| 出力 | 元画像の座標系に戻した舌の矩形 | +| 失敗条件 | 該当する検出が無い,または例外が起きた | + +## 2. 舌領域抽出 (Tongue Segmentation) + +1. 検出した矩形で画像を切り出し,256×256 に縮小する +2. `models/ResUNet.onnx` で推論する(入力は BGR を 255 で割った値,出力は 2 チャネルのうち 1 チャネル目にシグモイドをかけたもの) +3. 推論結果を大津の二値化で二値画像にする +4. 二値画像の輪郭を数える(Canny でエッジを出してから輪郭を抽出).輪郭が 0 個,または 3 個以上なら小領域除去を行う + - `RemoveSmallRegionDLL.dll` で面積 500 画素未満の領域を除去する(2 回実行.設定が異なる) + - 除去後も輪郭が 0 個,または 3 個以上なら失敗とする + +## 3. マスク作成・舌の切り出し (Mask & Extraction) + +- 二値画像を検出矩形の大きさに戻し,元画像と同じ大きさのマスクに貼り付ける +- マスクで元画像から舌を切り出す + +## 4. 形状特徴 (Shape Features) + +| 特徴量 | 内容 | +| --- | --- | +| width / height | 検出した矩形の幅・高さ | +| area | マスクの画素数(舌の面積) | +| topLeftX / topLeftY / bottomRightX / bottomRightY | 検出した矩形の左上・右下の座標 | + +## 5. 領域分割 (Region Division) + +マスクを舌の部位ごとに分ける.3 つの方法すべてを実行する. + +| 方法 | 名前 | 領域 | 概要 | +| --- | --- | --- | --- | +| Chiu 法 | `chiu` | lateral(舌辺),middle(舌中),tip(舌尖) | 舌尖は下から高さ 20%,舌辺は左右それぞれ幅 20% | +| 拡張 Chiu 法 | `exChiu` | 上記+root(舌根) | Chiu 法に,上から高さ 20% の舌根を加える | +| 5 点法(自動版) | `fiveClick` | lateral,root,middle,tip | 舌の輪郭と重心から 5 点法の基準点を自動で求め,そこから得た 8 点で分ける | + +- ※ 5 点法は本来,人が画像上で 5 点をクリックする手法(海沼 2015,石川 2010).本アプリではクリックせず自動で点を求める. + +## 6. 色・テクスチャ特徴 (Color & Texture Features) + +`python\TongueFeatures.exe <画像> <領域マスク> <色統計CSV> ` を領域分割の方法ごとに実行する. + +| 種類 | 特徴量 | 対象 | +| --- | --- | --- | +| 色統計量 | min,median,mean,max,variance,skewness,kurtosis | 領域 × チャネル(Image: B・G・R,Image&Calib: L・a・b) | +| GLCM(テクスチャ) | contrast,dissimilarity,homogeneity,ASM,energy,correlation | 領域ごと | + +## 7. 結果の集約 (Aggregation) + +画像 1 枚につき `analysis.csv` に 1 行を追記する.列の並びは [入出力仕様](SPEC_03_入出力仕様.md) を参照. diff --git "a/docs/04_SPEC/SPEC_03_\345\205\245\345\207\272\345\212\233\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_03_\345\205\245\345\207\272\345\212\233\344\273\225\346\247\230.md" new file mode 100644 index 0000000..2499d11 --- /dev/null +++ "b/docs/04_SPEC/SPEC_03_\345\205\245\345\207\272\345\212\233\344\273\225\346\247\230.md" @@ -0,0 +1,84 @@ +# 入出力仕様 (Input/Output Specification) + +DeepTIAS が読み込むファイルと書き出すファイルの場所・形式を定める.本書は v2.7 時点の動作を記録したものである. + +## フォルダの基準 (Base Directory) + +入出力のパスは,アプリの作業ディレクトリ(通常は `DeepTIAS2.7.exe` のあるフォルダ)を基準にした相対パスで決まっている. + +```text +(作業ディレクトリの 1 つ上) +├── Input\ +│ ├── TongueImage\ # 舌画像 +│ └── CalibrationColorChart\ # カラーチャート画像(Image&Calib のみ) +├── Output\ +│ └── \ # 実行ごとの出力フォルダ +└── (作業ディレクトリ)\ + ├── DeepTIAS2.7.exe + ├── models\ # 学習済みモデル + ├── python\ # TongueFeatures.exe + ├── rgb2lab\ # TongueAnalysis.exe と色補正データ + ├── template_outputDir\ # 出力フォルダの雛形(Image) + └── template_outputDir_withCalib\ # 出力フォルダの雛形(Image&Calib) +``` + +## 入力 (Input) + +| モード | フォルダ | 内容 | +| --- | --- | --- | +| 共通 | `..\Input\TongueImage\` | 舌画像.フォルダ内のファイルをすべて処理対象にする(実運用では `.bmp`) | +| Image&Calib | `..\Input\CalibrationColorChart\` | カラーチャート画像.舌画像と拡張子を除いたファイル名が同じものを対応させる | + +- ※ Image&Calib で対応するカラーチャート画像が無いと,解析が止まる([画面仕様](SPEC_01_画面仕様.md) の既知の不具合). + +## 出力フォルダ (Output Folder) + +実行ごとに `..\Output\\` を作り,雛形フォルダ(`template_outputDir` など)の中身をコピーしてから結果を書き込む. + +- ※ 日時の時は 12 時間表記(`hh`)のため,午前と午後で同じ名前になりうる. +- ※ Image&Calib では,現行ソースは出力先を `..\Output\debug\` に固定している([要件定義書](../03_PLAN/PLAN_01_要件定義書.md) の未決事項). + +```text +\ +├── analysis.csv # 全画像の特徴量(1 画像 1 行) +├── 1-detection\ +│ ├── 1-drawBox\ # 検出した矩形を描いた画像 +│ ├── 2-cropped\ # 矩形で切り出した画像 +│ └── 3-resized\ # 256×256 に縮小した画像 +├── 2-segmentation\ +│ ├── 1-modelOutput\ # モデルの出力 +│ ├── 2-binOutput\ # 二値化した画像 +│ ├── 2-binOutput(refined)\ # 小領域除去後の画像(必要な場合のみ) +│ ├── 3-resized\ # 検出矩形の大きさに戻した画像 +│ ├── 4-mask\ # 元画像サイズのマスク +│ └── 5-extraction\ # 切り出した舌 +├── 3-imgProc\ +│ ├── cvtColor\ # Image&Calib のみ +│ │ ├── LabCsv\ # 画素ごとの L*a*b* 値 +│ │ └── LabImg\ # L*a*b* から作った画像 +│ └── devideRegion\ +│ ├── chiu\ # 領域分割の結果(方法ごと) +│ ├── exChiu\ +│ └── fiveClick\ +└── 4-featureExtraction\ + ├── shape\ # 形状特徴(画像ごとの CSV) + └── region\ + └── \ + ├── colorStats\ # 色統計量(画像ごとの CSV) + └── GLCM\ # GLCM 特徴量(画像ごとの CSV) +``` + +## analysis.csv + +1 行目は雛形に書かれた見出し行.2 行目以降に画像 1 枚につき 1 行を追記する.列は全 305 列. + +| 順 | 列 | 列数 | 列名の形式 | +| --- | --- | --- | --- | +| 1 | 画像名 | 1 | `name` | +| 2 | 形状特徴 | 7 | `shape-<特徴量>`(width,height,area,topLeftX,topLeftY,bottomRightX,bottomRightY) | +| 3 | GLCM 特徴量 | 66 | `<方法>-<領域>-<特徴量>`.方法は chiu(3 領域)→ exChiu(4 領域)→ fiveClick(4 領域)の順,特徴量は 6 種 | +| 4 | 色統計量 | 231 | `<方法>-<領域>-<チャネル>-<統計量>`.方法・領域の順は GLCM と同じ,チャネルは 3 種,統計量は 7 種 | + +- チャネルは Image では `B`・`G`・`R`,Image&Calib では `L`・`a`・`b`.それ以外の列構成は両モードで同じ +- 失敗した画像は `<画像名>,Tongue detection error` または `<画像名>,Tongue segmentation error` の 2 列だけの行になる +- 従来の 5 点法による L\*a\*b\* 値に相当するのは `fiveClick-<領域>--mean` の列 diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 68e9e62..b78379a 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -9,3 +9,9 @@ - 書式・運用ルールは .claude/rules/progress-log.md を参照 (本ファイルの編集時に自動ロードされる) --> + +- [x] **プロジェクト立ち上げ(/setup)完了**: 引き継いだ DeepTIAS v2.7(C# WinForms)に合わせて要件定義・技術スタック・環境構築手順・仕様書・規約・開発計画を作成した. + - 動機: 前任者のソースは単体でビルド・実行できず,配布済み exe も現行ソースと一致しなかった(旧 exe は OpenCvSharp3 / .NET 4.7.1,現行ソースは OpenCvSharp4 / .NET 4.8). + - 設計判断: 目的を「誰でもビルド・実行できる」「解析結果を変えずに整理」の 2 つに絞り,回帰テストを作ってから整理する順序にした..NET への移行は TensorFlowSharp の作り直しが要るため対象外. + - 環境: 存在しない `OpenCvSharpExtern.dll` の参照を削除してビルドが通ることを確認済み(NuGet の runtime パッケージが同 DLL を配置する).実行は外部バイナリ取り込み後に確認する. + - 未実装・後段: PLAN_02 ステップ 1 から.未決事項は Image&Calib の出力先固定(`Output\debug`)と回帰テストの正解データの作り方.