# 技術スタック (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 | |
| ビルドツール | Visual Studio Build Tools 2022 | ワークロード「.NET デスクトップ ビルド ツール」「C++ ビルド ツール」 |
| IDE | 必須にしない（エディタは任意．VS Code 等） | 画面（`Form1.Designer.cs`）を編集するときだけ Visual Studio 2022 Community を追加する |
| ビルド | MSBuild（Build Tools 付属） | コマンドラインで `msbuild` を使う |
| NuGet 復元 | `msbuild -t:restore -p:RestorePackagesConfig=true` | `nuget.exe` を別途入れずに済む |
| テスト | MSTest | .NET Framework 4.8 のテストプロジェクトとして作る |
| バージョン管理 | Git + Git LFS，GitHub | |

## 選定理由 (Rationale)

### ビルドツールと IDE

- Visual Studio Build Tools 2022 を採用し，IDE は必須にしない．開発計画（[PLAN_02](../03_PLAN/PLAN_02_開発ステップ.md)）の作業はビルド・実行・テストで足り，画面のレイアウトを変える作業が無いため．
- 「C++ ビルド ツール」ワークロードも入れる．`rgb2lab\TongueAnalysis.exe` がデバッグビルドで，VC++ のデバッグ用ランタイム（`MSVCP140D.dll`・`ucrtbased.dll` 等）が無いと起動しないため．このワークロードを入れると，デバッグ用ランタイムが `C:\Windows\System32` に入ることを確認した．
- ※ デバッグ用ランタイムは単体では配布されておらず，ライセンス上リポジトリに入れて再配布することもできない．
- ※ 画面の見た目を変えるとき（WinForms デザイナが要るとき）や，ブレークポイントを使ったデバッグをしたいときは，Visual Studio 2022 Community を追加で入れる（Build Tools と共存できる）．

### テストフレームワーク

- MSTest を採用する．Visual Studio 系の標準のテストフレームワークで，Build Tools 付属のテスト実行環境でも動き，後任の学生も追加の知識なしで使えるため．
- 主なテストは回帰テストとする．旧ビルドで出した `analysis.csv` を正解とし，整理後のコードで同じ入力を解析した結果が一致するかを確認する．

## 維持するもの・変えないもの (What We Keep)

- .NET Framework 4.8 から .NET 8 以降への移行は行わない（TensorFlowSharp が .NET Framework 向けで，移行すると推論部分の作り直しが必要になるため）．
- 外部バイナリは作り直さずにそのまま使う．
