文章目录
本周的前沿课程由微众银行的钟伟老师、廖梓雄老师和周智老师带来了《金融科技 SaaS 产品》的分享。本次学习报告笔者将分两部分进行:
- 对金融实人认证部分以关键词或者提出问题的形式进行简略总结。
- 就其中笔者感兴趣的身份证OCR内容,结合课程理论进行实战开发,应用于解决问题。
金融实人认证
实人认证整体介绍
实名认证产品知多少?
- 人脸验证的时候,页面各种颜色闪烁进行检测验证的过程就是所谓的实名认证产品。
金融级实人认证的市场背景?
- 解决痛点:线下办理业务成本高、线上身份难以确认、身份冒用问题严重、“无证”情况下身份核验
- 大势所趋:央行、运营商、保险、直播等都发布文件,表明需求。
实人认证产品对比:传统银行 VS 互联网银行
- 传统银行:以人工面对面核验为主,其他技术手段辅助验证;人的误识率在 0.6%左右;服务时效、覆盖范围有限。
- 互联网银行:依托人工智能等技术,形成多维的实人认证体系;人的误识率可低于 0.01%,甚至更低;可满足随时、随地的用户服务。
远程实人认证逐渐成为线上业务服务的基础
- 2015 年 12 月,央行发布了人民币银行结算账户管理新规,将个人银行账户分为三级,明确了各级别账户的细则管理,从而促进了远程身份验证成为线上业务服务的基础。
- 远程身份验证成为线上业务服务的基础,人脸识别以其易用性、安全性及完善的个人居民身份信息库为基础,促进了在各互联网行业的身份认证流程的快速应用。
金融级实人认证:产品模块介绍
- 意愿性验证:让用户配合朗读一段文字,通过 ASR+NLP 去识别用户读取信息与原段文字的完整度和语义匹配度,已达到验证客户意愿性的目的。
- 活体检测:活体检测通过动作交互、光线交互、静默、语音数字活体等多种方式验证当前核身用户是否真实活体。
- 人脸比对:OCR、人脸比对(1:1) 等多种方式结合,验证当前用户身份信息,分为:自带比对源认证和权威源认证两种。
金融级实人认证:标准流程
![金融级实人认证:标准流程](http://images.ferryxie.cn/2022-05-02-124321.png#center)
金融级实人认证:整体框架
![金融级实人认证:整体框架](http://images.ferryxie.cn/2022-05-02-124409.png#center)
金融级实人认证:如何保护用户隐私
- 2021 年 8 月 20 日,十三届全国人大常委会第三十次会议表决通过《中华人民共和国个人信息保护法》,11 月 1 日起施行。
- 个保法的颁布,更进一步对科技产品在用户使用过程中,如何保护用户隐私提出了更高、更明确的要求。
- 主要包括:充分授权、最小采集、不留痕迹、信息加密
实人认证的产品架构
意愿性表达
交互流程
![意愿性表达:交互流程](http://images.ferryxie.cn/2022-05-02-124627.png#center)
设计要点
- 视觉交互(交互引导设计;适配和兼容性;埋点(流失率分析))
- 人脸检测(脸完整度检测(姿态、光线等);人脸连续性检测;视频和音频分离录制;留存最佳人脸照片)
- 语音/语义识别(ASR 语音转文本识别;NLP 文本语义理解并与上送的原文本进行语义理解比较)
证件OCR
文字识别能力
![证件OCR](http://images.ferryxie.cn/2022-05-02-125004.png#center)
质量检测能力
- 终端 SDK:内置质检能力,可在前端实时甄别模糊、边框不完整等问题图片,自动拍摄完整清晰的合格图片。
- 服务端:质量检测模块可输出图片清晰分,判断边框不完整、框内遮挡、图片反光等质量告警,供合作方根据自身业务场景灵活配置使用。
![质量检测能力](http://images.ferryxie.cn/2022-05-02-125144.png#center)
证件 OCR :真伪辨别
-
复印件告警
-
【攻击手段】攻击者并无身份证原件,采用黑白或彩色打印/复印出被攻击者的身份证。
- 【拦截原理】根据边框、颜色、材质等差异,识别彩色及黑白复印件。
-
-
屏幕翻拍件告警
-
【攻击手段】攻击者并无身份证原件,采用手机、电脑等电子设备中的被攻者的身份证。
-
【拦截原理】根据边框、摩尔纹、光线情况等差异,识别屏幕翻拍件。
-
-
PS 涂改告警
-
【攻击手段】情况一:攻击者有身份证原件,在原件卡面涂改信息以修改身份证件内容;情况二:攻击者无身份证原件,在身份证电子文件中使用 PS 等图像编辑软件修改身份证件内容。
-
【拦截原理】根据字体大小、间距行距、字形等字体改动识别 PS 涂改。
-
证件NFC
产品流程
实证 NFC 产品的认证流程如下图所示,用户通过放置身份证在手机 NFC 位置,实证 NFC 产品读取并解码身份证内置加密信息,即可获取到身份证上的要素信息、证件头像、身份证国徽面、身份证人像面等 11 要素信息,并返回给客户进行业务使用。
![证件NFC:产品流程](http://images.ferryxie.cn/2022-05-02-125550.png#center)
支持识别内容与类型
- 身份证件类:二代身份证、港澳居住证、台湾居住证、外国人永居证
- 旅行证件类:护照、港澳通行证、台湾通行证、台胞证、回乡证
分级活体
分级活体检测:可根据分级策略动态下发交互策略
![分级活体检测](http://images.ferryxie.cn/2022-05-02-125719.png#center)
架构:兼顾安全性和便捷性
![活体检测架构](http://images.ferryxie.cn/2022-05-02-125932.png#center)
模型组合:多维活体检测模型组合,可根据场景灵活配置
- 多维度的活体防攻击检测模型,基于交互、视频、图片、纹理等多维分析,确保活体安全。
- 包括:交互检测、视频分析、图像分析、屏幕分析、纸片分析纹理/面具分析、设备指纹
活体攻击常见类型
- 屏幕翻拍(包含高清)
- 高清屏幕攻击+五官部分编辑
- 动画合成
- 纸质面具
- 摄像被劫持,直接导入视频流信息,常见于攻击光线活体
- 3D 打印的人脸模型(塑质、石墨、头模等模型)
图片内容标签识别
- 图片内容标签识别指:对人脸核身中图片增加涉黄、涉政、涉暴、广告特征、人物特征识别等特征识别;
- 背景聚类主要提供对图片进行背景识别分类,将相似的背景识别归类在一起,应用于风控判断场景中;
- 识别结果标签直接在人脸核身的结果字段中返回,无需二次开发调用。
![图片内容标签识别](http://images.ferryxie.cn/2022-05-02-130425.png#center)
实人认证的产品优势
- 产品成功的关键:产品+运营高效协同
- 产品设计关键要点,怎么做?— 交互体验+兼容性+埋点+产品架构+产品指标+产品性能+产品迭代
- 健全的运营管理体系,才能做好产品运营。 — 运营监控+服务处理+运营管理流程
基于百度AI的身份证图片批量OCR识别
笔者基于对金融实人认证中的证件OCR部分感兴趣,想动手实际操作一番。一番调查,发现使用百度大脑AI提供的API可以很简单地免费实现批量识别身份证图片信息,并制成Excel表格,方便下一步进行数据分析。
百度AI的身份证接口支持对二代居民身份证正反面所有8个字段进行结构化识别,包括姓名、性别、民族、出生日期、住址、身份证号、签发机关、有效期限,识别准确率超过99%;同时支持身份证正面头像检测,并返回头像切片的base64编码及位置信息。
同时,支持对用户上传的身份证图片进行图像质量和风险检测,是否存在正反颠倒、模糊、欠曝、过曝等质量问题,可识别图片是否为复印件或临时身份证,是否被翻拍或编辑,是否存在四角不完整、头像或关键字段被遮挡。
运行环境
python 3.6 ,pandas=1.3.5 ,requests=2.26.0 ,openpyxl=3.0.9
注册百度智能云
在编写调用程序前,首先需要到百度智能云官网的文字识别免费注册一个身份证识别。
![注册百度身份证识别](http://images.ferryxie.cn/2022-05-02-140922.jpg#center)
领取后在官网控制台的应用列表里面创建一个应用,可以得到APIKey和SecretKey,后面就可以在python程序中进行API调用了。
![获取APIKey和SecretKey](http://images.ferryxie.cn/2022-05-02-140925.jpg#center)
调用鉴权接口获取token
调用接口需要添加URL参数:access_token,所以需要通过上面注册得到的API Key和Secret Key获取的access_token。
参考官方文档“Access Token获取”,笔者首先在目录下创建一个config.conf配置文件(用来存储API Key、Secret Key,已经获取的access_token)和img文件夹(用来存储要识别的身份证图片)
从config文件读取AK和SK,接着调用接口获取access_token,最后再将提取access_token,并写入config。代码如下:
config.read('config.conf', encoding='UTF-8')
# 从config文件读取AK和SK
AK = config['ApplicationInfo']['APIKey']
SK = config['ApplicationInfo']['SecretKey']
if (AK == '') + (SK == ''):
print('未填写APIKey和SecretKey,请打开config.conf填写')
time.sleep(2)
quit()
# 获取access_token
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + AK + '&client_secret=' + SK
response = requests.get(host)
# 提取access_token,并写入config
if response:
Access_token = response.json()['access_token']
try:
Access_token
except NameError:
print('APIKey和SecretKey填写有误,access_token获取失败,请检查你的填写')
time.sleep(2)
quit()
config['token'] = {
'AccessToken': Access_token
}
config.write(open('config.conf', 'w', encoding='UTF-8'), space_around_delimiters=False)
最后接口的config文件如下:
[ApplicationInfo]
apikey = wjCs6rBdyFSy7IOiqe7FEGah
secretkey =zdULBykXkvmGbrb02lOQrTmBDDC4mnLa
[token]
accesstoken=24.ca18001507c7301c1bca181e41d26ccc.2592000.1653986974.282335-26140110
用python调用API接口
笔者接着新建了一个idocr.py
文件,写了idocr(filepath)函数用来调用接口进行身份证OCR识别,这里的参数为识别图片二进制文件路径。
调用接口的核心代码如下:
# 百度大脑AI接口识别身份证信息
request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard"
# 二进制方式打开图片文件
f = open(filepath, 'rb')
img = base64.b64encode(f.read())
params = {"id_card_side":"front","image":img}
# access_token = ''
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
并提取身份证中有用的信息
# 提取有用信息
if 'words_result' in idinfo:
if '姓名' in idinfo['words_result']:
birthday=list(idinfo['words_result']['出生']['words'])
birthday.insert(4,'/')
birthday.insert(7,'/')
birthday=''.join(birthday)
idresult=[
idinfo['words_result']['姓名']['words'],
idinfo['words_result']['民族']['words'],
idinfo['words_result']['住址']['words'],
idinfo['words_result']['公民身份号码']['words'],
birthday,
idinfo['words_result']['性别']['words']
]
将身份证信息写入excel文件
接着新建一个csvmod.py
文件,用来新建csv文件,并为csv文件追加行信息,将识别出来的身份证信息写入output.csv
文件。
import csv
def create_csv(csv_head): #新建csv文件,参数为标题行,使用py列表
path = "output.csv"
with open(path,'w',newline='',encoding='utf-8') as f:
csv_write = csv.writer(f)
csv_write.writerow(csv_head)
def write_csv(data_row): #为csv文件追加行信息,使用py列表
path = "output.csv"
with open(path,'a+',newline='',encoding='utf-8') as f:
csv_write = csv.writer(f)
csv_write.writerow(data_row)
运行结果
最后将上述步骤涉及的代码封装起来,遍历img文件夹,识别身份证信息,并写入excal表格。
笔者这里以从网上找到的几张身份证假照片进行测试。(笔者也测试了自己的身份证识别,也可以成功,这里由于隐私问题就不放出来了)
![身份证测试图片](http://images.ferryxie.cn/2022-05-02-140923.png#center)
运行程序,可以看到结果如下,识别成功(图片的姓名都遮挡住了)
![测试结果](http://images.ferryxie.cn/2022-05-02-154600.jpg#center)
再看输出的excel文件,如下图所示,完成了身份证识别并写入excel。
![输出到excel](http://images.ferryxie.cn/2022-05-02-140925.png#center)