TIASjudge に「撮影画像 → 舌のセグメンテーション → 舌色 5 分類」の判定モードを組み込むために,本リポジトリが引き渡すものと,TIASjudge 側で守るべき処理の手順を定める(本リポジトリの Issue #9.TIASjudge 側は TIASjudge の Issue #13).検証結果は TEST_07.
撮影画像(TIAS・色補正なし.cv2.imread の BGR) → 1. 舌の検出(Detection_Normal.onnx): 舌の枠 → 2. 舌の分割(ResUNet.onnx): 枠の中の舌マスク → 元の画像サイズのマスク → 3. マスク外を黒 (0,0,0) にした RGB 画像 → 4. 色特徴(107 次元)→ ロジスティック回帰(color_model.json): 5 クラスの確率
1〜2 は DeepTIAS 2.7 の「画像のみ」モードの手順を再現したもの(DeepTIAS の実行ファイルの逆コンパイルで確認).3 は DeepTIAS の 2-segmentation/5-extraction と同じ形で,判定モデルの学習データもこの形である.
| もの | 内容 | 入手先 |
|---|---|---|
color_model.json | 判定モデル(特徴の定義・標準化の値・係数・切片・クラス・学習条件・来歴).約 28 KB.ややあり除外のモデル(下記) | tias-train color-export --config configs/export/color_logistic_without_mild.yaml の出力(サーバで実行し tias-remote pull で回収.ENV_04).2026-09-28 の書き出しは実験 ID 20260928-232605_color_logistic_without_mild_405ab01-dirty |
deploy/color_model.py | 判定モデルの参照実装(NumPy と標準ライブラリのみ.単一ファイル) | src/tias_judge_model/deploy/color_model.py をそのままコピーする |
segmentation/(detection.py・resunet.py・pipeline.py) | セグメンテーションの参照実装(NumPy・OpenCV・onnxruntime のみ.パッケージ内では相互にだけ依存) | src/tias_judge_model/segmentation/ から 3 ファイルをコピーし,import 文のパッケージ名を合わせる |
ResUNet.onnx | 舌の分割モデル(約 71 MB.入力 input.1 (1,3,256,256) float32,出力 (1,2,256,256)) | DeepTIAS 2.7 の models/ に同梱のもの(開発元のファイルとハッシュが一致) |
Detection_Normal.onnx | 舌の検出モデル(約 12 MB) | DeepTIAS 2.7 の models/Detection_Normal.pb を scripts/convert_detection_to_onnx.py で変換したもの(サーバの ~/models/TongueSegmentation/ にある) |
.onnx・color_model.json)は本リポジトリに入れない(臨床データから学習したもの)ResUNet.onnx・Detection_Normal.onnx)は TIASjudge の配布物に含めてよい(2026-09-29 にユーザーが確認)numpy・opencv-python(既存)・onnxruntime(追加).TensorFlow・PyTorch・scikit-learn は不要ややあり除外のモデル(configs/export/color_logistic_without_mild.yaml.学習 754 枚・C = 0.1)を渡す(2026-09-29 のユーザー判断).
segmentation/detection.py の OnnxDetector.detect(bgr).
(1, H, W, 3)(入力名 image_tensor:0.TF の物体検出 API の既定.DeepTIAS も Bitmap 経由で RGB を渡している).画像サイズは任意detection_boxes(正規化座標 ymin, xmin, ymax, xmax)・detection_scoressegmentation/pipeline.py の segment_in_rect(bgr, rect, runner, params)(runner は resunet.py の ResUNetRunner).
cv2.resize(線形補間)で 256×256 にするcv2.imread の BGR /255 と同じ)設定値(SegmentationParams): foreground_channel=0・min_area=500・mask_threshold=127.TEST_07 の評価(IoU 0.958)はこの値で行った.
deploy/color_model.py.
model = load_color_model("color_model.json")
probs = predict_proba(rgb_masked, model) # (5,) の確率.並びは model の classes の順
max_side(512)を超える画像は最近傍法で縮小してから特徴を取る(学習時と同じ.predict_proba の中で行う)color_model.json の classes(0 淡白・1 淡紅・2 紅・3 暗赤紅・4 紫)に従う.最大の確率のクラスを判定結果とし,5 クラスの確率も表示する| 段階 | 指標 | 値 | 出典 |
|---|---|---|---|
| セグメンテーション | 撮影画像からの舌の IoU(検出+ResUNet.170 枚) | 平均 0.958・最小 0.864 | TEST_07 |
| 舌色の判定 | 「あり」と淡紅での macro F1(5-fold × 3 seed) | 0.630(ややあり込み)〜0.644(除外) | TEST_05 |
| 舌色の判定 | 同・正解率 | 0.72〜0.75 | TEST_05 |
判定の性能は医師のラベルとの一致がまだ 7 割程度であり,当面は参考表示とする.ルールベース診断との比較(PLAN_02 Step 6)の結果を見て扱いを決める.
ResUNet.onnx 約 71 MB で単体 exe が大きくなる)