Label Studio OCR 发票预标注模板实战教程:从 OCR 框到 BIO NER 训练数据只需 3 步
【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio
手头有一批发票图片,OCR 模型已经能跑出文本框和识别文字,但识别结果有错、框选不够准,没法直接当 NER 训练数据用。Label Studio 的 OCR Invoices Pre-NER BIO Format 模板正好补上这段:把发票上每个 OCR 框变成图片里的矩形,人工逐个校对框内文字,导出后即得到带「坐标 + 文本 + 类别」的 token 序列,可直接进入 BIO 实体标注。照下面的步骤走,半小时能搭起一条「发票图片 → 预标注语料」的完整管线。
先建立心智模型:这条流水线分几步
- OCR 出草稿:OCR 模型对发票图片做文本检测,输出一组带坐标的 text token——发票号、金额、日期各是一个 token。
- 人工校对(本模板干的事):每个 token 在界面里呈现为一个矩形,标注者核对框选区域、修正框内 OCR 转写的文字,同时所有 token 先统一归到
O类。BIO 约定里 O 代表 Outside(实体外),含义是"这个 token 暂时不属于任何实体"。 - 实体标注:把校对后的 token 序列按阅读顺序排好,在其上按 BIO 约定(
B-前缀标实体开头、I-标实体内部、O标实体外)打标签,产出发票字段抽取模型的训练数据。
"Pre-NER" 这个名字说的就是第 2 步的定位:它不直接产出 B-xxx / I-xxx 实体标签,只负责把 token 边界和文字收拾干净。全部 token 从O起步,意味着下一轮 NER 标注面对的是干净起点。仓库里还有一个后接模板 ner-tagging-invoices-bio-format,专门负责在文字序列上打 BIO 标签,两者前后衔接。
最小可用配置:贴进去就能跑
<View> <!-- 待标注的发票图片,取任务数据 $image 字段,可缩放 --> <Image name="image" value="$image" zoomControl="true"/> <!-- 矩形框选:初期只定义 O(实体外)一个类别,后续可随意扩充 --> <RectangleLabels name="label" toName="image" choice="single"> <Label value="O" background="#FFA500"/> </RectangleLabels> <!-- 逐区域转写框:perRegion 让每个矩形各绑定一个输入框 --> <TextArea name="transcription" toName="image" perRegion="true" editable="true" rows="1" required="true" placeholder="Type or correct OCR text…"/> </View>新项目在 Labeling Setup 里选 Custom template,把这段粘进去保存,就可以导数据开工了。思路是先跑通、再扩展。带示例数据注释的完整可运行配置在仓库 config.yml,想核对细节可去比对。
三个控件,各管一件事
按标注者的真实操作顺序讲:先看图片 → 再画框 → 最后改字。
1️⃣ Image:看图
- 它做什么:展示待标注发票,
value="$image"从任务data的image字段取图,支持 HTTP(S) 链接、本地路径、base64。 - 关键参数:
zoomControl="true"打开缩放,发票号、金额这类小字号看得清。 - 为什么这样设:导出时矩形坐标存的是相对原图尺寸的百分比(0–100),不是像素值。不同分辨率的发票混在一起不会出现坐标系混乱;原图像素尺寸由结果里的
original_width/original_height单独记录,需要时随时换算回像素。
2️⃣ RectangleLabels:画框
| 参数 | 默认值 | 本配置取值 | 说明 |
|---|---|---|---|
| name | — | label | 控件名,对应结果的from_name |
| toName | — | image | 绑定的图片控件 |
| choice | single | single | 一个矩形只允许选一个类别 |
| opacity | 0.6 | 未设置 | 矩形填充透明度 |
| strokeWidth | 1 | 未设置 | 边框粗细 |
| canRotate | true | 未设置 | 是否显示旋转控制 |
为什么只有一个O:Pre-NER 阶段只关心"每个框里到底是什么字",实体归类留给下一步。O(橙色 #FFA500 背景)就是 BIO 里的 Outside 标记。想提前归类也不用动结构,直接往<RectangleLabels>里加<Label>即可,见文末改法。
3️⃣ TextArea:改字
| 参数 | 默认值 | 本配置取值 | 说明 |
|---|---|---|---|
| name | — | transcription | 控件名,对应结果的from_name |
| toName | — | image | 绑定的图片控件 |
| perRegion | — | true | 核心参数:每个矩形各生成一个输入框,一一对应 |
| editable | false | true | 已提交的文字还能再编辑 |
| rows | 1 | 1 | 单行输入 |
| required | false | true | 每个框的转写内容必填 |
| placeholder | — | Type or correct OCR text… | 输入提示文案 |
perRegion="true"是这套组合的精髓:标注者点选某个矩形,输入框就自动对应这个区域,切换选中框时内容跟着切换,天然实现"一个框一段文字"。rows="1"还有个提速效果——单行输入框直接按 Enter 就能提交,省掉点 Add(rows 大于 1 时必须点 Add 或按 Shift+Enter)。官方 textarea 文档里还展示了displayMode="region-list"变体:所有输入框集中显示在 Regions 面板里,适合整图批量回看。
从建项目到导出:完整走一遍
- 建项目、贴配置:新建项目,Labeling Setup 选 Custom template,粘贴上面的配置。
- 导入任务数据:每个任务的
data只需要一个键image,值是图片 URL 或 base64。支持 JSON/CSV 上传、API 上传,以及 S3/GCS/Azure Blob/本地目录等存储后端;若你已有 OCR 草稿结果,可以作为预检测结果预填进任务,标注者只需校对。 - 标注操作序列:
- 在发票字段上拖出一个矩形(比如发票号),框自动带上
O标记; - 在自动关联的输入框里核对、修正该 token 的 OCR 转写;
- 按 Enter 提交,移向下一个框;
required="true"保证漏填时提交会被拦住; - 重复以上动作直到整张发票的 token 全部框完校对完。
- 在发票字段上拖出一个矩形(比如发票号),框自动带上
- 导出:项目页用 Export 功能导出标注结果,格式见下一节。
导出的 JSON 怎么读
每个矩形区域对应两条成对出现的记录,靠同一个区域 id 关联:
{ "id": "annotation-id", "result": [ { "id": "region-1", "type": "rectanglelabels", "from_name": "label", "to_name": "image", "original_width": 1920, "original_height": 1280, "image_rotation": 0, "value": { "x": 3.1, "y": 8.2, "width": 20, "height": 16, "rectanglelabels": ["O"], "rotation": 0 } }, { "id": "region-1", "type": "textarea", "from_name": "transcription", "to_name": "image", "value": { "text": ["Invoice No. 1024"] } } ] }rectanglelabels 那条给坐标(x、y是旋转前左上角、width、height均为 0–100 百分比)和类别;textarea 那条给转写文本。处理逻辑很简单:按区域 id 分组聚合,再按阅读顺序排序,就得到「坐标 + 文本 + 标签(O)」的 token 列表——这正是 BIO 序列标注要的输入形态,可以直接接进下一阶段的 NER 模板。
想更进一步:常见改法
- 预标注阶段直接归类:在
<RectangleLabels>里追加实体类别,如<Label value="B-Vendor" background="#4CAF50"/>、<Label value="B-Amount" background="#F44336"/>,导出时部分 token 直接带上实体类型,省掉中间转换。 - 一个框允许多类别:把
choice改成multiple,适合"字段类型 + 是否实体"需要同时标记的场景。 - Regions 面板批量校对:给 TextArea 加
displayMode="region-list",所有区域输入框集中进 Regions 面板,收尾时整图过一遍更方便。 - 防止重复录入:TextArea 加
skipDuplicates="true",重复提交相同文本会弹窗拦截。 - 喂给多模态模型:导出结果带百分比坐标和原图尺寸,可还原出像素位置,配合转写文本训练「文字 + 版面」的文档抽取模型。
这套配置的价值,在于把最费人力的"OCR 结果校对"固化成标准化流水线,且输出天然对齐 BIO 约定,不需要额外的格式转换。下一步可以挑几张发票跑通完整标注,然后把导出的 token 序列直接接进 ner-tagging-invoices-bio-format 模板,体验一遍 Pre-NER → 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
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考