学习身份证图像识别

简介: 前言:实名认证是互联网的大趋势.越来越多的地方需要用户实名认证了.我目前所在的公司网站也有这个需求.可是公司之前一直使用的是人工后台审核.这样做有几个不好的地方绝大多数用户还是会上传真实有效的身份信息,所以审查结果往往都是通过用户在上传后认证需要等待,可是等待的过程往往就是失去用户的过程.

前言:

实名认证是互联网的大趋势.越来越多的地方需要用户实名认证了.我目前所在的公司网站也有这个需求.可是公司之前一直使用的是人工后台审核.这样做有几个不好的地方

  1. 绝大多数用户还是会上传真实有效的身份信息,所以审查结果往往都是通过
  2. 用户在上传后认证需要等待,可是等待的过程往往就是失去用户的过程.
  3. 加大了我们网站工作人员的工作量,不利于后期发展
    通过分析这些问题.我决定使用百度的人工智能提供的接口,来完成智能实名认证.

目录:

  1. 申请应用
  2. 获取accessToken
  3. 调用识别接口,获取数据
  4. 对比数据
  5. 业务逻辑介绍

1. 申请应用

image.png

在百度云的控制台中找到,人工智能部分,选择你需要的服务

image.png

然后创建你需要的应用,创建好了就可以获得app_key 和app_secret(好像不叫这个名字,不过是什么东西.大家都懂)

看到这两个熟悉的东西.大家一定会想到第三方登录是吧.没错这里的应用也是基于Oauth2.0协议.比较关注我的朋友应该看过,我之前写的关于第三方登录的博客.这里就过多介绍原理了.直接讲用法

2. 获取access_token

拿到app_key和app_secret这两个参数之后,我们就可以来获取access_token了.
和其他Oauth2.0协议的应用相同,都是用curl的方式去请求这个token

class BaiduAiController extends Controller
{
    //公共的成员变量
    public $accessToken;

    /**
     * 在类成员变量中没有accessToken,或者accessToken过期则调这个方法
     */
    public function getAccessToken()
    {
            //获取配置参数
            $config=C('BAIDUAI');
            //百度ai的token请求地址
            $url='https://aip.baidubce.com/oauth/2.0/token';
            $post_data = [];
            //这个是参数是固定写法
            $post_data['grant_type']  = 'client_credentials';
            //依次填入我们在配置中设置好的参数
            $post_data['client_id']   = $config['app_id'];
            $post_data['client_secret'] = $config['app_secret'];
            //调用公共的curl方法,第一个参数是url,第二个参数是请求类型,第三个参数是携带的数据
            $result=http($url,'POST',$post_data);
            //状态无误
            if ($result[0]==200) {
                //将返回的json数据转换为数组,并取出token存入类成员变量中
                $this->accessToken=json_decode($result[1],true)['access_token'];
                //返回token
                return $this->accessToken;
            }
    }
}

我将获取token单独写了一个控制器,其实也可以不用写,看个人习惯.通过这个方法,我们就能获取到token,用于我们调用其它接口

3.调用识别身份证照片的接口

百度身份证识别可以识别身份证的正面,背面上面的文字.也就是说可以获取到用户的姓名,性别,生日,住址,身份证号,发证机关,有效期.

调用接口,需要传入的数据有

  1. base64加密后的二进制的图片流
//没懂没关系,我们看代码
//获取图片的2进制流$imgUrl是图片的url
        $img = file_get_contents($imgUrl);
        //将字符串进行base64加密
        $img = base64_encode($img);
  1. 传入图片的正面或则背面的信息

其实就是你要检测正面就传入正面参数,背面就传入背面参数

当前还有更多更高级的应用,需要传入其他数据.由于本次应用没有用到,就不展开了说了

image.png

下面看完整的代码

/**
     * 调用身份证识别接口,返回识别后的数据
     * @param $imgUrl
     * @return array
     */
    private function checkID($imgUrl)
    {
        //实例化baiduai控制器对象
        $baiduObj = new BaiduAiController();
        //获取到accesstoken
        $accessToken = isset($baiduObj->accessToken) ? $baiduObj->accessToken : $baiduObj->getAccessToken();
        $url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=' . $accessToken;
        //获取图片的2进制流$imgUrl是图片的url
        $img = file_get_contents($imgUrl);
        //将字符串进行base64加密
        $img = base64_encode($img);
        $bodys = array(
            //这个代表的是,识别身份证的正面
            'id_card_side' => 'front',
            "image" => $img
        );
        //使用curl方法 获取接口返回的数据
        $res = http($url, 'POST', $bodys);
        //访问状态没问题
        if ($res[0] == 200) {
            //access过期
            if (isset($res[1]['error_code'])==11) {
                //重新赋值,递归,返回数据
                $baiduObj->accessToken=null;
                return $this->checkID($imgUrl);
            }
            //将返回的数据,转换为数组
            $res = json_decode($res[1], true);
            //提取数组中的身份证号码
            $ID = $res['words_result']['公民身份号码']['words'];
            //提取数组中的姓名
            $realname = $res['words_result']['姓名']['words'];
            $result = [];
            //在两个数据都识别出的情况下,存入返回数组
            if (isset($ID) && isset($realname)) {
                $result['status'] = 1;
                $result['ID'] = $ID;
                $result['realname'] = $realname;
            } else {
                //没有获取到完整数据,返回状态码
                $result['status'] = 0;
            }
            //返回数据
            return $result;
        }
    }

下面是返回数据的示例,每个参数的定义,欢迎查看官方手册

{
    "log_id": 2648325511,//唯一id,方便定位错误
    "direction": 0,
    "image_status": "normal",
    "idcard_type": "normal",
    "edit_tool": "Adobe Photoshop CS3 Windows",
    "words_result": {
        "住址": {
            "location": {
                "left": 267,
                "top": 453,
                "width": 459,
                "height": 99
            },
            "words": "南京市江宁区弘景大道3889号"
        },
        "公民身份号码": {
            "location": {
                "left": 443,
                "top": 681,
                "width": 589,
                "height": 45
            },
            "words": "330881199904173914"
        },
        "出生": {
            "location": {
                "left": 270,
                "top": 355,
                "width": 357,
                "height": 45
            },
            "words": "19990417"
        },
        "姓名": {
            "location": {
                "left": 267,
                "top": 176,
                "width": 152,
                "height": 50
            },
            "words": "伍云龙"
        },
        "性别": {
            "location": {
                "left": 269,
                "top": 262,
                "width": 33,
                "height": 52
            },
            "words": "男"
        },
        "民族": {
            "location": {
                "left": 492,
                "top": 279,
                "width": 30,
                "height": 37
            },
            "words": "汉"
        }
    },
    "words_result_num": 6
}

4. 对比识别出的数据和 用户的输入的数据是否一致

这个就太简单了 就不过多介绍了

    /**
     * 对比识别出的数据,和用户填写的数据是否一致
     * @param $idData
     * @param $userData
     * @return bool
     */
    private function comparisonID($idData, $userData)
    {
        if ($idData['realname'] == $userData['realname'] && $idData['ID'] == $userData['ID']) {
            return true;
        } else {
            return false;
        }
    }

注意,返回的数据,并不只有身份证号和姓名.大家可以按照自己的需求来获取数据.还有就是那个acess_token过期部分,并没有验证.希望大神指正

5.下面介绍下我所经手的网站的业务流程

自动认证身份证.png

注意:这个接口并非免费使用,每日免费500次调用.对于我现在所经手的网站那是搓搓有余了.具体价格感兴趣的朋友的到官网了解

好了,本次身份证图像识别的介绍了就写到这里了,如果有什么地方不对,希望大神指正.谢谢

相关实践学习
基于函数计算实现AI推理
本场景基于函数计算建立一个TensorFlow Serverless AI推理平台。
相关文章
|
22小时前
|
机器学习/深度学习 人工智能 算法
探索深度学习在图像识别中的应用与挑战
【4月更文挑战第25天】随着人工智能技术的迅猛发展,深度学习已成为推动图像识别领域进步的关键力量。本文将深入探讨深度学习技术在图像识别任务中的应用,分析其优势和面临的主要挑战,并展望未来发展趋势。通过对比传统机器学习方法,阐述深度学习如何通过构建复杂的网络结构实现高准确率的图像分类、检测与分割。同时,讨论数据量需求大、模型泛化能力、计算资源消耗等关键问题,并提出可能的解决方案。
|
2天前
|
机器学习/深度学习 安全 计算机视觉
深度学习在图像识别中的应用与挑战
【4月更文挑战第24天】 随着计算机视觉技术的飞速发展,深度学习已成为推动图像识别领域进步的核心动力。本文旨在探讨深度学习技术在图像识别中的关键应用,并分析当前面临的主要挑战。通过回顾卷积神经网络(CNN)的基础架构及其在图像分类、目标检测和语义分割中的创新应用,文章揭示了深度学习模型如何优化视觉信息处理流程。同时,针对训练数据需求、计算资源限制、模型泛化能力及对抗性攻击等问题,本文提出了一系列解决策略和技术方向,为未来研究提供了参考框架。
6 0
|
12天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习在图像识别中的应用及挑战
【4月更文挑战第14天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的核心动力。本文旨在探讨深度学习技术在图像识别任务中的应用及其面临的主要挑战。文中首先回顾了深度学习的基本概念和关键技术,随后详细分析了卷积神经网络(CNN)在图像分类、目标检测和语义分割等方面的应用实例。接着,文章着重讨论了数据偏差、模型泛化能力不足以及对抗样本攻击等关键问题。最后,提出了几种可能的解决方案,并对未来发展趋势进行了展望。
14 6
|
19天前
|
机器学习/深度学习 人工智能 监控
探索深度学习在图像识别中的应用及挑战
【4月更文挑战第7天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的核心动力。本文旨在深入剖析深度学习技术在图像识别任务中的应用及其所面临的诸多挑战。首先,我们将回顾深度学习的基本原理和关键技术,特别是卷积神经网络(CNN)在图像处理中的作用。其次,文章将探讨当前深度学习模型在图像识别领域的创新应用,包括面部识别、物体检测、场景理解等方面。最后,我们将分析深度学习在图像识别上遇到的挑战,如数据集偏差、模型泛化能力、对抗性攻击等,并对未来可能的解决方案进行展望。本文不仅为研究者提供了深度学习在图像识别方面的研究进展,也为相关领域的实践者指出了潜在的问题与发展方向。
|
23天前
|
机器学习/深度学习 算法
深度学习在图像识别中的应用和挑战
【4月更文挑战第3天】 随着科技的发展,深度学习已经在各种领域中得到广泛应用,其中图像识别是最为突出的一个。深度学习的模型能够通过学习和理解大量的图像数据,实现对未知图像的准确识别。然而,尽管深度学习在图像识别中取得了显著的成果,但仍然存在一些挑战,如数据量大、计算复杂度高、需要大量的标注数据等。本文将深入探讨深度学习在图像识别中的应用及其面临的挑战。
|
24天前
|
机器学习/深度学习 监控 算法
深度学习在图像识别中的应用及其挑战
【4月更文挑战第1天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的关键技术之一。尤其是在图像识别任务中,深度神经网络通过多层次的特征抽象,显著提高了识别的准确性和鲁棒性。本文将探讨深度学习技术在图像识别领域的应用现状,分析面临的主要挑战,并提出潜在的解决方案。我们还将展望深度学习未来的发展趋势以及其对相关行业的潜在影响。
10 0
|
8月前
|
缓存 数据安全/隐私保护
SpringSecurity-11-只允许一个用户登录
SpringSecurity-11-只允许一个用户登录
334 1
SpringSecurity-11-只允许一个用户登录
|
8月前
|
负载均衡 Java 应用服务中间件
Nginx
Nginx
166 0
|
11月前
|
安全 JavaScript 网络安全
2022超详细流程ios APP最新打包上线教程
本篇文章主要介绍使用Hbuildx开发的移动端项目,打包以及上传值苹果应用商店全部流程
|
11月前
|
应用服务中间件 nginx Windows
Nginx 在Windows下配置证书
1、从证书出售商获取证书文件,并复制到nginx的conf目录下2、打开nginx.conf配置文件,写入以下代码。
343 0