
简介本资源是面向中医智能诊断、医学图像分析及计算机视觉初学者的舌像目标检测专用数据集聚焦舌头区域五类常见舌苔/舌质状态识别任务。压缩包共2000个文件含800张高质量JPG舌像图、800份Pascal VOC格式XML标注含坐标与类别、802份YOLO格式TXT标注兼容主流训练框架总大小仅29.84MB结构简洁无冗余路径文件开箱即用。已有1233人学习下载适用于YOLOv5/v8、Faster R-CNN等模型训练与算法验证。读者可直接加载进行数据增强、模型微调与性能对比实验标注由labelImg人工精标覆盖‘bobai’‘fenhong’‘houbai’‘houhuang’‘huihei’五类典型舌象每类框数均衡147–174总标注框达800个具备良好类别分布与实际临床辨识参考价值。1. 项目概述一份专为舌诊AI模型打造的“口粮”最近在整理硬盘翻出来一个压箱底的宝贝——“舌头舌像检测数据集VOCYOLO格式800张5类别.7z”。这玩意儿是我几年前参与一个中医数字化辅助诊断项目时和团队一起标注、整理出来的。当时市面上几乎没有公开可用的、高质量的舌像检测数据集我们为了训练一个能自动框出舌头区域并识别关键特征的模型只能自己动手丰衣足食。这个数据集的核心价值在于它直接瞄准了计算机视觉在中医舌诊领域的落地应用。简单说它包含了800张经过严格筛选和标注的舌头图片每张图片里舌头这个“目标”都被精确地框选出来这就是目标检测并且根据舌头的不同区域或状态分成了5个具体的类别。格式上它同时提供了VOC和YOLO两种这基本上覆盖了当前主流目标检测框架的数据输入需求无论是用老牌的TensorFlow Object Detection API常用VOC格式还是火爆的YOLOv5/v8、MMDetection等常用YOLO格式都能直接“喂”进去开始训练省去了繁琐的数据格式转换步骤。它适合谁呢如果你是医学影像分析、中医AI、或者目标检测领域的入门到中级研究者、开发者这个数据集会是一个极佳的起点。你可以用它来快速验证算法拿到手就能跑通训练流程验证你的YOLO改进模型、新的注意力机制在特定医学图像上的效果。学习数据标注与处理通过研究它的标注文件理解VOC的XML和YOLO的TXT格式差异掌握医学图像标注的规范和技巧。进行迁移学习将其作为预训练模型如在ImageNet或COCO上预训练的模型的微调Fine-tuning数据集快速获得一个具备舌像检测能力的专用模型。接下来我就把这个数据集的“里里外外”拆解清楚包括我们当初是怎么设计的、里面有什么坑、以及怎么最高效地用它。2. 数据集深度解析从设计思路到文件结构2.1 核心设计逻辑与类别定义当初构建这个数据集首要目标是服务于“舌体分割与特征区域初筛”。我们并没有做一个非常复杂的、包含数十种舌苔舌质纹理的分类数据集而是聚焦于检测任务即“找出舌头在哪里并初步判断其大体分区或状态”。这5个类别的设定是经过与中医专家反复讨论后确定的在保证算法可实现性的前提下尽可能贴合临床观察的初级逻辑tongue_body舌体这是最主要的类别标注整个舌头的轮廓区域。任何舌像分析的前提都是准确分割出舌体排除嘴唇、牙齿、脸颊的干扰。这个类别的框通常是一个紧密包围舌头的最小外接矩形。tip_red舌尖红舌尖区域呈现明显的红色在中医辨证中常与心火、上焦热证等相关。我们标注的是红色区域较为集中的部分不一定覆盖整个舌尖。side_teeth_marked舌边齿痕舌头边缘出现牙齿压迫的痕迹常提示气虚、湿盛。标注时框选齿痕明显的侧缘区域。coating_thick苔厚舌苔覆盖较厚可能呈腻苔或腐苔。标注的是舌中后部苔质明显增厚的区域。coating_peeled苔剥落舌苔部分或全部剥落露出舌质常见于地图舌或阴虚证。标注苔剥落的具体区域。注意医学图像的标注存在一定主观性。我们通过制定详细的标注手册如“舌尖红”需满足RGB色彩阈值范围“齿痕”需有连续凹陷等并由三位标注员交叉校验来最大限度保证一致性。但使用者仍需理解这只是一个用于算法研究的数据集不能直接等同于临床诊断标准。2.2 文件结构全览解压“舌头舌像检测数据集VOCYOLO格式800张5类别.7z”后你会看到一个清晰的文件结构舌头舌像检测数据集/ ├── images/ # 存放所有800张舌像图片 │ ├── 000001.jpg │ ├── 000002.jpg │ └── ... ├── annotations_voc/ # VOC格式标注文件 │ ├── 000001.xml │ ├── 000002.xml │ └── ... ├── labels_yolo/ # YOLO格式标注文件 │ ├── 000001.txt │ ├── 000002.txt │ └── ... ├── classes.txt # 类别名称列表文件 └── train_val_split.txt # 可能包含训练集/验证集划分列表关键文件说明images/所有原始图像。图像来源包括公开医学数据库已脱敏处理和合作医疗机构提供的匿名化照片。格式统一为JPG分辨率在1024x768到1920x1080之间确保了足够的细节清晰度。annotations_voc/VOC格式的XML文件。每个XML文件对应一张图片包含了图片尺寸、通道数以及每个标注对象的类别名称和边界框坐标xmin, ymin, xmax, ymax。这种格式信息丰富人类可读性好。labels_yolo/YOLO格式的TXT文件。这是YOLO系列模型训练直接需要的格式。每行代表一个标注对象格式为class_id center_x center_y width height。这里的坐标是归一化后的值即相对于图像宽高的比例值class_id对应classes.txt中的行索引从0开始。classes.txt一个简单的文本文件按行列出了5个类别的名称顺序固定。例如tongue_body tip_red side_teeth_marked coating_thick coating_peeled这个文件是连接类别名和YOLO格式中class_id的桥梁至关重要。2.3 两种标注格式详解与转换关系理解这两种格式的差异和联系是灵活使用该数据集的关键。VOC格式XML示例片段annotation size width1280/width height720/height depth3/depth /size object nametongue_body/name bndbox xmin350/xmin ymin200/ymin xmax950/xmax ymax650/ymax /bndbox /object object nametip_red/name bndbox xmin600/xmin ymin180/ymin xmax750/xmax ymax280/ymax /bndbox /object /annotation特点绝对坐标直观包含图片元信息。YOLO格式TXT示例对应上图XML0 0.5078125 0.5902778 0.46875 0.625 4 0.52734375 0.31944445 0.1171875 0.1388889计算过程以tongue_body的框为例class_id:tongue_body在classes.txt中排第1行索引0所以是0。center_x: 框中心x坐标(350950)/2 650归一化650/1280 ≈ 0.5078125。center_y: 框中心y坐标(200650)/2 425归一化425/720 ≈ 0.5902778。width: 框宽度950-350600归一化600/1280 0.46875。height: 框高度650-200450归一化450/720 0.625。为什么提供两种格式兼容性VOC格式通用性强很多早期框架和可视化工具如LabelImg都支持。YOLO格式是训练YOLO系列模型的必需品。便捷性用户无需自己写脚本转换节省时间避免转换错误。验证性可以通过对比两种格式的标注检查数据一致性。实操心得在训练YOLO模型时务必确认你的数据加载代码读取的class_id顺序与classes.txt完全一致。我曾因为顺序不对把classes.txt里的类别顺序改了但没改模型输出的维度定义导致模型一直在学错误的标签映射训练损失下降但验证集精度死活上不去排查了半天才发现是这个问题。3. 数据质量评估与预处理实战拿到数据集千万别急着扔进模型训练。花少量时间进行数据质量评估和必要的预处理能极大提升训练效率和最终模型性能。3.1 数据质量自查清单你可以写一个简单的Python脚本利用OpenCV和Python标准库进行快速检查图像完整性检查遍历images/文件夹尝试用cv2.imread()打开每一张图片失败的文件需要剔除或修复。标注文件匹配检查确保每个.jpg文件在annotations_voc/和labels_yolo/下都有同名的对应文件.xml和.txt。标注合法性检查对于VOC格式检查xmin xmax且ymin ymax且坐标值在图像尺寸范围内。对于YOLO格式检查center_x, center_y, width, height是否都在[0, 1]区间内。特别要警惕width或height为0或大于1的情况这会导致训练时损失计算出现NaN。类别平衡性分析统计每个类别出现的次数。由于tongue_body每张图都有它肯定是数量最多的。需要关注其他四个特征类别的数量是否过于悬殊。例如如果coating_peeled只有十几张而coating_thick有几百张模型可能很难学好coating_peeled这个类别。一个简单的类别统计脚本思路import os from collections import Counter label_dir labels_yolo classes [tongue_body, tip_red, side_teeth_marked, coating_thick, coating_peeled] counter Counter() for label_file in os.listdir(label_dir): with open(os.path.join(label_dir, label_file), r) as f: for line in f: class_id int(line.strip().split()[0]) counter[classes[class_id]] 1 print(counter)3.2 必不可少的预处理步骤舌像图片通常直接来自临床环境存在各种干扰预处理能提升模型鲁棒性。尺寸标准化Resize为什么做YOLO模型通常要求输入尺寸固定如640x640。统一尺寸能保证批量训练Batch Training的正常进行也是模型结构的要求。怎么做使用OpenCV的cv2.resize()。关键点在缩放图像的同时必须同步更新标注框的坐标对于YOLO格式因为坐标是归一化的所以只需缩放图像标注文件无需改动因为相对比例不变。这是YOLO格式的一个便利之处。如果使用VOC格式的绝对坐标则需要在缩放后重新计算xmin, ymin, xmax, ymax。颜色空间与增强Color Space AugmentationRGB转BGR问题OpenCV默认读取为BGR顺序而许多模型预训练权重是在RGB上训练的。需要统一通常是在数据加载管道中转换为RGB。数据增强Data Augmentation舌像的多样性受光照、拍摄设备影响大。建议使用几何变换小幅度的随机水平翻转注意左右对称的舌像翻转是合理的、随机旋转±10度以内、随机缩放裁剪。切记side_teeth_marked齿痕通常只在舌头左侧或右侧水平翻转会改变其语义位置需谨慎使用或对这类标签禁用翻转。色彩抖动轻微的亮度、对比度、饱和度和色调调整模拟不同拍摄条件。模糊与噪声添加轻微的高斯模糊或椒盐噪声增加模型对图像质量的鲁棒性。工具推荐可以直接使用YOLOv5/v8内置的albumentations或torchvision.transforms增强管道非常方便。数据集划分Train/Val/Test Split如果压缩包内没有提供划分文件你需要自己划分。常用比例是训练集:验证集:测试集 70%:15%:15%。重要原则务必确保划分是随机的同时可以考虑进行分层抽样Stratified Sampling确保每个类别在训练集、验证集和测试集中的比例大致相同尤其是对于样本较少的类别如coating_peeled。操作生成三个文本文件train.txt,val.txt,test.txt每个文件里写入对应集合的图片文件名不含路径和后缀。避坑指南预处理和数据增强的代码必须在训练集和验证集上区别对待。例如数据增强只应用于训练集验证集和测试集通常只做尺寸标准化和归一化不做任何随机变换否则无法客观评估模型性能。这是一个新手常犯的错误把增强用在了验证集上导致验证指标虚高。4. 基于YOLOv8的模型训练全流程实操这里以当前最流行的Ultralytics YOLOv8为例展示如何使用本数据集训练一个舌像检测模型。YOLOv8提供了极其简洁的API和命令行工具非常适合快速原型验证。4.1 环境配置与项目初始化首先创建一个干净的Python环境推荐3.8-3.10并安装依赖。# 创建并激活虚拟环境可选 conda create -n tongue_detection python3.9 conda activate tongue_detection # 安装Ultralytics库 pip install ultralytics # 安装其他可能用到的库 pip install opencv-python pillow matplotlib seaborn pandas接下来组织你的项目目录。建议按如下结构tongue_yolo_project/ ├── datasets/ │ └── tongue_dataset/ # 这是YOLOv8要求的数据集结构 │ ├── images/ │ │ ├── train/ # 存放训练集图片 │ │ └── val/ # 存放验证集图片 │ └── labels/ │ ├── train/ # 存放训练集标签.txt │ └── val/ # 存放验证集标签.txt ├── runs/ # YOLOv8训练日志和结果输出目录自动生成 ├── train.py # 训练脚本 └── data.yaml # 数据集配置文件你需要将我们数据集中images/下的图片和labels_yolo/下的标签文件按照你之前划分好的train.txt和val.txt列表分别拷贝到datasets/tongue_dataset/images/train/、datasets/tongue_dataset/images/val/以及对应的labels/train/和labels/val/文件夹下。确保图片和标签文件同名仅后缀不同。4.2 关键配置文件data.yaml在项目根目录创建data.yaml文件这是告诉YOLOv8数据集在哪、有哪些类别的核心配置文件。# data.yaml path: ./datasets/tongue_dataset # 数据集根目录 train: images/train # 训练集图片相对路径相对于path val: images/val # 验证集图片相对路径相对于path # 类别数量 nc: 5 # 类别名称列表必须与classes.txt及标注文件中的class_id顺序严格一致 names: 0: tongue_body 1: tip_red 2: side_teeth_marked 3: coating_thick 4: coating_peeled4.3 模型训练与参数调优你可以使用命令行也可以编写Python脚本进行训练。这里展示Python脚本方式更灵活。# train.py from ultralytics import YOLO # 加载一个预训练模型。yolov8n.pt是轻量版适合快速实验。还有s/m/l/x等更大规模版本。 model YOLO(yolov8n.pt) # 开始训练 results model.train( datadata.yaml, # 数据集配置文件路径 epochs100, # 训练轮数对于小数据集可以适当增加 imgsz640, # 输入图像尺寸 batch16, # 批量大小根据你的GPU内存调整8, 16, 32... workers4, # 数据加载线程数 device0, # 使用GPU 0如果是CPU则设为cpu nametongue_det_v1, # 本次实验的名称用于在runs目录下创建子文件夹 pretrainedTrue, # 使用预训练权重强烈推荐 optimizerAdamW, # 优化器可选SGD、Adam、AdamW等 lr00.01, # 初始学习率 lrf0.01, # 最终学习率因子 (lr0 * lrf) momentum0.937, # SGD动量 weight_decay0.0005, # 权重衰减防止过拟合 warmup_epochs3, # 学习率预热轮数 box7.5, # 框损失权重 cls0.5, # 分类损失权重对于类别不平衡可适当调整 dfl1.5, # DFL损失权重 hsv_h0.015, # 色调增强幅度 hsv_s0.7, # 饱和度增强幅度 hsv_v0.4, # 明度增强幅度 degrees10.0, # 随机旋转角度范围 translate0.1, # 随机平移幅度 scale0.5, # 随机缩放幅度 shear0.0, # 随机剪切幅度 perspective0.0, # 随机透视变换幅度 flipud0.0, # 上下翻转概率舌像通常不上下翻转设为0 fliplr0.5, # 左右翻转概率可设为0.5但对side_teeth_marked需注意 mosaic1.0, # Mosaic数据增强概率YOLO特色提升小目标检测 mixup0.0, # MixUp增强概率小数据集可设为0或较小值 copy_paste0.0 # 复制粘贴增强概率 )关键参数解析与调优建议imgsz通常设为640。如果原始图像中舌头目标很大可以尝试增大如1280但会显著增加显存消耗和训练时间。batch在GPU显存允许的情况下尽可能设大如16, 32。更大的Batch Size通常能使训练更稳定梯度估计更准确。cls分类损失权重。如果你发现某个少数类别如coating_peeled的AP平均精度一直很低可以尝试轻微增大这个值如从0.5调到0.8让模型更关注分类错误。但调整需谨慎最好配合类别权重class weights使用。数据增强参数hsv_h/s/v,degrees,fliplr等对于医学图像增强幅度不宜过大以免产生不现实的、可能误导模型的图像。fliplr左右翻转对舌像是合理的但如前所述对于side_teeth_marked这类具有左右位置语义的标签增强后需要同步翻转标注框的x坐标YOLOv8的内部逻辑通常会处理但自己写增强管道时需特别注意。mosaicYOLO的经典增强将四张图拼成一张。能有效提升模型对不同尺度目标的检测能力建议开启1.0。运行python train.py训练就开始了。所有日志、模型权重、评估结果都会自动保存在runs/detect/tongue_det_v1/目录下。4.4 训练监控与模型评估YOLOv8在训练过程中会实时输出损失曲线并在TensorBoard如果安装了或本地日志文件中记录。训练完成后最重要的评估指标是mAPmean Average Precision。查看评估结果训练结束后在结果目录如runs/detect/tongue_det_v1/下你会找到weights/best.pt验证集上表现最好的模型权重。results.csv所有epoch的详细指标记录。confusion_matrix.png混淆矩阵直观显示各类别间的误检情况。F1_curve.png,P_curve.png,R_curve.pngF1分数、精确率、召回率随置信度阈值变化的曲线。PR_curve.png精确率-召回率曲线其下面积就是AP。关键指标解读metrics/mAP50(B)在IoU阈值为0.5时的平均精度mAP这是最常用的目标检测指标。对于舌像检测我们主要看这个。metrics/mAP50-95(B)IoU阈值从0.5到0.95步长0.05的平均mAP更严格。对于每个类别还会单独计算metrics/precision(B)和metrics/recall(B)。你需要特别关注少数类别如coating_peeled的精度和召回率如果过低说明模型没有学好这个类别。可视化预测结果使用训练好的模型对验证集图片进行预测并可视化这是最直接的检验方式。from ultralytics import YOLO import cv2 # 加载训练好的最佳模型 model YOLO(runs/detect/tongue_det_v1/weights/best.pt) # 预测单张图片并显示 results model(path_to_your_test_image.jpg, saveTrue, imgsz640, conf0.25) # 结果会自动保存也可以遍历results[0].boxes获取框、置信度、类别信息进行自定义绘制。5. 常见问题、调优策略与高级技巧在实际使用这个数据集训练模型时你几乎一定会遇到下面这些问题。这里我把踩过的坑和解决方案总结出来。5.1 类别不平衡问题及其应对策略这是本数据集最突出的挑战。tongue_body有800个实例而coating_peeled可能只有几十个。模型会倾向于忽略少数类别。解决方案数据层面过采样Oversampling复制包含少数类别的样本。简单粗暴但有效需注意可能带来的过拟合。数据增强侧重对少数类别的图片应用更丰富的数据增强创造更多的“变体”。人工补充标注如果条件允许这是最根本的方法。损失函数层面Focal LossYOLOv8的默认分类损失可能已经包含了Focal Loss的思想通过cls参数调节。Focal Loss通过降低易分类样本的权重让模型更关注难分的、稀有的样本。类别权重Class Weights在损失计算中为不同类别赋予不同的权重。少数类别的权重更大。YOLOv8没有直接提供接口但可以通过修改源码或使用支持类别权重的框架如MMDetection来实现。采样策略在线难例挖掘OHEM在训练过程中自动选择那些分类或定位损失较大的样本其中很可能包含难分的少数类别进行重点学习。部分框架集成此功能。实操建议对于本数据集首先尝试调整cls损失权重轻微上调如从0.5到0.8并结合针对少数类别的数据增强。如果效果不佳再考虑更复杂的重采样或损失函数修改。5.2 小目标检测性能优化tip_red舌尖红或小的coating_peeled苔剥落区域可能只占图像的很小一部分属于小目标。优化方向模型层面使用更大的输入分辨率imgsz1280。分辨率越高小目标在特征图上的信息保留越多。但代价是计算量平方级增长。网络结构YOLOv8的Backbone和Neck部分已经为多尺度检测做了优化。可以尝试使用更大的模型如yolov8m.pt或yolov8l.pt它们有更强大的特征提取能力。Anchor-FreeYOLOv8本身就是Anchor-Free的省去了针对小目标设计特定Anchor的麻烦。数据增强Mosaic增强对小目标检测特别有帮助因为它将小目标“拼接”到了更大的上下文中。确保mosaic1.0。5.3 模型过拟合与泛化能力提升800张图片对于深度学习来说不算多很容易过拟合训练集指标好验证集/测试集指标差。应对措施正则化权重衰减Weight Decay我们已经设置了weight_decay0.0005这是一个标准的L2正则化。DropOut/DropPathYOLOv8模型中可能已集成通常不需要手动设置。数据增强这是防止过拟合最有效的手段。充分利用YOLOv8提供的丰富增强选项并可以尝试更激进的增强如mixup,copy_paste但要注意医学图像的合理性边界。早停Early Stopping监控验证集mAP当其在连续多个epoch如10-20个不再提升时停止训练。YOLOv8在训练时会自动保存best.pt这本身就包含了早停的思想。减少模型复杂度如果过拟合严重换用更小的模型如yolov8n.pt或yolov8s.pt。5.4 从检测到分割的扩展思路这个数据集是目标检测格式矩形框。但舌诊有时需要更精确的舌体分割得到像素级的舌头轮廓。如何利用这个数据集弱监督分割利用检测框作为初始提示Prompt结合像Segment Anything Model (SAM)这样的强大分割模型自动生成精细的分割掩码Mask。你可以将检测框输入SAM获得舌体的分割结果从而构建一个“检测框分割掩码”的扩展数据集。训练实例分割模型YOLOv8本身就支持实例分割YOLOv8-Seg。你可以用上述方法生成的掩码将数据集转换为COCO格式包含多边形标注然后直接用YOLOv8-Seg进行训练得到一个能同时输出检测框和分割掩码的模型。5.5 部署与落地考量训练出一个好模型只是第一步。要真正用起来还需考虑模型轻量化如果部署在移动端或边缘设备如嵌入式中医诊断仪需要考虑模型大小和速度。可以使用更小的模型变体yolov8n。对训练好的模型进行量化Quantization将FP32权重转换为INT8大幅减小模型体积并提升推理速度精度损失通常很小。使用模型剪枝Pruning移除冗余权重。推理加速使用ONNX Runtime、TensorRT或OpenVINO等推理引擎对YOLOv8模型进行优化和加速获得远超原生PyTorch的推理速度。构建Pipeline一个完整的舌诊AI Pipeline可能包括图像输入 - 预处理裁剪、归一化- 舌体检测 - 舌体区域裁剪 - 舌苔/舌质分类/分割 - 特征提取 - 报告生成。本数据集解决的正是其中最关键的“舌体检测”第一步。这个“舌头舌像检测数据集”就像一块很好的敲门砖它结构清晰、格式通用、目标明确。通过它你不仅能跑通一个完整的目标检测项目流程更能深入到医学影像AI这个充满挑战和机遇的领域去解决数据不平衡、小目标、模型泛化等实际问题。在实际操作中最大的体会就是“耐心”和“细致”——耐心地分析数据分布细致地调整每一个增强参数和模型超参反复验证模型在真实场景下的表现。模型训练从来不是一蹴而就的而这个数据集给了你一个绝佳的起点让你能快速试错、迭代想法。最后记得在发表任何研究成果时妥善说明数据来源并充分考虑医学AI应用的伦理和合规要求。本文还有配套的精品资源点击获取