3

基于PaddleLite的OCR识别身份证号码应用

 1 year ago
source link: https://blog.51cto.com/xuepiaoqiyue/5688308
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

基于PaddleLite的OCR识别身份证号码应用

推荐 原创

现在的核酸检测,需要给身份证拍照,然后识别身份证号码,从而快速识别登记用户信息。同样的应用场景还有很多,本来要靠手动输入身份证号的操作,现在只要拍张照片就可以识别,大大提高工作效率。

PaddleLite是百度旗下飞浆团队开发的人工智能图像处理相关的架构。

OCR是识别图片中的文字字符的一项技术。

二、运行工程

 ​PaddleLite OCR GitHub源码链接​

我们今天主要是做Android的应用,我们把源码下载下来,然后将根目录下的/deploy/android_demo工程导入Android studio(好像要4.1以上版本)。

基于PaddleLite的OCR识别身份证号码应用_ocr

工程目录大致如上,其中assets中的 models.ch_PP-OCRv2中的3个nb文件为机器学习训练导出的模型文件,识别的效果很大程度就取决于这个几个文件。

运行工程到实机上,可以得一下应用。我们可以这个demo应用会把照片上所有的文字块检测+分类+识别,最后可以得出每个文字块的坐标、文字、准确率。

基于PaddleLite的OCR识别身份证号码应用_身份证识别_02

然后我们是要针对身份证号码来识别。因为身份证上的文字还是比较固定的,我们只要设定一定的规则就可以得出身份证号码了。

我这边的处理方式是将所有文字块中文字正则表达式过滤,只剩下数字和字母X。

String REGEX = "[^0-9X]";
String result = Pattern.compile(REGEX).matcher(sfzmhm).replaceAll(" ").trim();

当这个文字块长度大于10的时候我们就可以确定这个文字块就是身份证号码了。

三、应用到实际工程

新建一个工程,新建一个module,把demo中的app搬到新建的module中。此时可以在此工程中直接调用这个module,也可以把这个module打包成aar做为一个模块供其他工程调用了。

Activity中的调用方法如下

实例化Predictor:

protected Predictor predictor = new Predictor();

两个加载执行的方法:

public boolean onLoadModel() {
if (predictor.isLoaded()) {
predictor.releaseModel();
}

String modelPath = "models/ch_PP-OCRv2";
String labelPath = "labels/ppocr_keys_v1.txt";
// String image_path = "images/det_0.jpg";

int CPU_THREAD_NUM_DEFAULT = 4;
String CPU_POWER_MODE_DEFAULT = "LITE_POWER_HIGH";
int DET_LONG_SIZE_DEFAULT = 960;
float SCORE_THRESHOLD_DEFAULT = 0.1f;

return predictor.init(mWXSDKInstance.getContext(), modelPath, labelPath, 1, CPU_THREAD_NUM_DEFAULT,
CPU_POWER_MODE_DEFAULT,
DET_LONG_SIZE_DEFAULT, SCORE_THRESHOLD_DEFAULT);
}


public boolean onRunModel() {
int run_det = 1;
int run_cls = 1;
int run_rec = 1;
return predictor.isLoaded() && predictor.runModel(run_det, run_cls, run_rec);
}

图片处理调用:

JSONObject data = new JSONObject();
try {
if (onLoadModel()) {

Bitmap image = BitmapFactory.decodeFile(path);
predictor.setInputImage(image);

if(onRunModel()){
String sfzmhm = predictor.outputSfzhm();
data.put("sfzmhm", sfzmhm);
}
}
}catch (Exception e){
e.printStackTrace();
data.put("err", e.getMessage());
}

四、一些问题

1、起初我们用demo工程直接识别身份证时候,会有识别率不高的问题,拍摄身份证经常身份证最后几位没有了或者乱码,竖放身份证的时候识别率会更低。

这个就涉及到模型nb文件,我们更换了demo中的三个nb文件后,识别率得到了大大的提升,即使竖放,识别率也90%以上。

为了提供识别率,我们借鉴核酸采用窗口的身份证架子,大大提高图片采集的质量。

基于PaddleLite的OCR识别身份证号码应用_ocr_03

2、为了精确获取身份证号码,采用了一定的算法。先计算每个文字块的长宽比,长宽比最大且含有10位以上数字的那个文字块就是身份证号码了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK