用百度OCR做证件识别

一般用ocr的场景是将证件或者材料的内容转成结构化的文本,比分身份证需要识别,
姓名:xxx,年龄:30,身份证号:1212424,
职业证书需要识别:持证人:timmy,证书号:12235523,发证日期:2025-11-11,证书名称:xx职业证书。

专用证件或票据百度有固定的接口,比如:
身份证,护照,营业执照,银行收据等

针对通用的文本解析,百度提供以下两个接口:
1.结构化识别:返回key value对,比如抓取证书里的,证书名称:xxx,证书编号:1111。
2.文本识别:返回全部的多行文本,比如:
证书名称:xxx
证书编号:1111

针对理想情况,我们只需要用到结构化识别接口,然后根据key的值提取我们想要的信息。
然而实际场景不是所有材料的内容都是key:value形式。
比如一般xxx证书的证书标题是不会在前面加 证书名称 这个几个字,直接写上 xx职业资格证书。
这个时候我们只能去遍历多行文本返回的List<String>对象,然后根据对应的逻辑的解析名称
比如判断证书可以写成 包含证书结尾的文本 这种。

下面代码先用包含特殊文本判断,匹配不到再用特定位置文本继续判断。
···

public String parse(List<Pair<String, String>> maps, List<String> textList) {
    String res = this.getStringEndWithFromMap(maps,  OCrDictConfigUtils.getCertificateNamePattern());
    if (!StringUtils.isBlank(res) && res.length()>3) {
        return res;
    }
    res = this.getTextListContainsAnyPatterns(textList,  OCrDictConfigUtils.getCertificateName());
    if (!StringUtils.isBlank(res)) {
        return res;
    }

    if ( this.getTextListContainsAnyPatterns(textList, Arrays.asList("专职律师"))!=null) {
        return "律师证";
    }
    return getFromTop(textList);
}

private String getFromTop(List<String> textList) {
    return textList.stream().filter(c -> c.endsWith("证书")).findFirst().orElse(null);
}

···

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容