批量接口的边界:一次能塞几张、多大
通用OCR的批量能力不是无限口袋。官方约束是单张图片不超过十兆字节、像素边长在三十到五千之间、格式限几种常见位图类型,一次请求体里放多张图、建议单次不超五张,整个请求体不超百兆字节。
这几个数字直接决定客户端攒批逻辑。如果你有上万张单据,不能无脑每请求塞五张,还得看单张大小——扫描件动辄三四兆,五张就快顶到请求体上限;手机拍照若原图六七兆,两张就超单张上限必须先压缩。工程上常把“单张压缩后不超三兆、单次请求三张左右、请求体留足余量”作为攒批经验值,比死磕五张上限更稳。
另一个边界是协议层错误码。数据字段不是列表、列表为空、图片数超五十(部分OCR子类接口硬限)、单张超十兆、格式不对、像素越界,网关或引擎会在请求体校验阶段直接驳回,不会进识别。这些错误和“识别错了”是两回事,重试策略要分开。
客户端攒批:从目录到请求体的预处理
批量识别的第一段工程在客户端。把一堆图片路径变成请求体之前,要做几件小事。
其一是读取二进制做常规编码,不带前缀,字符集统一。其二是大小与尺寸预检,超容的先走压缩,过小截图的先放大,倾斜明显的先做旋转矫正——通用OCR不认手写体,但印刷体轻微倾斜模型能纠,过分倾斜还是前端预处理好。其三是按业务维度分组,同一笔订单的多张附件、同一张发票的正反面,尽量放同一次批量请求里,这样响应回来时按数组顺序就能对齐到业务实体,不用后期再靠文件名猜亲缘关系。
攒批完不是立刻发请求,而是进队列等限速器放行。批量接口省的是单次建连和签名的固定开销,不省QPS额度——通用OCR默认十次每秒,你一次塞三张图,等效消耗一次请求额度但后端要识三张,网关限流按请求数算,所以限速器要按“请求数”而非“图片数”控。
并发与限流:批量不是并发轰炸
有了批量接口,很多人顺势开几十个线程同时发批量请求,结果触发限流错误。正确做法是把“批量攒批”和“并发发送”当成两个独立旋钮:批量攒批解决单次请求效率,并发发送解决总吞吐,两者都受十次每秒的天花板约束。
客户端用令牌桶把请求频率压在阈值内,桶空了就等。多个业务线共用一个应用时,还要在应用内做二级排队,避免彼此踩踏。遇到限流响应时按退避重试,且重试必须重新生成请求标识和时间戳并重算签名——拿上次签名原样重发会被防重放拦下。限流和临时错误才重试,鉴权错、参数错、图片错不重试,直接进死信队列。
响应对齐与坐标聚类:批量回来的东西怎么用
成功响应里,识别结果按传入图片顺序排成数组,每张图对应一个结果块,块内含若干文字行,每行有文本内容、置信度、位置坐标。批量实践的关键不是“拿到了字”,而是“知道每个字在图的哪行哪列,以及这张图对应业务里哪条记录”。
先按数组下标把结果块绑回原图片路径或业务ID,这一步错一位后面全错。再在单图结果块内做坐标聚类:按纵坐标把文字行归行,按横坐标在同行内归列,把“字段名”和“值”还原成左右结构。比如单据上“金额”二字和“一千二百元整”或“1200.00”纵坐标接近、横坐标分列,靠坐标能把它们绑成一对,而不是靠字符串里恰巧出现“金额”二字去正则硬抽——后者在备注栏也写“金额已付”时会抽错。
置信度是聚类之外的第二道滤网。印刷体正常场景置信度很高,但盖章压字、低分辨率、底色花纹会让数字位置信度掉下来。低置信度的文字行先挂起来,不进自动转数值流程。
文本转数字后处理:批量场景下的清洗流水线
批量识别的真正价值是把图里的“一千二百元整”“1,200.00”“¥1200”“一二零零”变成程序里的数值。这张字符串到数值的桥,在批量场景下要写成可复用的纯函数流水线。
清洗阶段去货币符号、去千分位逗号、去首尾空白、全角转半角、按上下文把字母O和零、字母l和一做纠错。判定阶段先试匹配带小数点的数值片段,若原文含中文大写金额词,走大写到小写的专用映射,不要拿正则硬吞。校验阶段按业务字段类型约束:金额允许两位小数,数量限整数,日期走日期解析;匹配不上约束的,挂原文字段交人工,不强制入库。绑定阶段用前面坐标聚类得到的“字段名—值”对,把值串绑到“订单金额”这类语义上,避免把运费数字写进商品单价。
批量场景下还要加一道跨图一致性校验。同一笔订单的正反面、同一客户的多张回单,识别出的关键金额应该互洽,差异超过阈值的自动标红。这一步不是OCR能帮你的,是业务层该补的护栏。
失败重试与人工兜底:批量不等于全自动
批量流水线跑起来后,失败分三层。请求层失败(鉴权、限流、网络)按前面说的分类重试。图片层失败(解码错、格式错、超容)不重试,原图进人工文件夹。识别层“失败”指结果块为空或置信度全低,这种不重试同一张图太多次,超过两次就降级到人工通道——通用OCR对模糊图重试五次也是同一结果,纯浪费配额。
人工兜底通道要保留原图、请求标识、部分识别原文、坐标信息,让审核员能看到机器为什么犹豫。批量系统里人工不是临时补丁,而是和自动流程平级的常驻分支,占比随图片质量波动,设计初期就要留好表结构和审核界面,别等上线后补。
监控上把请求错误率、空结果率、低置信率、转数值失败率、人工介入率拆开看。请求错误率是网关和健康问题,空结果率是图片质量问题,转数值失败率是后处理规则问题,人工介入率是综合健康度。四条曲线混着看会误诊。
结语
天翼云通用OCR的图片批量识别实践,不是把单图接口套个循环,而是把图片预检、攒批、限速、响应对齐、坐标聚类、字符串清洗、数值校验、失败分流这八件事焊成一条流水线。批量接口省的是固定开销,不省QPS也不省后处理脑力;坐标信息是把印刷体数字从“图里一串字”变成“业务里一个值”的锚,没有它文本转数字只能靠正则盲猜,批量越大错得越离谱。开发工程师把这条流水线钉牢,上千张单据进门、数值出门的过程才不是黑盒,而是每一张图都知道自己被怎么识、怎么转、怎么疑、怎么兜底。官网那句“返回文字内容及坐标信息”,分量全在坐标二字上。