1. 项目背景与核心价值
中医舌诊作为"望闻问切"四诊之首,其客观化研究一直是数字中医的前沿方向。传统舌象分析依赖医师经验判断,存在主观性强、标准不统一等问题。我们团队开发的这套基于DuckNet的舌象分割系统,正是要解决这个痛点——通过深度学习技术实现舌体的精准自动分割,为后续的舌色、舌苔、裂纹等特征分析建立可靠基础。
这个系列教程将从最基础的数据集说明开始,逐步深入到模型训练、部署应用等环节。作为开篇,今天重点介绍我们精心构建的中医舌象分割专用数据集。这个数据集包含300对高质量舌象图像与标注mask,全部由三甲医院中医专家参与标注,具有以下突出特点:
- 采集环境标准化:所有图像均在D65标准光源下使用专业医疗相机拍摄
- 标注精细度达像素级:舌体边缘标注误差控制在3个像素以内
- 病例覆盖全面:包含健康人群及8类常见证型的舌象样本
2. 数据集详解与获取方式
2.1 数据组成与结构
数据集采用标准的图像分割数据集格式组织,包含以下核心目录:
code复制TongueSegDataset/
├── images/ # 原始舌象图像
│ ├── 001.jpg # 命名规则:三位序号.jpg
│ └── ... # 300张彩色图像,分辨率统一为1024×768
├── masks/ # 对应标注mask
│ ├── 001.png # 二值化PNG格式,白色(255)为舌体区域
│ └── ...
└── metadata.csv # 元数据文件,包含患者基本信息与诊断结论
数据样本的典型分布情况如下表所示:
| 证型类别 | 样本数量 | 占比(%) | 典型特征 |
|---|---|---|---|
| 健康舌象 | 45 | 15 | 淡红舌,薄白苔 |
| 气虚证 | 38 | 12.7 | 舌淡胖有齿痕 |
| 血瘀证 | 42 | 14 | 舌紫暗有瘀斑 |
| 湿热证 | 40 | 13.3 | 舌红苔黄腻 |
| ... | ... | ... | ... |
2.2 数据采集与标注规范
为确保数据质量,我们制定了严格的采集标注流程:
-
采集环节:
- 使用Canon EOS 5D Mark IV搭配EF 100mm f/2.8L Macro镜头
- 光源采用GretagMacbeth Judge II灯箱(D65标准光源)
- 拍摄距离固定为50cm,患者伸舌自然放松状态
-
标注环节:
- 由3位副主任医师级中医专家背靠背标注
- 采用Labelme工具进行多边形标注,最后取三人标注结果的交集
- 对存在争议的样本(约5%)进行会诊讨论确定最终标注
重要提示:所有患者数据均经过脱敏处理,去除可识别个人信息,符合《医疗卫生机构科研用人类生物样本管理暂行办法》要求
2.3 数据下载与使用授权
数据集提供两种获取方式:
-
学术用途:
- 填写《中医舌象研究数据使用申请表》(下载链接:example.com/form)
- 邮件发送至research@tcmai.org
- 审核通过后获取百度网盘下载链接(提取码随邮件发送)
-
商业用途:
- 需签订数据授权协议
- 按项目规模收取数据授权费(具体咨询business@tcmai.org)
数据集使用建议:
- 训练集/验证集/测试集建议按7:2:1划分
- 数据增强推荐使用随机旋转(±15°)、颜色抖动(Δhue=0.1)等轻度增强
- 避免使用强几何变换以免破坏舌体形态特征
3. DuckNet模型适配技巧
虽然本系列后续才会深入模型细节,但在此先分享几个数据集与DuckNet配合使用的关键技巧:
3.1 输入预处理规范
python复制# 示例代码:数据加载与预处理
import cv2
import numpy as np
def preprocess(img_path, mask_path):
# 读取时保持原始比例(后续由DuckNet的ASPP模块处理)
img = cv2.imread(img_path, cv2.IMREAD_COLOR)
mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)
# 颜色归一化(关键步骤!)
img = img.astype(np.float32) / 255.0
img = (img - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225] # ImageNet均值方差
# mask二值化处理
mask = (mask > 127).astype(np.float32)
return img, mask
3.2 类别不平衡处理
舌体区域通常只占图像的15-25%,为解决类别不平衡问题,我们推荐:
- 损失函数采用Dice Loss + Focal Loss组合(α=0.7, γ=2)
- 在DuckNet的decoder部分添加SE注意力模块
- 对舌体边缘像素使用3倍采样权重
3.3 评估指标选择
不同于一般分割任务,舌象分割建议采用:
- 边缘准确率(EA):专门评估舌体轮廓分割精度
- 重叠度(IoU):整体分割效果
- 敏感度(Sensitivity):避免漏诊关键病理特征
4. 常见问题解决方案
在实际使用中,我们遇到过以下典型问题及解决方法:
4.1 图像质量异常处理
问题现象:部分图像出现反光或阴影
解决方案:
- 使用CLAHE算法进行局部对比度增强
- 采用基于inpainting的反射区域修复
python复制def remove_glare(img):
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
l_clahe = clahe.apply(l)
lab_clahe = cv2.merge((l_clahe,a,b))
return cv2.cvtColor(lab_clahe, cv2.COLOR_LAB2BGR)
4.2 小舌体分割优化
问题现象:儿童或萎缩舌样本分割效果差
优化方案:
- 在DuckNet的skip connection中添加可变形卷积
- 使用多尺度训练(输入尺寸512-1024随机缩放)
- 对这类样本进行针对性数据增强
4.3 模型泛化能力提升
当遇到其他设备采集的图像时,建议:
- 在数据集中添加10%的外部数据(如TCML数据集)
- 使用CycleGAN进行域适应转换
- 在模型最后添加一个浅层的自适应模块
5. 扩展应用与后续计划
这套数据集除了用于基础的舌体分割外,还可支持以下研究方向:
- 舌苔/舌质分离(需额外标注)
- 舌下静脉提取与分析
- 动态舌象视频分割(我们正在构建相关数据集)
近期将更新的内容:
- 新增50例COVID-19康复期患者的舌象数据
- 发布基于DuckNet-Lite的移动端优化模型
- 提供Colab上的在线体验demo
对于想立即开始实践的读者,推荐以下学习路径:
- 先使用我们提供的基础数据跑通训练流程
- 尝试在Kaggle上的小型舌象数据集验证模型泛化性
- 最后在自己的临床数据上进行微调测试
