20 分钟搭好 Label Studio OCR 发票预标注:BIO 格式 NER 数据准备实战
【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio
给 NER 模型备料,绕不开一个前置工序:先让 OCR 从发票里「读」出文本,再让标注人员把这些读出来的词一个个核干净。社区模板 OCR Invoices Pre-NER BIO Format 就是干这件事的 Label Studio OCR 发票预标注工具:OCR 模型画好文本框后,你逐框校对转写文本,导出带坐标、带O标签的 token 列表,直接作为 BIO 格式 NER 数据准备的原料。整套标注配置只有三个控件,本文带你一次搭通。
这个模板在数据管线里的位置
三段分工,各管一段:
- OCR 识别(上游模型):对发票图片做文本检测与识别,产出一组带坐标的 token——token 就是发票上的一个词条或字段,比如发票号、金额、日期。
- Pre-NER 人工校对(本模板):每个 token 在图上呈现为一个矩形框,标注者逐框核对、修正 OCR 转写内容;这一阶段所有 token 一律记为
O(Outside,实体之外)。 - NER 实体标注(下游):把校对好的 token 按阅读顺序排成序列,再按 BIO 约定打
B-(实体开始)/I-(实体内部)标签,进入模型训练。
一句话:本模板不产出实体标签,它只负责把 token 边界和转写文本理干净。
一份 Label Studio 标注配置看懂三个控件 🏷️
<View> <Image name="image" value="$image" zoomControl="true"/> <RectangleLabels name="label" toName="image" choice="single"> <Label value="O" background="#FFA500"/> </RectangleLabels> <TextArea name="transcription" toName="image" perRegion="true" editable="true" rows="1" required="true" placeholder="Type or correct OCR text…"/> </View><Image>负责展示票据,value="$image"从任务数据里取图片 URL。它有个容易被忽视的设定:导出结果的坐标不是像素值,而是相对原图宽高的 0–100 百分比,混用不同分辨率的发票图片也不用先归一化。
<RectangleLabels>通过toName="image"绑到图片上,管「框」这一半:choice="single"意味着每个框只能挂一个标签,模板里就定义了一个橙色O标签,含义是「所有 token 默认都在实体之外」。
<TextArea>管「文」这一半。它同样绑到image,但关键在于perRegion="true":输入框不再是一张图一个,而是每个矩形各一个。发票号框出来的瞬间,关联输入框里就带着那段 OCR 文本,你只管改字。editable="true"保证改得动,rows="1"让单行输入框支持直接按 Enter 提交,省掉点击动作。
缺了就不好使的四个参数 ⚙️
perRegion是全篇配置里最不能省的一个。一旦关掉,TextArea 就和矩形脱钩,变成「整图填一段文本」,逐框校对的工作流当场失效。
choice="single"决定了每个框只有一个标签位。这迫使标注者当场做出判断,导出结果干净;反过来,如果你希望「先框选、后分类」,把它改成multiple就能在后续流程里补分类。
required="true"把漏填堵死:某个 token 没写转写文本,整个任务提交不了。对 OCR 转写校对来说,缺一个字段比错一个字段更危险——token 序列不完整会直接污染下游 NER 语料。
zoomControl="true"是体验项:发票字号普遍偏小,开大缩放控件,标注者看清细字才校得准。关掉它,等于让人在缩略图上猜字。
从导入发票图到导出结果 ✅
- 新建项目,进入 Labeling Setup 选 Custom template,粘贴上面整段 XML 保存。
- 导入任务:每条任务的
data只需一个image键,值是图片地址;JSON/CSV 上传与 S3、GCS 等存储后端的用法见 docs/source/guide/tasks.md。 - 框选校对:在图上框住一个 token,关联输入框自动带出 OCR 文本,改好按 Enter 提交,接着框下一个。
- 全部提交后从 Export 导出标注结果,得到每个区域的坐标、标签与转写文本。
导出的数据长什么样
每个矩形产出两条id相同的记录,成对出现在result数组里:
{ "result": [ { "id": "r1", "type": "rectanglelabels", "from_name": "label", "value": { "x": 12.4, "y": 8.2, "width": 18.6, "height": 3.1, "rectanglelabels": ["O"] } }, { "id": "r1", "type": "textarea", "from_name": "transcription", "value": { "text": ["TOTAL 66.54"] } } ] }按区域 id 聚合:rectanglelabels那条给出 0–100 百分比坐标与标签,textarea那条给出校对后的文本。拼起来就是「坐标 + 文本 + O」的 token 列表;把它按阅读顺序排好,即可送入下一阶段的 BIO 打标——仓库里的 ner-tagging-invoices-bio-format 模板正是接这一棒,在词粒度上打 B/I 标签。
从「全是 O」到字段级标签
如果不想等到下一阶段才分类,直接在RectangleLabels里加标签即可:
<RectangleLabels name="label" toName="image" choice="single"> <Label value="O" background="#FFA500"/> <Label value="B-Vendor" background="#4CAF50"/> <Label value="B-InvoiceNo" background="#2196F3"/> <Label value="B-Amount" background="#F44336"/> <Label value="B-Date" background="#9C27B0"/> </RectangleLabels>取舍很清楚:一步到位省掉中间转换环节,但校对与分类压进同一步操作,纯校对变慢,且要求标签体系一开始就稳定;保持只有O则把字段分类留给 NER 阶段,每步都能独立质检,代价是管线多走一遍。标签集不确定的团队,建议先按单标签跑通再扩展。
模板源码在 label_studio/annotation_templates/community-contributions/ocr-invoices-pre-ner-bio-format/config.yml;控件参数与结果字段的完整定义见 docs/source/tags/rectanglelabels.md 和 docs/source/tags/textarea.md。把 Image、RectangleLabels、TextArea 三件套接上,「OCR 校对 → BIO 语料」这条管线就是你的了。
【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考