tongue AI 舌诊 Web 系统

作者 : tideit 本文共3775个字,预计阅读时间需要10分钟 发布时间: 2026-09-13 共18人阅读

 

 

# AI 舌诊 Web 演示系统

> 定位:教学 / 技术原型(demo),**非医疗器械**,不替代医师面诊。

—

## 一、项目一句话概述

一个基于 Flask + OpenCV + 本地 Vision 大模型的「AI 舌面照片分析」Web 演示系统。
用户上传舌面照片 → 后端做图像标准化、舌体分割、特征量化、规则引擎辨证 →
返回量化结果 + 分割标注图 + 本地多模态大模型的 AI 解读 → 历史记录入库 SQLite/MySQL。

—

## 二、技术栈

| 层 | 选型 | 说明 |
|—-|——|——|
| 后端 | Flask (Python) | 路由、API、页面渲染(内联 HTML/JS 单文件) |
| 图像处理 | OpenCV (opencv-python) | 去噪、直方图均衡、HSV 颜色分割、轮廓提取、Canny 边缘 |
| 数值 | numpy | 特征统计计算 |
| 可选依赖 | scikit-learn | `requirements.txt` 列出,但当前代码未使用(预留 ML 替换规则引擎) |
| AI 解读 | 本地 OpenAI 兼容 Vision API | `http://192.168.11.187:20128/v1/chat/completions`,model=`vision` |
| 存储 | SQLite (`tongue.db`) + MySQL 导出脚本 (`tongue.sql`) | 运行时用 SQLite;`.sql` 为 Navicat 同步产物,结构一致 |
| 前端 | 原生 HTML/JS(内联于 `app.py` 的 `HTML` 常量) | 单页,无构建工具 |

—

## 三、目录结构

“`
E:/flask/tongue/
├── app.py # Flask 入口:路由 + 页面 + API + SQLite + Vision 调用
├── tongue_ai.py # 核心算法库:标准化/分割/特征/辨证 5 段流水线
├── tongue.db # 运行时 SQLite 数据库
├── tongue.sql # MySQL 建表+3 条记录导出(Navicat)
├── requirements.txt # opencv-python / numpy / scikit-learn
├── API.md # 对外 API 文档
├── uploads/ # 上传舌图存储目录
├── static/ # 静态资源(tongue_sample.png 拍摄示例图)
└── _out_anno.txt, _srv.log, mcp-shell.log # 运行日志/临时产物
“`

—

## 四、核心业务流水线(tongue_ai.py)

整条流水线 5 个阶段,函数职责清晰,可独立 CLI 运行:

### 1. 图像标准化 `standardize(img_bgr)`
– `fastNlMeansDenoisingColored` 去噪
– BGR→LAB,对 L 通道直方图均衡(消除亮度差异/光照不均)
– resize 到 512×512 统一尺寸

### 2. 舌体分割 `segment_tongue(img)`
– BGR→HSV,取两段红色区间(H∈[0,15]∪[160,180],S/V 阈值)并 `bitwise_or`
– 闭运算(9×9)去小洞 + 开运算(5×5)去噪点
– `findContours` 取最大轮廓填充 → 返回二值掩码
– 注释明确:工程上用 U-Net / Mask R-CNN 替代

### 3. 特征量化 `extract_features(img, mask)`
在掩码内采样像素,输出 10 个量化特征:
– 颜色类:`R/G/B` 均值、`sat`(HSV 饱和度→苔腻参考)、`val`(明度)
– 纹理类:`texture`(灰度 Laplacian 方差→舌苔厚薄/腻腐)
– 形态类:`aspect`(长宽比)、`roughness`(周长/(2×(w+h)),>1.15 提示齿痕)、`crack`(Canny 边缘密度→裂纹)
– `area_ratio`(舌体占图像面积比)
– 掩码像素 <100 时抛 `RuntimeError`(未检测到有效舌体)

### 4. 辨证推理 `diagnose(f)`(规则引擎,非临床依据)
– 舌色:按 RGB 阈值判 `淡白 / 淡红(默认) / 红绛 / 青紫`
– 舌苔:`sat<55`→薄白;否则 `texture>800`→黄腻,否则白腻
– 舌形:`roughness>1.18 或 aspect>1.35`→齿痕/胖大;`crack>0.06`→裂纹
– 体质映射(极简示意):
– 淡白 → 气虚质/阳虚质
– 黄腻 或 红绛 → 湿热质/阴虚质
– 青紫 → 血瘀质
– 含齿痕 → 追加「兼脾虚湿盛」
– 默认兜底:平和质 / shape=[“正常”]

### 5. 报告 `report(f, d)`
拼接带数值的纯文本报告,末尾附免责声明。

### 附加 `make_demo_image()`
无输入参数时生成一张椭圆模拟舌图(512×512),用于演示跑通流水线。

**CLI 用法**:`python tongue_ai.py <舌图.jpg>`,无参则用模拟图。

—

## 五、Web 服务(app.py)

### 路由表

| 方法 | 路径 | 说明 |
|——|——|——|
| GET | `/` | 内联 HTML 单页(上传 + 报告 + 历史表) |
| GET | `/uploads/` | 静态上传图回显 |
| POST | `/api/diagnose` | 主分析接口(multipart 上传 `image`) |
| GET | `/api/records` | 历史 50 条记录 |

### POST `/api/diagnose` 处理流程
1. 读 `image` 文件 → `cv2.imdecode` 解码(失败→400)
2. 跑 `standardize → segment_tongue → extract_features → diagnose` 四段(`RuntimeError`→422)
3. 在标准化图上叠加绿色分割轮廓 → base64 JPEG data URI(返回 `annotated`)
4. 裁出舌体 bounding box(±12px 边距)→ 调 `vision_interpret()` 得 AI 解读(异常则 `ai=None`,不阻塞主流程)
5. 落盘原图到 `uploads/`(时间戳前缀文件名)→ 写 SQLite `records` 表(写入失败不报错,`record_id=None`)
6. 返回 JSON:`record_id / features / diagnosis / annotated / ai_interpretation`

### 本地 Vision 调用 `vision_interpret(jpg_bytes)`
– 请求体:OpenAI 兼容 chat/completions,system 设定「资深中医舌诊专家」人设,要求 5 段结构(舌色/舌苔/舌形/体质/调养建议)+ 医疗免责
– `image_url` 用 base64 data URI,`max_tokens=1024, temperature=0.2`
– 解析 `choices[0].message.content`;服务不可达时整段 try/except 吞掉,AI 字段为 null,前端降级显示「AI 解读服务不可达」

### 数据模型 `records` 表
`id, filename, path, features(json), diagnosis(json), ai_interpretation(text), created_at`
– 运行时 SQLite;`tongue.sql` 为同结构 MySQL(MyISAM/utf8mb4) 导出,含 3 条 2026-08 记录

### 前端(内联单页)
– 拍摄指导卡(示例图 + 4 步拍照要点)
– 拖拽/点击上传 → 预览 → 生成报告
– 结果区:标注图 + 舌色/舌苔/舌形/体质 + 10 项量化特征 + 标签
– AI 解读区(有则显示全文,无则提示降级)
– 历史表:缩略图点击弹 modal 显示大图 + AI 解读(Esc 关闭)
– 每页末固定医疗免责文案

—

## 六、核心业务逻辑归纳

“`
舌面照片
→ 去噪 + 亮度均衡 + 归一尺寸 (消除光照/色偏)
→ HSV 双红区分割出舌体掩码 (工程化可换 U-Net)
→ 掩码内提取 10 维特征 (颜色/纹理/形态)
→ 规则引擎映射舌色·舌苔·舌形·体质 (工程化可换 CNN/知识图谱)
→ 叠加轮廓标注图 + 裁舌体调 Vision (AI 自然语言解读, 可选降级)
→ 原图+特征+诊断+AI 解读 入 records (SQLite/MySQL)
→ Web 单页展示 + 历史查询
“`

—

## 七、安全与合规要点(现有/待改进)

– 医疗定位:全链路带「非诊断、辅助参考、遵医嘱」免责;真实产品须按二类医疗器械注册
– `VISION_KEY` 硬编码在 `app.py`(`sk-…`)→ 应移入环境变量
– `/uploads` 静态目录直接对外,文件名含用户原扩展名 → 生产需校验白名单(MIME)+随机化存储名
– 无鉴权、无速率限制 → 演示可接受,生产需补齐
– Vision 服务为内网 IP,服务不可达时已做降级(主流程不受影响)

—

## 八、运行方式

“`bash
pip install -r requirements.txt
python app.py # http://127.0.0.1:5000
# 或纯算法 CLI
python tongue_ai.py tongue.jpg
“`

 

暂无优惠

已有0人支付


我爱数钱钱 » tongue AI 舌诊 Web 系统

常见问题FAQ

发表评论