如何使用人工智能平台识别身份证信息?

433 阅读6分钟

大家好,我是七安。

人工智能在快速发展,已经渗透到了我们生活的方方面面。对于我们普通人,不会机器学习,不会算法,是否也可以使用人工智能。今天,七安带领大家来做一个小小的案例,使用阿里云识别身份证。

在开始之前,我先给大家列一下,目前国内比较流行的一些人工智能平台。

1. 国内人工智能平台

云平台平台地址云功能截图在线体验地址
百度云AIai.baidu.com/ai.baidu.com/tech/ocr_ca…
阿里云AIai.aliyun.com/duguang.aliyun.com/experience?…
腾讯云AIcloud.tencent.com/cloud.tencent.com/act/event/o…
华为云AIwww.huaweicloud.com/lab.huaweicloud.com/solutiondet…

2. 各大平台请求示例

请提前下载好 Postman 进行测试。下载地址:www.postman.com/

2.1 腾讯云 AI 平台

腾讯云身份证识别(测试版-固定图片识别)

腾讯云身份认证(任意图片)

2.2 阿里云 AI 平台

阿里云身份证识别

2.3 华为云 AI 平台

华为云身份证识别(Auth-Token 需要动态获取)

2.4 百度云 AI 平台

3. 利用爬虫思维调用百度接口

本案例以识别身份证为例,利用爬虫的思维进行调用百度的接口。不需要登录任何账号。如果商用,请购买百度的 API。本文撰写目的是为了让小白更加快速的上手。有任何问题,请联系七安删除。

3.1 打开百度的身份证识别演示案例

地址:ai.baidu.com/tech/ocr_ca…

3.2 身份证解析接口

找到功能演示,右击检查

在右侧有一个 Fetch/XHR 控件,点击一下,并刷新一下,出现如下图,可以看到一个名为 aidemo 的接口。

鼠标点击一下,可以看到我有我们识别的身份证信息,如下:

{"errno":0,"msg":"success","data":{"card_quality":{"IsClear_propobility":0.9209558368,"IsNoCover":1,"IsClear":1,"IsNoCover_propobility":0.8376007676,"IsComplete_propobility":0.9831219316,"IsComplete":1},"words_result":{"姓名":{"location":{"top":434,"left":657,"width":297,"height":130},"words":"徐乐"},"民族":{"location":{"top":664,"left":1177,"width":88,"height":110},"words":"汉"},"住址":{"location":{"top":1068,"left":641,"width":1061,"height":257},"words":"安徽省宿州市埇桥区朱仙庄镇"},"公民身份号码":{"location":{"top":1593,"left":1040,"width":1431,"height":146},"words":"652901196611026716"},"出生":{"location":{"top":855,"left":638,"width":850,"height":120},"words":"19661102"},"性别":{"location":{"top":660,"left":650,"width":98,"height":114},"words":"男"}},"words_result_num":6,"idcard_number_type":1,"image_status":"normal","risk_type":"normal","log_id":"6239341674166648223"}}

打开网站 www.json.cn/# 格式化后,结果如下:

{
    "errno":0,
    "msg":"success",
    "data":{
        "card_quality":{
            "IsClear_propobility":0.9209558368,
            "IsNoCover":1,
            "IsClear":1,
            "IsNoCover_propobility":0.8376007676,
            "IsComplete_propobility":0.9831219316,
            "IsComplete":1
        },
        "words_result":{
            "姓名":{
                "location":{
                    "top":434,
                    "left":657,
                    "width":297,
                    "height":130
                },
                "words":"徐乐"
            },
            "民族":{
                "location":{
                    "top":664,
                    "left":1177,
                    "width":88,
                    "height":110
                },
                "words":"汉"
            },
            "住址":{
                "location":{
                    "top":1068,
                    "left":641,
                    "width":1061,
                    "height":257
                },
                "words":"安徽省宿州市埇桥区朱仙庄镇"
            },
            "公民身份号码":{
                "location":{
                    "top":1593,
                    "left":1040,
                    "width":1431,
                    "height":146
                },
                "words":"652901196611026716"
            },
            "出生":{
                "location":{
                    "top":855,
                    "left":638,
                    "width":850,
                    "height":120
                },
                "words":"19661102"
            },
            "性别":{
                "location":{
                    "top":660,
                    "left":650,
                    "width":98,
                    "height":114
                },
                "words":"男"
            }
        },
        "words_result_num":6,
        "idcard_number_type":1,
        "image_status":"normal",
        "risk_type":"normal",
        "log_id":"6239341674166648223"
    }
}

至此,我们找到了识别身份证的接口。

3.3 分析接口

这里,我建议建议大家自己找一个身份证图片,点击本地上传,分析右侧接口的数据。

很奇怪,我们并没有发现图片是通过什么上传的,别急。点击右侧的 Payload,你会发现,有一个图片的参数。不过是 base64。大家可以打开 www.jsons.cn/img2base64/ ,上传你刚刚本地上传测试的身份证图片,解析后与这里的参数对比,可以发现是一致的。

经过分析,请求参数如下:

Header如下:

参数
Content-Typeapplication/x-www-form-urlencoded
Hostai.baidu.com
Originai.baidu.com
Refererai.baidu.com/tech/ocr_ca…
User-Agentai.baidu.com/tech/ocr_ca…

Body中放置请求参数,参数详情如下:

参数
imagebase64图片值
image_url
typeaip.baidubce.com/rest/2.0/oc…
id_card_sidefront
detect_photofalse
detect_risktrue
detect_qualitytrue

3.4 代码实现

  • 身份证示例

  • 图片转 base64

  • 完整代码实现
import requests
import base64

url = 'https://ai.baidu.com/aidemo'


headers = {

        # 'Accept': '*/*',
        # 'Accept-Encoding': 'gzip, deflate, br',
        # 'Accept-Language': 'zh-CN,zh;q=0.9',
        # 'Connection': 'keep-alive',
        # 'Content-Length': '298165',
        'Content-Type': 'application/x-www-form-urlencoded',
        # 'Cookie': 'BIDUPSID=B493293EF5551708B0B3A75A1746660E; PSTM=1626534314; BAIDUID=B493293EF555170867455BC015F4E610:FG=1; __yjs_duid=1_6f801b111f14006ae93df96bf431ddf21626587717232; MCITY=-354%3A; BDUSS=0lCTkRsaE1ZZGtINERmb0hwSTZSVlFMMm5wQVdNTHZINkZMTVFFWmZCbEJtbDlpRVFBQUFBJCQAAAAAAAAAAAEAAABpOk06sK7H6bqjTG92ZcDW1LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEENOGJBDThiR; BDUSS_BFESS=0lCTkRsaE1ZZGtINERmb0hwSTZSVlFMMm5wQVdNTHZINkZMTVFFWmZCbEJtbDlpRVFBQUFBJCQAAAAAAAAAAAEAAABpOk06sK7H6bqjTG92ZcDW1LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEENOGJBDThiR; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; Hm_lvt_8b973192450250dd85b9011320b455ba=1651995973; Hm_lpvt_8b973192450250dd85b9011320b455ba=1651998828; ab_sr=1.0.1_OGVjMjI5MzJkMTc1YWI5OGJlMTU2NzcyNGI2ZjE5ZDljN2Y4N2UwZmVlMzVkMTg5NzI0ZThlZmU2NzM3OTBjZDRhMTM4M2U2YWRiODYzMDNhNzQ1MjgwMmRkZTdjZTU0MjhkNTc5ZGUwZGIzMWQ2ODRkMTk5YTQyYjgyM2Y1YjkzZjRhYWUyMGQzZGY2MDE0NTQ4NjA5MWQ4ZGQ2MTEwOQ==; delPer=0; PSINO=2; BAIDUID_BFESS=BB0683E87BC25C70C608B00BA15DCAD3:FG=1; H_PS_PSSID=36185_36309_31660_34812_36167_34584_35979_36073_36235_26350_36349_36314_36061; BA_HECTOR=0g8h8k8ga185252htf1h7f29j0q',
        'Host': 'ai.baidu.com',
        'Origin': 'https://ai.baidu.com',
        'Referer': 'https://ai.baidu.com/tech/ocr_cards/idcard',
        # 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"',
        # 'sec-ch-ua-mobile': '?0',
        # 'sec-ch-ua-platform': '"Windows"',
        # 'Sec-Fetch-Dest': 'empty',
        # 'Sec-Fetch-Mode': 'cors',
        # 'Sec-Fetch-Site': 'same-origin',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
            
    }


with open('sfz.jpg', 'rb') as f:
    res = f.read()
    
# 获取身份证的base64图片
img = 'data:image/jpeg;base64,' + str(base64.b64encode(res), 'utf-8')
    

data = {
    'image': img,
    'image_url': '', 
    'type': 'https://aip.baidubce.com/rest/2.0/ocr/v1/idcard',
    'id_card_side': 'front',
    'detect_photo': 'false',
    'detect_risk': 'true',
    'detect_quality': 'true'
    }

res = requests.post(url, headers=headers, data=data)

if res.status_code == 200:
    print(res.text)

  • 结果格式化后如下
{
    "errno":0,
    "msg":"success",
    "data":{
        "card_quality":{
            "IsClear_propobility":0.905374527,
            "IsNoCover":1,
            "IsClear":1,
            "IsNoCover_propobility":0.8388896585,
            "IsComplete_propobility":0.8842121959,
            "IsComplete":1
        },
        "words_result":{
            "姓名":{
                "location":{
                    "top":441,
                    "left":648,
                    "width":292,
                    "height":114
                },
                "words":"王飞"
            },
            "民族":{
                "location":{
                    "top":657,
                    "left":1170,
                    "width":78,
                    "height":100
                },
                "words":"汉"
            },
            "住址":{
                "location":{
                    "top":1057,
                    "left":630,
                    "width":936,
                    "height":113
                },
                "words":"辽宁省大连市甘井子区"
            },
            "公民身份号码":{
                "location":{
                    "top":1574,
                    "left":1035,
                    "width":1399,
                    "height":123
                },
                "words":"522530199208180048"
            },
            "出生":{
                "location":{
                    "top":845,
                    "left":624,
                    "width":846,
                    "height":106
                },
                "words":"19920818"
            },
            "性别":{
                "location":{
                    "top":659,
                    "left":646,
                    "width":93,
                    "height":103
                },
                "words":"女"
            }
        },
        "risk_type":"normal",
        "words_result_num":6,
        "idcard_number_type":1,
        "image_status":"normal",
        "log_id":"1523297051593742519"
    }
}

注意,这里我是直接放了一张身份证的图片,与代码同一目录下。后台回复关键词 身份证,获取身份证示例图片。将上述代码放在同一目录下即可运行识别。

非常感谢你的阅读,更多精彩内容,请关注我的公众号「七安学编程」。