基于PaddleOCR+NLP实现证件文书识别(以身份证为例)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

三方OCR服务价格普遍不便宜,随着公司业务量的增长,这部分成本逐渐变得难以忽视,因此内部评估后决定自行实现。


一、Paddle是什么?

示例:Paddle是国内的一套开源的深度学习框架,发展至目前,已经提供了许多无需复杂参数即可使用的工具库,如 
PaddleOCR,PaddleNLP 等等。

二、使用步骤

1.PaddleOCR环境准备

注意:以下内容将以win系统为例,因为我是在win10系统上做开发的,mac没用过,不懂。

不管你是否已经安装python环境,我仍建议使用Anaconda环境,因为在人工智能领域conda相当好用。

镜像地址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

安装完成后,打开Anaconda控制台:

通常在左下角的:开始 -> Anaconda3 -> Anaconda Prompt启动控制台

输入如下命令,创建一个新的虚拟环境:

conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

以上命令是默认使用了python3.8的,如果你需要其他版本,可以自行修改。

虚拟环境创建完成后,可以通过如下命令激活环境,并确定无误:

# 激活paddle_env环境
conda activate paddle_env
# 查看当前python的位置
where python

然后还需要安装Paddle的核心框架:

如果你的电脑有NVIDIA显卡,可以先查一查你的CUDA版本是多少:

CUDA版本查看指南:轻松掌握你的GPU性能_cuda编译器版本和运行时版本-CSDN博客

然后去Paddle官网选择对应的选项,获取对应的安装命令:

开始使用_飞桨-源于产业实践的开源深度学习平台

以纯CPU为例,执行如下安装命令:

python -m pip install paddlepaddle==2.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

等核心框架安装好了,再安装whl包:

pip install "paddleocr>=2.0.1"

至此,PaddleOCR部署完成。


2.PaddleNLP环境准备

PaddleNLP的部署相对比较简单,只需要通过以下pip直接安装即可:

pip install --upgrade paddlenlp

3.使用示例

先在你的代码中引入paddleocr和paddlenlp两个库:

from paddleocr import PaddleOCR
from paddlenlp import Taskflow

然后获取一个PaddleOCR和一个Taskflow对象:

# 获取ocr对象
ocr = PaddleOCR(use_angle_cls=True, lang="ch", use_gpu=False, use_mp=True)
# 获取taskflow对象
ie = Taskflow('information_extraction', schema=schema)

如果你希望使用自己训练的模型,可以传入参数:

# 指定检测模型,识别模型和方向分类模型的路径
det_model_dir = '.\\det_model'
rec_model_dir = '.\\rec_model'
cls_model_dir = '.\\cls_model'
# 传入参数
PaddleOCR(det_model_dir=det_model_dir, rec_model_dir=rec_model_dir, cls_model_dir=cls_model_dir)

如果没有需要指定的模型,直接不传这几个参就行,官方在源码文件information_extraction.py里的resource_files_urls对象中其实已经指定了默认的模型。

示例代码:

# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
allStr = ""
img_path = './imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
    res = result[idx]
    for line in res:
        print(line)
        str = line[1][0]
        if str != '':
            allStr = allStr + Str

假设传入的是身份证,经过解析后的allStr就会变成类似如下的字符串(标点符号,空格等特殊符号需要你自行处理):

姓名侯小珂性别女民族汉出生1999年x月x日住址xx市xx区xx路1号2栋3号公民身份号码110129xxxxxxxxxxxx中华人民共和国居民身份证签发机关xx市公安局有效期限2018071120280711

接下来你要做的就是把这个字符串交给NLP模型进行信息抽取。当然,你说用正则匹配也行,确实没毛病,例如身份证号码,直接用正则匹配就可以了。但是,假如你需要获取住址这种没有明显特征的,你如何正则匹配呢?

NLP模型就能解决这个问题。

使用如下代码,告诉模型我需要在这段文本中抽取什么信息即可:

data = {}
schema = ["姓名", "民族", "性别", "出生", "住址", "签发机关", "有效期限", "公民身份号码"]
ie = Taskflow('information_extraction', schema=schema)
res = ie(allStr)
for key in schema:
    data[key] = res[0][key][0]['text']
print(data)

结果如下:

	"data": {
		"姓名": "侯小珂",
		"民族": "汉",
		"性别": "女",
		"出生": "1999年x月x日",
		"住址": "xx市xx区xx路1号2栋3号",
		"签发机关": "xx市公安局",
		"有效期限": "2018071120280711",
		"公民身份号码": "110129xxxxxxxxxxxx"
	}

感谢各位阅读!


觉得这篇文章有用的朋友可以给我点个赞,收藏一下,尤其是修炼搬山诀的道友,你搬就搬吧好歹给哥们点点赞。

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顺德陈奕迅_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值