ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

如何用 Transformers-Tutorials 里的 LayoutLMv3 自动抽取病历关键字段:手把手完整指南

如何用 Transformers-Tutorials 里的 LayoutLMv3 自动抽取病历关键字段:手把手完整指南 如何用 Transformers-Tutorials 里的 LayoutLMv3 自动抽取病历关键字段手把手完整指南【免费下载链接】Transformers-TutorialsThis repository contains demos I made with the Transformers library by HuggingFace.项目地址: https://gitcode.com/GitHub_Trending/tr/Transformers-Tutorials医院信息科要把出院小结、处方单、检验报告录入系统时人工逐页抄写一天能处理两三百页已是极限而且剂量、药名一旦抄错一个字符就可能引发用药安全问题。Transformers-Tutorials 项目里的 LayoutLMv3 教程正是为这类文档设计的模型能同时读文档图像里的文字和它所在的位置再配合一份现成的微调 Notebook三步就能搭起一条病历信息抽取流水线。为什么这类任务难做先说三个绕不开的低效点你大概率都遇到过OCR 只认字不懂字段。同一页上出现两个2023-05-01一个是出生日期、一个是入院日期只靠文字内容根本分不出谁是谁必须结合坐标位置才能判断。版面不规整规则写不牢。病历扫描件有倾斜、有印章压字、字体大小不一用固定坐标框切区域的方式一碰到字段错位就全盘失效。纯文本模型看不见位置。同一个词在诊断栏和用药栏里含义完全不同只看 token 序列会猜错模型需要知道每个词在哪。LayoutLMv3 的思路就是把图像、文本、边界框三种信号一起喂进 Transformer让位置信息直接参与理解。在项目的哪里做打开仓库根目录下的 LayoutLMv3/里面就两个文件主教程 Fine_tune_LayoutLMv3_on_FUNSD_(HuggingFace_Trainer).ipynb.ipynb)完整的数据准备 → 微调 → 推理流程基于 HuggingFace Trainer 实现README.md讲了一个很关键的性能细节segment 位置编码后面调优部分会用到。这个示例做的是 FUNSD 数据集一批带标注的表单文档上的命名实体识别——把每个词标成字段头地址其他之类的类别。这跟病历场景几乎同构病历本质上也是带固定字段的表单所以这套流程不用改架构只需把 FUNSD 换成你的病历数据、把标签集换成患者姓名/诊断/用药即可。️ 三步跑起来第一步把原始数据喂给模型先明确数据格式要求。每条样本需要四样东西imagePIL 图像、tokensOCR 切出的词列表、bboxes每个词的坐标[x1, y1, x2, y2]归一化到 0–1000、ner_tags每个词的标签编号。OCR 这一步可以交给 Tesseract 这类引擎它能给出带坐标的词级结果。拿到这四样后加载处理器注意apply_ocrFalse表示 OCR 结果由你外部提供模型内部不再跑 OCRfrom transformers import AutoProcessor processor AutoProcessor.from_pretrained(microsoft/layoutlmv3-base, apply_ocrFalse)然后写一个批量处理函数把原始样本变成张量。这一步 processor 会自动完成两件事把图像缩放归一化成 RGB 通道的pixel_values224×224把词和坐标转成 token 级的input_ids、bbox和labelsdef prepare_examples(examples): encoding processor(examples[image], examples[tokens], boxesexamples[bboxes], word_labelsexamples[ner_tags], truncationTrue, paddingmax_length) return encoding注意一个容易踩的坑LayoutLMv3 的图像通道要求 RGB 格式而上一代 LayoutLMv2 用的是 BGR直接从旧代码迁移时颜色通道不对会白白损失精度。第二步微调参数怎么设在预训练底座上挂一个随机初始化的 token 分类头加载方式如下from transformers import LayoutLMv3ForTokenClassification model LayoutLMv3ForTokenClassification.from_pretrained( microsoft/layoutlmv3-base, id2labelid2label, label2idlabel2id)核心超参照抄教程即可每个参数的取值理由整理在这里参数取值为什么这么设learning_rate1e-5底座是预训练权重小学习率微调不易破坏已有知识max_steps1000FUNSD 样本少按步数控制比按 epoch 好掌握per_device_train_batch_size2base 模型 224×224 图像较吃显存显存富裕可上调evaluation_strategy / eval_stepssteps / 100每 100 步看一次 F1及时发现问题load_best_model_at_end / metric_for_best_modelTrue / f1训练结束自动回退到验证 F1 最高的 checkpoint组装 Trainer 并启动训练指标函数用seqeval算实体级 F1from transformers import TrainingArguments, Trainer training_args TrainingArguments(output_dirtest, max_steps1000, per_device_train_batch_size2, learning_rate1e-5, evaluation_strategysteps, eval_steps100, load_best_model_at_endTrue, metric_for_best_modelf1) trainer Trainer(modelmodel, argstraining_args, train_datasettrain_dataset, eval_dataseteval_dataset, tokenizerprocessor, compute_metricscompute_metrics) trainer.train()按教程跑完验证集 F1 可以稳定到 90% 上下对表单类 NER 是个相当可用的水平。第三步推理拿到结构化结果训练完的 checkpoint 加载方式跟加载底座完全一样推理时把新病历的图像、词和坐标交给 processor再取 logits 的 argmax 就是每个词的预测类别inputs processor(image, words, boxesboxes, return_tensorspt) predictions model(**inputs).logits.argmax(-1).squeeze().tolist() # 把 token 编号映射回实体名非 O 的位置就是抽出的字段 for tid, pred in zip(inputs.input_ids[0].tolist(), predictions): if model.config.id2label[pred] ! O: print(processor.tokenizer.decode([tid]), -, model.config.id2label[pred])一句话解释模型输出形状为(batch, seq_len, num_labels)的 logits逐 token 取最大值编号再用id2label反查成患者姓名诊断这类名称配合该词自带的 bbox 就能把结构化字段连同位置一起拿到。注意真实推理时你手上没有标签教程末尾演示了如何用 tokenizer 返回的offset_mapping把 token 对齐回原始词需要时翻到那一段。 效果调优与常见坑改用 segment 级位置编码。让同一个字段里的词比如一整个地址、一整个日期共享同一个 bbox从而获得相同的 2D 位置嵌入。README 明确指出这是 FUNSD 上 F1 突破 90% 的关键Tesseract 这类 OCR 引擎本身就能识别出 segment。图像增强扩样本。对病历图做旋转、缩放、对比度抖动直接扩大有效训练量降低扫描件质量差异带来的掉点。后处理加规则校验。对日期、ICD 编码、剂量单位做正则校验明显不合法的结果直接丢弃或标记人工复核端到端精度会有一截提升。多任务辅助。并行加一个病历类型分类头与实体抽取共享底座能给小样本场景提供额外监督信号。小数据压住学习率。病历标注数据通常有限保持 1e-5 到 5e-5 量级并配合早停比激进的大学习率更不容易把验证集 F1 冲垮。一句话收尾把 FUNSD 换成你的病历数据、把标签集改成临床字段这条从数据到推理的链路就通了——剩下的工作量主要在标注。接下来可以顺着这几个方向走手写病历场景上游接一个手写识别OCR流水线把识别出的词和坐标按本教程格式灌入结果可信度把抽出的诊断、用药字段接入 ICD 编码库做交叉校验明显矛盾的输出转人工落地部署对微调后的 checkpoint 做量化或蒸馏让单页推理成本降到可以支撑批量扫描件的量级。【免费下载链接】Transformers-TutorialsThis repository contains demos I made with the Transformers library by HuggingFace.项目地址: https://gitcode.com/GitHub_Trending/tr/Transformers-Tutorials创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表