一、概要

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

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

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

二、运行工程

​PaddleLite OCR GitHub源码链接​

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

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

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

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

基于PaddleLite的OCR识别身份证号码应用_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识别身份证号码应用_身份证识别_03

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