尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenMed 提取 DICOM 元数据与 DICOM-SR 报告文本并脱敏 PHI 的完整指南

OpenMed 提取 DICOM 元数据与 DICOM-SR 报告文本并脱敏 PHI 的完整指南 OpenMed 提取 DICOM 元数据与 DICOM-SR 报告文本并脱敏 PHI 的完整指南【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmedDICOMDigital Imaging and Communications in Medicine医学数字影像与通信文件承载的远不止像素其**文件头header**以标签化属性记录患者、检查Study、序列Series与设备信息而DICOM-SR结构化报告则在内容树中保存放射/心脏检查的实际报告文本。本文以 OpenMed 技能文档 skills/extracting-dicom-metadata/SKILL.md 为核心骨架结合仓库源码openmed/multimodal/dicom.py、openmed/multimodal/dicom_sr.py、openmed/core/pii.py 等系统讲解如何用pydicom读取 DICOM 头与 SR 内容树、枚举携带 PHI 的头标签再交由 OpenMed 的openmed.deidentify/openmed.analyze_text完成文本级脱敏与临床 NER 分析并给出仓库内置的 PS3.15 头脱敏实现与逐帧像素 PHI 检测方案。读完本文你将掌握一套提取 → 标记 → 脱敏 → 分析的完整影像数据隐私管线。何时使用这套 DICOM 处理流程从 PACS/VNA 或科研影像库摄取 DICOM希望用临床 NLP 挖掘 SR 报告文本在共享/导出影像前必须枚举所有携带 PHI 的头标签持有 DICOM-SR 对象如放射测量 影像所见 impression其内容树中包含口述报告文本。该技能与 OpenMed 的配合定位是摄取前置metadata 中pairs: before即先于openmed.deidentify/openmed.analyze_text执行DICOM 头读取用pydicom外部、MIT 许可而抽取文本的脱敏则由 OpenMed 完成。DICOM 文件头一分钟速览DICOM 中每个属性都有一个tag(gggg,eeee)组号, 元素号、一个VRValue Representation值表示类型如PN人名、DA日期、UIUID以及一个值。PHI 集中在这些众所周知的标签中Tag名称VR说明(0010,0010)PatientNamePN直接标识符患者姓名(0010,0020)PatientIDLOMRN病历号(0010,0030)PatientBirthDateDA出生日期(0010,1040)PatientAddressLO住址(0008,0090)ReferringPhysicianNamePN转诊/申请医师(0008,0020/0030)StudyDate / StudyTimeDA/TM检查日期/时间(0008,0050)AccessionNumberSH申请单号(0008,103E)SeriesDescriptionLO自由文本——可能泄露 PHI(0020,4000)ImageCommentsLT自由文本——可能泄露 PHI(0040,A730)ContentSequenceSQDICOM-SR 报告内容树仓库证据这些正是 OpenMed 内置 DICOM 头脱敏所处理的标签集合。在 openmed/multimodal/dicom.py 中_REMOVE_TAGSPS3.15 action X删除属性覆盖了机构地址、执行医师、操作者、其他患者 ID、军事身份、过敏史、患者备注等约 40 个标签_ZERO_TAGSaction Z / Z/D清空值但保留标签覆盖 AccessionNumber、InstitutionName、ReferringPhysicianName、PatientName、PatientID、PatientBirthDate、PatientBirthTime、PatientSex、PatientAge 等 10 个标签。测试 tests/unit/multimodal/test_dicom_headers.py 验证了这些标签脱敏后的值为空。快速开始读取、抽取、标记、交接下面的脚本展示了完整链路读头 → 递归抽取 SR 报告文本 → 标记 PHI 标签 → 交给 OpenMed 脱敏与分析import pydicom import openmed ds pydicom.dcmread(study.dcm) # 1) 枚举携带 PHI 的头标签仅报告 tag 存在性绝不将值写入日志。 PHI_TAGS [ (0x0010, 0x0010), (0x0010, 0x0020), (0x0010, 0x0030), (0x0010, 0x1040), (0x0008, 0x0090), (0x0008, 0x0050), (0x0008, 0x0020), (0x0008, 0x0030), ] present_phi [hex_pair for hex_pair in PHI_TAGS if hex_pair in ds] # 2) 从 DICOM-SR 内容树递归抽取报告文本。 def sr_text(dataset): chunks [] for item in dataset.get(ContentSequence, []): vt item.get(ValueType) if vt TEXT and TextValue in item: chunks.append(item.TextValue) if ContentSequence in item: # 嵌套 CONTAINER chunks.append(sr_text(item)) return \n.join(c for c in chunks if c) report sr_text(ds) # 部分模态会把叙述性文本藏在自由文本头标签中 for tag in (ImageComments, SeriesDescription, StudyDescription): if tag in ds and isinstance(ds.get(tag), str): report \n ds.get(tag) # 3) 先脱敏叙述文本再做 NER 分析。 if report.strip(): deid openmed.deidentify(report, methodreplace, policyhipaa_safe_harbor) result openmed.analyze_text(deid.text, output_formatdict)pydicom既支持按关键字读取标签ds.PatientName也支持按(group, element)读取。DICOM-SR 的文本位于递归的ContentSequence内容树中。完整工作流5 步读取数据集用pydicom.dcmread读取。仅做元数据/头部工作时使用stop_before_pixelsTrue——更快且不会把像素载入内存。遍历 SR 内容树ContentSequence可嵌套CONTAINER、TEXT、CODE、NUM、PNAME节点按文档顺序拼接TEXT.TextValue以及相关的CODE/NUM测量值以重建报告文本。清点 PHI 标签标记标准标识符标签以及频繁泄露 PHI 的自由文本标签ImageComments、*Description。只报告标签是否存在——绝不把值回显到日志。脱敏 → 分析将报告叙述文本交给 OpenMed 的openmed.deidentify→openmed.analyze_text。导出前清洗文件头使用 DICOM 脱敏配置PS3.15 Annex E / Basic Application Level Confidentiality Profile清洗头。OpenMed 只脱敏叙述文本头清洗是独立的 DICOM 步骤。与仓库内置实现对照deidentify_dicom_headers上述第 5 步在 OpenMed 仓库中已有完整实现——openmed/multimodal/dicom.py 的deidentify_dicom_headers正是按 DICOM PS3.15 Basic Application Level Confidentiality Profile 执行头脱敏。其处理顺序如下递归遍历数据集含嵌套SQ序列私有标签奇数分组 tag一律删除并累计private_tag_removed_count对_REMOVE_TAGS执行删除action X对_ZERO_TAGS执行清空action Z对UI类型且属于重映射集合的 UID 执行确定性重映射action U对DA/DT日期执行一致性平移action CTM与PN清空写入标准标记PatientIdentityRemoved YES、DeidentificationMethod记录 PS3.15 Basic Profile; dates modified; UIDs remapped、LongitudinalTemporalInformationModified MODIFIEDdicom.py处理 File Meta重映射MediaStorageSOPInstanceUID、删除SourceApplicationEntityTitle、写入ImplementationVersionName OPENMED_DEIDdicom.py。关键设计UID 重映射基于uid_salt默认openmed-dicom-uid-v1做 SHA-256 哈希输出形如2.25.整数的 UUID 式 UID保证同一输入 UID 在多次运行间稳定映射、可跨文件重连dicom.py动作清单通过DicomHeaderAction.to_dict()记录 tag、keyword、VR、动作类型、PS3.15 动作与value_sha256哈希刻意不含原始 PHI 与原 UID从而可安全地进入审计报告。测试 test_dicom_headers.py 直接断言json.dumps(report)中不出现Jane、DOE、MRN-12345、OpenMed Clinic与原始 STUDY_UID。一键式redact_document分发如果你希望像素脱敏 头脱敏一步到位仓库注册了.dcm处理器redact_document(path, policy...)会先执行redact_dicom_pixels再对输出文件执行deidentify_dicom_headers最终返回ExtractedDocument其metadata中携带dicom_header_deid与dicom_pixel_redaction两份审计报告openmed/multimodal/dicom.py。测试 tests/unit/multimodal/test_dicom_headers.py 验证了该分发路径。与 OpenMed 的交接约定交给 OpenMedSR 报告文本及自由文本头标签→openmed.deidentify→openmed.analyze_text。头脱敏不属于 OpenMed 的职责范围OpenMed 只处理文本叙述请使用 DICOM 原生脱敏器pydicom PS3.15 配置或 PACS 脱敏节点清洗(0010,xxxx)及烧录在像素中的 PHI。本技能的任务是标记这些标签确保它们不被遗漏。按 UID 而非 PHI 重连携带StudyInstanceUID/SeriesInstanceUID作为重连键它们不是标识符但如果配置要求 UID 重映射应保持一致地重映射。OpenMed 脱敏与分析的参数要点openmed.deidentify定义于 openmed/core/pii.py支持多种脱敏策略mask占位符替换、remove整体删除、replace伪造但逼真的数据需 faker、hash一致性哈希、可用于实体链接、shift_dates日期平移保持时间间隔等默认confidence_threshold0.7以保证安全。openmed.analyze_text定义于 openmed/init.py默认模型为disease_detection_superclinicaloutput_format支持dict/json/html/csv默认aggregation_strategysimple合并子词片段并默认开启句子检测sentence_detectionTrue。对于 SR 报告这类多行叙述 测量值混合文本建议保留句子检测与group_entities选项让测量值中的数字不会被误判为独立实体。安装提示pydicom是可选依赖。使用前请执行pip install openmed[multimodal]pyproject.toml 中multimodalextra 包含pydicom3.0、numpy1.26、OCR 后端等。仓库通过_import_pydicom()惰性导入并抛出MissingDependencyError提示安装命令dicom.py测试 test_dicom_headers.py 覆盖了该错误路径。仓库内置的 DICOM-SR 结构化抽取器除手写递归外仓库还提供了生产级 SR 抽取器extract_dicom_sropenmed/multimodal/dicom_sr.py它递归遍历ContentSequence生成有序的SrContentItem行含 concept_name、value_type、value、unit_code、relationship、template_id、稳定的node_path并线性化为可读叙述默认在读取内容树前先对 SR 头 PHI 做脱敏临时副本确保标识符绝不流入扁平化输出。其返回的ExtractedDocument.text可直接交给openmed.deidentify/openmed.analyze_textspans将每行渲染文本映射回对应节点。注意其DICOM_SR_ADVISORY扁平化输出是对 SR 编码内容树的忠实机械转写不是临床解释不新增或推断发现不得用于自动触发任何临床决策。边界情况与常见坑像素内烧录的 PHI超声和二次采集图像常把姓名/MRN/日期烧录进像素——仅清洗头是不够的必须标记模态US、SC、XC做像素审查/OCR。OpenMed 的多模态/OCR 摄取可读取烧录文本以做涂黑筛查。仓库实现redact_dicom_pixelsdicom.py会从原始头标签值播种一个自定义识别器_header_seed_recognizer将 PatientName、PatientID、出生日期、各检查日期等转成 deny-term 规则见 dicom.py→ 对每帧做 OCR → 用 PII 模型与种子识别器联合检测实体 → 将实体投影为 bbox 涂黑 →涂黑后再次 OCR 验证残差verify_residual/fail_on_residual默认开启。这正对应技能文档OpenMed 的多模态/OCR 摄取可读取烧录文本的说明。私有标签厂商的奇数分组私有标签可能藏匿 PHIPS3.15 要求移除或加入白名单——不要信任未知标签。仓库对私有标签一律删除并计数private_tag_removed_count。日期平移必须一致若对StudyDate做日期平移必须以相同偏移平移所有相关日期以保持时间关系。仓库通过date_shift_days/patient_key/date_shift_secret计算确定性偏移_resolve_date_shift_days见 openmed/core/pii.py传patient_key时用 HMAC 稳定推导不传时若指定date_shift_days则用该固定值否则随机非零偏移DICOM 路径强制要求date_shift_days非零dicom.py。keep_yearTrue时可保留年份不变。测试断言平移后StudyDate与SeriesDate间隔保持 10 天test_dicom_headers.py。SR 值类型并非所有 SR 内容都是叙述——NUM测量值、CODE编码发现、PNAME人名PHI需要不同处理不要把PNAME直接倒进 NLP 文本。仓库的walk_sr_content_tree对NUM渲染数值 unit_codeUCUM 代码对CODE渲染编码含义对PNAME等类型仍记录结构但值留空处理dicom_sr.py。字符集遵守SpecificCharacterSet (0008,0005)非拉丁患者姓名在脱敏前必须正确解码。只读摄取将源 DICOM 视为不可变写脱敏副本绝不覆盖原始文件。仓库的deidentify_dicom_headers在未指定output_path时会在原地重写——生产环境务必显式传入输出路径。标准与参考DICOM 标准PS3.xPart 6 数据字典标签PS3.15 Annex E —— Attribute Confidentiality Profiles脱敏配置即仓库实现的 Basic Application Level Confidentiality ProfileDICOM-SRPS3.3 结构化报告PS3.16 模板如 TID 2000Basic Diagnostic Imaging Reportpydicom 文档OpenMed 仓库实测入口openmed/multimodal/dicom.py、openmed/multimodal/dicom_sr.py、openmed/core/pii.py、tests/unit/multimodal/test_dicom_headers.py内容出处本文主体结构继承自技能文档 skills/extracting-dicom-metadata/SKILL.md源码级佐证与扩展来自上述仓库文件。技能库其余文档如 skills/deidentify-a-dataset、skills/extracting-pii-entities可进一步延伸批量脱敏与实体抽取实践。【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表