3. 医学影像元数据与标注体系设计
医学影像数据湖的价值,一半来自像素,另一半来自像素之外的元数据。没有元数据,影像只是无法定位、无法筛选、无法追溯的二进制块;有了结构良好的元数据与标注体系,才能支撑按患者、研究、序列、实例的精确检索,支撑结构化报告回写,支撑AI训练集的构建与审计。本节围绕DICOM标签、四层信息模型、结构化报告、标注数据模型与检索字段规划展开,目标是让读者能够设计出一套可落地、可扩展的影像元数据与标注体系。
一、DICOM标签:元数据的最小单元
DICOM标准用“标签(Tag)”描述影像及其上下文。每个标签由组号(Group)和元素号(Element)组成,例如(0010,0010)是患者姓名,(0008,0060)是模态,(0020,000D)是研究实例UID。标签按VR(Value Representation)定义数据类型,如PN(人名)、DA(日期)、UI(唯一标识)、SQ(序列,可嵌套)。理解标签是设计元数据体系的前提。
实际工程中,标签可分为四类用途:身份与层级类(PatientID、StudyInstanceUID、SeriesInstanceUID、SOPInstanceUID),用于建立四层归属;临床描述类(Modality、BodyPartExamined、StudyDescription、SeriesDescription),用于检索与展示;采集参数类(SliceThickness、KVP、RepetitionTime、EchoTime),用于质控与AI特征;私有与扩展类(Private Creator、私有标签),用于厂商或院内扩展。设计时应优先使用标准标签,私有标签必须登记命名空间,避免冲突。
二、患者/研究/序列/实例四层模型
DICOM信息模型是严格的四层树:一个患者(Patient)可有多次研究(Study),一次研究包含多个序列(Series),一个序列包含多个实例(Instance,即一张影像或一个对象)。这四层分别由PatientID、StudyInstanceUID、SeriesInstanceUID、SOPInstanceUID唯一标识。数据湖的目录结构、索引表、检索接口都应围绕这四层设计,而不是把文件平铺存放。
四层模型的关键在于“归属关系不可跨层错挂”。例如,同一SeriesInstanceUID下的所有实例必须共享同一StudyInstanceUID;若入库时发现冲突,应进入隔离区人工核查,而不是强行合并。检索时,患者层用于身份聚合,研究层用于就诊维度,序列层用于检查协议维度,实例层用于精确定位。下面用一张结构图展示四层归属与典型检索字段的对应关系。
三、结构化报告:把结论变成可检索字段
传统影像报告是自由文本,检索只能靠关键词模糊匹配,无法可靠统计“有多少例肺结节直径大于8mm”。结构化报告(Structured Report, SR)用DICOM SR文档把结论编码为“概念—值”对,例如概念“结节最大径”对应数值8.5mm,概念“BI-RADS分类”对应编码值4A。SR的核心是TID模板(Template ID)与编码体系(如SNOMED CT、RadLex、LOINC)。
工程落地时,不必一步到位全量SR。可采用“双轨制”:原始报告文本照常归档,同时抽取关键结论写入结构化字段表。抽取方式包括报告模板下拉选择、后处理NLP抽取、以及医师在结构化界面直接填写。无论哪种方式,都应保留“字段—原始文本—抽取时间—抽取版本”的溯源链,便于质控与回溯。
四、标注数据模型:从像素到语义
标注数据与元数据不同:元数据描述影像本身,标注描述影像中的目标与判断。一个可扩展的标注模型通常包含以下实体:标注任务(Task,定义标注目的、标签体系、质控规则)、标注对象(Annotation,指向具体SOPInstanceUID与帧号)、几何形状(Shape,如矩形框、多边形、掩膜、关键点)、语义标签(Label,来自受控词表)、标注者与版本(Annotator、Version、时间戳)。
几何坐标必须明确参照系。以二维影像为例,约定原点在左上角,x向右、y向下,单位为像素;若涉及物理尺寸,需结合PixelSpacing换算为毫米。三维标注则需说明是否使用患者坐标系(LPS:x向左、y向后、z向头)。全文与图示必须保持一致,切换参照系要显式声明。
{
"annotation_id": "ann-2024-000871",
"task_id": "task-lung-nodule-v2",
"sop_instance_uid": "1.2.840.113619.2.55.3.604688.1.1",
"frame": 42,
"shape": { "type": "polygon", "points": [[120,88],[168,84],[175,130],[126,136]] },
"label": { "code": "RID3874", "meaning": "肺结节", "scheme": "RadLex" },
"attributes": { "max_diameter_mm": 8.5, "margin": "光滑", "density": "实性" },
"annotator": "dr_zhang",
"version": 2,
"created_at": "2024-06-11T09:23:17+08:00"
}
五、检索字段规划:让查询真正可用
检索字段规划应遵循“分层索引、冷热分离、可组合过滤”的原则。患者层与研究层字段变化少、查询频繁,适合放入关系库或搜索引擎的热索引;实例层字段量大、更新少,适合放入对象存储的元数据表或列式存储。常用检索组合包括:按患者ID查全部研究、按检查日期+模态+部位查序列、按标注标签+直径阈值查实例。
字段规划时需明确三类字段:精确匹配字段(UID、编码值、日期),用于等值过滤;范围字段(年龄、直径、层厚),用于区间筛选;全文/模糊字段(报告文本、序列描述),用于关键词检索。每类字段的索引方式不同,混用会导致性能下降。建议为每个检索接口定义“必填过滤条件+可选过滤条件+排序字段”,避免无约束全表扫描。
六、落地检查清单
- 四层UID是否全部校验唯一性与格式,冲突是否进入隔离区?
- 患者层、研究层、序列层、实例层是否分别建索引,字段是否按精确/范围/全文分类?
- 结构化报告字段是否保留“字段—原始文本—抽取版本”溯源链?
- 标注模型是否包含任务、对象、形状、标签、标注者、版本六要素?
- 几何坐标参照系是否在文档与代码中统一声明,单位是否明确?
- 私有标签是否登记命名空间,是否有冲突检测?
元数据与标注体系不是一次性设计,而是随检索需求、AI任务、合规要求持续演进的。建议每季度回顾一次字段使用率与查询慢日志,淘汰无人使用的字段,补充高频缺失字段,让数据湖的“目录”始终与临床和科研的真实问题对齐。