做 OCR 项目的人,可能都经历过这种尴尬:模型在英文、中文公开测试集上刷分很漂亮,一部署到孟加拉语的街道、商店招牌、公交车身上,识别率肉眼可见地崩。很多人第一反应是“模型不够强”,于是换更大的 backbone、加更多训练数据,却忽略了一个更基础的问题——你手上根本没有一套能代表真实世界分布的孟加拉语评测数据,连“崩了多少、崩在哪里”都说不清楚。
BanglaWild 正是为这个缺口提出的一个 in-the-wild 孟加拉语场景文本识别基准,目标受众是传统 OCR 模型和视觉语言模型(VLM)。本文不打算只转述论文,而是把这类基准的评估方法论拆开讲:孟加拉语文字到底难在哪、一个靠谱的评测流程长什么样、指标怎么算、结果怎么读、哪里最容易踩坑。读完你可以把任何 OCR 或 VLM 模型接入这套评估流程,得到可比较、可复现的对比结果。
先给一个明确判断:对于小语种场景文本识别,评测基准和模型本身同等重要。没有统一基准,你无法判断模型的进步是真能力提升,还是恰好拟合了私有数据。如果你正在做多语言 OCR、中文大模型的多语言能力评估,或者想在生产环境接入孟加拉语识别,这篇文章值得读到最后。
1. 场景文本识别与文档 OCR 的本质差别
很多人听到 OCR 三个字母,第一反应是“把扫描件变成文字”,这是文档 OCR。它处理的是白纸黑字、排版规整、字体有限的印刷材料,难点在版面分析、表格结构、分栏顺序。场景文本识别(Scene Text Recognition,STR)完全是另一个世界:输入是手机随手拍的路牌、霓虹灯招牌、公交车票、超市价签,文字可能是弯曲的、倾斜的、被栏杆挡住一半的,背景更是毫无规律。
技术链路上的差异更明显。传统 OCR 通常是“检测 + 识别”两阶段:先找到文字区域,再对裁剪出来的区域做转录。STR 领域延续了这套思路,检测模块输出文本框或多边形,识别模块负责把区域内容变成字符串。而近年火起来的视觉语言模型(VLM),直接把整张图片和文本提示(prompt)一起送进模型,输出端到端的文字转录,甚至在复杂场景中直接做“文本发现 + 转录”。
这两条路线都需要基准来兜底。VLM 路线尤其依赖基准,因为多模态大模型的评测常常只报告英文、中文通用能力,低资源语言的场景文本能力被藏在“幻觉”“多语言能力不足”这类模糊描述后面。没有公开基准,厂商不会主动暴露自己在孟加拉语上的失败案例。
| 维度 | 文档 OCR | 场景文本识别(STR) |
|---|---|---|
| 输入 | 扫描件、截图 | 自然场景照片、视频帧 |
| 背景 | 单一、低噪声 | 复杂背景、反光、霓虹灯 |
| 字体 | 有限印刷字体 | 艺术字、手写体、异形字 |
| 文本形态 | 水平排列 | 弯曲、倾斜、透视畸变 |
| 主要难点 | 版面、分栏 | 检测定位、形近字、低分辨率 |
| 典型基准 | 印刷文档语料 | ICDAR 系列、Total-Text、BanglaWild |
2. 孟加拉语文字为什么难倒大多数 OCR 模型
孟加拉语(Bangla)使用孟加拉文,属于婆罗米系文字中的元音附标文字(abugida)。这意味着它和拉丁字母的拼写逻辑完全不同:每个辅音字母自带一个固有元音,元音的变化不是直接写一个独立字母,而是通过附加符号(在孟加拉语中称为 matra,即元音符号)加在辅音字符的上方、下方、左侧或右侧。
举一个最直观的例子。基本辅音“ক”读作 ka,加上元音符号“া”变成“কা”读作 kaa;加上符号“ি”变成“কি”,但这个“ি”在视觉上跑到辅音的左边去了。模型如果只按从左到右的顺序扫描字符串,很容易把这类“字形位置和字符顺序不一致”的文本认错。
更让 OCR 模型头疼的是连字(conjunct)。当两个辅音之间没有元音时,孟加拉文会通过一个 hasanta(্)符号把它们组合成一个新的连字字形。比如 ক(ka)、্、ষ(ṣa)组合后变成“ক্ষ”,视觉上是一个全新的、无法从单字符拼出来的复合字形。这意味着字符集合不是模型训练时看到的几十个类,而是包含大量连字的几百种形状组合。
叠加场景因素后,问题会进一步放大。街拍图片里的孟加拉语文字可能有透视畸变、运动模糊、夜间反光、部分遮挡,再加上艺术字体的自由变形,字符级别的形近混淆几乎无法避免。低分辨率下,一些形状接近的字符更容易相互污染。和英文相比,孟加拉语还没有大小写这个“免费易用”的辅助信息,模型少了一个天然的分辨线索。
工程上还有一个隐藏坑:Unicode 规范化。同一个孟加拉语字符串,在编码层面可能存在多种等价表示,有的用预组合字符,有的用基字符加组合标记拆开写。如果标注文件用的是 NFC,模型输出的是拆分序列,肉眼看着一模一样,字符串比较却直接判错。文档 OCR 的英文评估基本不会有这种“看起来对、程序觉得错”的地狱级后处理问题。
3. BanglaWild 基准:补上什么缺口
长期以来,场景文本识别领域有大量公开英文基准:ICDAR 系列、SVT、IIIT5K、Total-Text、COCO-Text 等,这几年也不少论文在中文、日文等方向做扩展。但对孟加拉语这种拥有上亿母语使用者的语言,一个被社区广泛接受、公开可比的 in-the-wild 场景文本基准一直存在缺口。很多孟加拉语 OCR 研究只能各自收集私有数据,论文里报告的数字彼此之间完全不可比。
从论文标题 Tri 能读出两个关键信息:第一,它强调“In-the-Wild”,意味着数据来源是真实拍摄的自然场景,而不是实验室里渲染的合成文本;第二,它同时面向“OCR 和 Vision-Language Models”,说明这个基准不只是给传统检测识别链路用的,还希望成为多模态大模型能力评测的一部分。
一个完整的 in-the-wild 基准通常包含几个部分:真实场景图片、文字转录标注(通常还有文本位置信息)、固定的训练/测试划分、以及标准评估协议。具体到 BanglaWild,它的图片规模、采集范围、标注规范、是否提供词表约束,都需要以论文正文和官方仓库发布的信息为准。本文不展开没有公开的细节,而是把使用这类基准的方法论讲透,这样无论数据何时开放,你拿到手就能跑。
公共基准的价值在于三件事:可比较性、可归因性、可追踪性。可比较性,是让不同论文、不同模型在同一个测试集上报数,数字才有意义;可归因性,是统一的错误样本能帮你判断模型到底败在“孟加拉语脚本特性”(matra、连字)还是“场景因素”(模糊、遮挡);可追踪性,是让你在大版本迭代后有客观指标,而不是靠感觉说“好像变强了”。
对于 VLM 评测,这个基准还有额外一层价值。很多多模态模型在英文场景文本上表现惊人,但在孟加拉语上会暴露两个深层问题:一是视觉编码器对孟加拉语字形特征的抽取能力不足,二是 LLM 的 tokenizer 对孟加拉语字符覆盖不够,生成阶段就会出现音译、残缺甚至大量幻觉。这类短板没有基准就完全暴露不出来。
4. 评估环境准备与数据格式约定
跑评估之前,先约定环境。指标计算不需要 GPU,普通的 Python 3.9+ 环境即可;推理环节如果跑 VLM 或大模型,才需要 GPU。建议新建一个干净的虚拟环境,避免依赖污染全局 Python。
mkdir -p banglawild-eval/{data,outputs,scripts} cd banglawild-eval python -m venv venv source venv/bin/activate # Windows 下为 venv\Scripts\activate pip install editdistance jsonlines tqdm评估工作的核心原则是把“模型输出”和“指标计算”解耦。不管你是用 PaddleOCR、Tesseract 还是某个 VLM 做识别,最终都统一写成一个 JSONL 预测文件,然后由一个独立的评估脚本读入指标计算。这样换模型、换参数、做对比时,指标计算部分完全不用改。
标注文件和预测文件约定为按行读取的 JSON,每行一个样本:
{"image": "data/banglawild/test/0001.jpg", "text": "কলকাতা", "category": "street_sign"} {"image": "data/banglawild/test/0002.jpg", "text": "রেস্তোরাঁ", "category": "signboard"} {"image": "data/banglawild/test/0003.jpg", "text": "বাংলা", "category": "poster"}预测文件格式更简单,只需要图片路径和模型输出文本:
{"image": "data/banglawild/test/0001.jpg", "prediction": "কলকাতা"} {"image": "data/banglawild/test/0002.jpg", "prediction": "রেস্তোরাঁ"} {"image": "data/banglawild/test/0003.jpg", "prediction": "বাংল"}目录结构建议如下:
banglawild-eval/ ├── data/ │ ├── banglawild_test.jsonl │ └── images/ │ ├── 0001.jpg │ ├── 0002.jpg │ └── ... ├── outputs/ │ ├── model_a.jsonl │ └── model_b.jsonl ├── scripts/ │ ├── metrics.py │ └── evaluate_predictions.py └── venv/5. 完整评估流程与代码实现
整个评估分三步:第一步,准备符合格式的预测文件;第二步,用评估脚本计算指标;第三步,做错误分析和模型对比。这里给出可直接运行的代码。
先写指标计算模块。场景文本识别最常用的三个指标是 Word Accuracy(整词准确率)、CER(字符错误率)和 NED(归一化编辑距离)。
# 文件路径:scripts/metrics.py import editdistance def word_accuracy(preds, gts): """整词准确率:预测与标注完全一致的比例""" correct