`
kissmett
  • 浏览: 40001 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过人脸检测来识别身份证上号码

 
阅读更多

提供一种通过人脸识别和ocr技术组合的身份证信息自动提取。通过身份证上的头像,定位身份证上的信息位置,并返回身份证号.

常规想法:采用机器学习的方式,用opencv或者coffe训练身份证的物体辨识,然后通过比如opencv的cv2.CascadeClassifier 来进行身份证的检测,然后用ocr提取其内部信息。

本文思路:借用现有的轮子,人脸检测+ocr进行身份证号提取。

虽有杀鸡用牛刀之嫌,但技术都是现成的,不用自己做机器学习训练。

原理很简单:通过人脸检测(face-detection)可以检测到身份证上的人脸,并返回面部识别框(face-rectangle),

face rect的位置,配合宽高计算出比例,可以计算出身份证号码的大体为位置,

因为照片中的面部有相对较大或者较小之分,故加入身份证号正则判断,并进行:一般/较小/较大面部比例 重获身份证号区域。

另,图片本身质量和在二值化和去噪过程中的信息损失,识别结果存在可理解的误差,故识别出的字母进行人工的数字转换,例如: 

(" ","") 

("O","0") 

("U","0") 

("D","0") 

("Z","2") 

("S","5") 

("s","5") 

("o","6") 

("f","7") 

("H","11") 

 

整体流程可以描述为:

针对图片进行人脸检测,得到人脸列表;

遍历这个列表,针对每一个人脸的位置和大小进行:

    一般面部比例下的身份证号定位和ocr识别(局部放大,二值化,去噪,ocr),并进行微调处理;

    若得到的不是身份证号(正则验证),则进行较小面部比例下的识别;

    若得到的不是身份证号(正则验证),则进行较大面部比例下的识别;

    若得到的不是身份证号(正则验证),则返回无法识别;

        

由人脸位置和大小进行身份证号码的定位思路见下图:



 

算法中的ocr识别过程及效果为:

1.局部放大:

 



 

2.灰度图:



 

3.二值化:



 
 

3.去噪声:



 4.ocr:

432930194901170013

代码:

#-*- coding: utf-8 -*-

import cv2
import sys
from PIL import Image
import pytesseract
import time
import re  

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

print(sys.getdefaultencoding())

#身份证号
r=r'^([1-9]\d{5}[12]\d{3}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])\d{3}[0-9xX])$'

###########根据比例和偏移算出号码位置
#一般面部比例
def CalcIdRectByFaceRect_normal(x,y,w,h):
    #print(x,y,w,h)
    scale = float(w) / 95
    #print(scale)
    x1 = int(x + (( 0 - 159) ) * scale)
    y1 = int( y + (0 + (149 ) ) * scale)
    x2 = int( x + (0 - 159 + ( 275 ) ) * scale)
    y2 = int(y +(0 + (149 ) + (45 ) ) * scale)
    #print( x1,y1,x2, y2)
    return ( x1,y1,x2, y2)

#较大面部比例
def CalcIdRectByFaceRect_big(x,y,w,h):
    scale = float(w) / 95
    x1 = int(x + (( 0 - 159) + 10) * scale)
    y1 = int( y + (0 + (149 - 3) ) * scale)
    x2 = int( x + (0 - 159 + ( 275 - 10) ) * scale)
    y2 = int(y +(0 + (149 - 3) + (45 - 10) ) * scale)
    return ( x1,y1,x2, y2)

#较小面部比例
def CalcIdRectByFaceRect_small(x,y,w,h):
    scale = float(w) / 95
    x1 = int(x + (( 0 - 159) - 10) * scale)
    y1 = int( y + (0 + (149 + 3) ) * scale)
    x2 = int( x + (0 - 159 + ( 275+ 10) ) * scale)
    y2 = int(y +(0 + (149 + 5) + (45 + 10) ) * scale)
    return ( x1,y1,x2, y2)

###########二值化算法
def binarizing(img,threshold):
    pixdata = img.load()
    w, h = img.size
    for y in range(h):
        for x in range(w):
            if pixdata[x, y] < threshold:
                pixdata[x, y] = 0
            else:
                pixdata[x, y] = 255
    return img


###########去除干扰线算法
def depoint(img):   #input: gray image
    pixdata = img.load()
    w,h = img.size
    for y in range(1,h-1):
        for x in range(1,w-1):
            count = 0
            if pixdata[x,y-1] > 245:
                count = count + 1
            if pixdata[x,y+1] > 245:
                count = count + 1
            if pixdata[x-1,y] > 245:
                count = count + 1
            if pixdata[x+1,y] > 245:
                count = count + 1
            if count > 2:
                pixdata[x,y] = 255
    return img

######## 通过头像的位置 身份证号码识别
def identity_OCR_byFaceRect(oImg,faceRect):
    (x,y,w,h) = faceRect
    iw,ih = oImg.size
    ##将身份证放大3倍
    largeImg = oImg.resize((iw*3,ih*3),Image.ANTIALIAS)
    #largeImg.save('1_large.png')
    
    #print(x,y,w,h)
    (x1,y1,x2,y2) = CalcIdRectByFaceRect_normal(x,y,w,h)
    print("id pos normal: %s,%s,%s,%s"%(x1,y1,x2,y2))
    region = (x1*3,y1*3,x2*3,y2*3) 
    code = GetRegionString(largeImg,region)
    print("code:%s"%code)
    if not re.match(r,code):
        (x1,y1,x2,y2) = CalcIdRectByFaceRect_small(x,y,w,h)
        print("id pos small: %s,%s,%s,%s"%(x1,y1,x2,y2))
        region = (x1*3,y1*3,x2*3,y2*3) 
        code = GetRegionString(largeImg,region)
        print("code:%s"%code)
    if not re.match(r,code):
        (x1,y1,x2,y2) = CalcIdRectByFaceRect_big(x,y,w,h)
        print("id pos big: %s,%s,%s,%s"%(x1,y1,x2,y2))
        region = (x1*3,y1*3,x2*3,y2*3) 
        code = GetRegionString(largeImg,region)
        print("code:%s"%code)
    if not re.match(r,code):
        code = 'no match detect'
    return code, (x1,y1,x2,y2)

def GetRegionString(img,region):
    #裁切身份证号码图片
    cropImg = img.crop(region)
    #cropImg.save('2_crop.png')
    # 转化为灰度图
    grayImg = cropImg.convert('L')
    #grayImg.save('3_grey.png')
    # 把图片变成二值图像。
    bImg =binarizing(grayImg,100)
    #bImg.save('4_bin.png')
    dImg =depoint(bImg)
    #dImg.save('5_depoint.png')
    code = pytesseract.image_to_string(dImg)
    code = PostProc(code)
    return code

######## 号码后处理  
def PostProc(s):
    res = s
    res = res.replace(" ","")
    res = res.replace("O","0")
    res = res.replace("U","0")
    res = res.replace("D","0")
    res = res.replace("Z","2")
    res = res.replace("S","5")
    res = res.replace("s","5")
    res = res.replace("o","6")
    res = res.replace("f","7")
    res = res.replace("H","11")
    return res
######## 检测身份证
def DetectFacesAndIDs(window_name, pic_path):
    frame =cv2.imread(pic_path)
    oImg =Image.open(pic_path)

    ih,iw = frame.shape[:2]
    print("image shape:%s,%s"%(ih,iw))
    #人脸识别分类器
    classfier = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
    
    #识别出人脸后要画的边框的颜色,RGB格式
    color = (0, 255, 0)    
    color2 = (255, 0, 0)    

    #将当前帧转换成灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)                 
    
    #人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
    faceRects = classfier.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32))
    if len(faceRects) > 0:            #大于0则检测到人脸                                   
        for faceRect in faceRects:  #单独框出每一张人脸
            x, y, w, h = faceRect      
            print("face: %s,%s,%s,%s"%(x, y, w, h))
            cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
            code,(x1,y1,x2,y2) = identity_OCR_byFaceRect(oImg,faceRect)
            cv2.rectangle(frame, (x1,y1), (x2,y2), color2, 2)
            #code = code.encode("utf-8")
            #code = PostProc(code)
            #print(u"code:%s"%code)
            print("----------------- detect result: %s"%code)
                    
    #cv2.imshow(window_name, frame)        
    cv2.imwrite("%s.iddet.png"% pic_path,frame)

    
if __name__ == '__main__':
    pic_path =sys.argv[1]
    time1 = time.time()
    DetectFacesAndIDs("detect face area", pic_path)
    time2 = time.time()
    print u'time:' + str(time2 - time1) + 's'

 

整体输入图像:



 

识别结果图像:



 图片来源于baidu

 

识别结果:

(py27) C:\ws\test\ocr>python idbyface.py ids.png
utf-8
image shape:925,1360
[ INFO:0] Initialize OpenCL runtime...
face: 1160,667,75,75
id pos normal: 1034,784,1251,820
code:ll211'1'|l(n'-41?.211?.'1'|X
id pos small: 1026,787,1259,832
code:5‘ll211'1'|l(n'-41?.211?.'1'|X
id pos big: 1042,782,1243,809
code:ll211'1'|l(n'-41?.211?.'1'|X
----------------- detect result: no match detect
face: 211,71,58,58
id pos normal: 113,161,281,189
code:a50725198601156011
id pos small: 107,163,287,198
code:430725198601156011
----------------- detect result: 430725198601156011
face: 658,73,95,95
id pos normal: 499,222,774,267
code:431023199205297212
----------------- detect result: 431023199205297212
face: 211,350,66,66
id pos normal: 100,453,291,484
code:37030519820727311X
----------------- detect result: 37030519820727311X
face: 651,352,70,70
id pos normal: 533,461,736,494
code:53038119‘
id pos small: 526,464,743,506
code:53038119‘
id pos big: 541,459,729,485
code:;znxa116u
----------------- detect result: no match detect
face: 1141,103,92,92
id pos normal: 987,247,1253,290
code:32622196188496
id pos small: 977,250,1263,305
code:32622196188496
id pos big: 996,244,1243,278
code:32622196188496
----------------- detect result: no match detect
face: 334,617,112,112
id pos normal: 146,792,470,845
code:9:432930194901170013
id pos small: 134,796,482,863
code:69:432930194901170013
id pos big: 158,789,458,830
code:432930194901170013
----------------- detect result: 432930194901170013
time:7.49099993706s

 

 

代码和测试文件见: https://github.com/kissmett/idcard-face-detect-number 

以上身份证图片均来自baidu,不知道侵犯肖像权没有,如有冒犯请第一时间联系我!

  • 大小: 2.6 MB
  • 大小: 161.8 KB
  • 大小: 52.8 KB
  • 大小: 2.3 KB
  • 大小: 2.3 KB
  • 大小: 1.5 MB
  • 大小: 1.5 MB
分享到:
评论

相关推荐

    腾讯身份证验证人脸识别代码java实例

    腾讯AI的身份证识别服务能够自动识别身份证正反两面的图像,然后通过OCR(Optical Character Recognition)技术将文字信息提取出来,极大地提高了信息录入的效率和准确性。 3. **人脸识别**:人脸识别技术是基于人...

    C#照片识别人脸截取成身份证比例的证件照

    在本项目中,可能采用了如Haar级联分类器或Dlib等方法进行初步的人脸检测。这些算法能检测到图像中的人脸区域,为后续的处理提供基础。 身份证照片的标准要求严格,通常需要满足一定的尺寸比例(例如中国身份证照片...

    基于uniapp实现的微信小程序,实名认证、身份证识别、人脸识别前端页面、wx.faceDetect

    在本文中,我们将深入探讨如何使用uniapp框架来构建微信小程序,实现实名认证、身份证识别和人脸识别功能。uniapp是一个跨平台的开发框架,它允许开发者使用一套代码编写,即可发布到iOS、Android、H5等多个平台。...

    小视人脸识别+身份证拍照上传

    至于OCR,可能使用的库有Tesseract或者Google的Cloud Vision API,它们能识别身份证上的文字信息,包括姓名、性别、出生日期和证件号码等。 在Android源码实现中,整个流程可能如下: 1. **启动相机**:使用...

    人脸识别C#源码(静态活体检测,不用动作配合)

    人证比对涉及将现场拍摄的人脸与身份证上的照片进行匹配,验证持证人的真实性。在无人零售店,顾客可以通过人脸识别进行支付,提供快速便捷的购物体验。 综上所述,"人脸识别C#源码(静态活体检测,不用动作配合)...

    C#人脸识别、人脸比对

    在C#中,可以通过Emgu CV这样的.NET封装库来使用OpenCV的功能,包括人脸检测和特征提取。 3. **本地化与检测**:在进行人脸识别前,需要先检测图像中的人脸。这通常通过Haar级联分类器或者HOG+SVM方法完成,这些...

    android实现小视人脸识别+身份证拍照上传

    - **Face Detection API**:Android系统内置了人脸检测API,可以从摄像头流中检测人脸,适用于简单的应用场景。 - **Deep Learning Models**:如SSD、YOLO或预训练的深度学习模型(如MTCNN、FaceNet)可以提供更高...

    java身份证号码识别,适用于web端身份证识别服务器,前端进行身份证号码定位,后端精准处理识别

    人脸识别虽然在名称中提及,但在身份证识别中,更侧重的是字符识别而非人脸检测,尽管在某些场景下,两者可能会结合使用,比如通过人脸识别来验证身份证持有者的真实性。 总的来说,这个Java身份证号码识别系统结合...

    腾讯人脸识别demo

    **人脸识别**:人脸检测,五官定位,个体信息管理,人脸验证,人脸对比及人脸检索 **人脸核身**:照片核身(通过照片和身份证信息),获取唇语验证码(用于活体核身),活体核身(通过视频和照片),活体核身(通过...

    小程序使用腾讯云人脸识别服务

    腾讯云人脸识别服务提供了丰富的API接口,涵盖了人脸检测、人脸识别、人脸比对、人脸搜索等多种应用场景。以下是对这一技术的详细讲解: 1. **人脸识别基础概念** - **人脸识别**:是一种生物特征识别技术,通过...

    身份证识别 Id_recognition.zip

    身份证识别通常涉及图像处理、模式识别、深度学习等技术,用于自动识别身份证上的文字、头像以及其他关键信息。 首先,身份证识别的核心在于图像预处理。在这个阶段,系统会接收身份证的图像,通过去噪、二值化、...

    嵌入式近红外人脸识别系统.pdf

    该技术可以分为两个部分:人脸检测和人脸识别。人脸检测是指对人脸图像进行初步检测,以确定人脸的位置和大小;人脸识别是指对人脸图像进行深入检测,以确定人脸的身份。 六、Adaboost算法在人脸检测中的应用 ...

    Spring Boot实现人脸识别等多种登录方式.zip

    - **百度智能云人脸识别API**:百度提供了丰富的AI服务,其中人脸识别API可以实现人脸检测、人脸识别、人脸比对等功能。在本项目中,开发者需要设置API的调用密钥,编写接口调用代码,将获取到的用户面部图像数据...

    insightface模型,包括人脸检测识别和对齐三个模型

    它包含了多个模型,用于人脸检测、识别以及对齐等任务,这些都是计算机视觉领域中人脸识别技术的关键组成部分。本篇文章将深入探讨这些模型及其在实际应用中的作用。 1. **人脸检测**: 人脸检测是识别图像中人脸...

    人脸识别+身份证识别-易语言

    在身份证识别中,OCR会读取身份证上的姓名、性别、出生日期、住址等个人信息,这对于身份验证和数据录入等场景非常有用。OCR技术通常包含图像预处理、字符分割、特征提取和字符识别四个阶段。 在"易语言"中实现这些...

    人脸识别全面PPT教案.pptx

    人脸识别是一种基于生物特征的识别技术,通过摄像头拍摄人的行为图像,通过人脸检测算法,从原始的行为图像中得到人脸区域,用特征提取算法提取人脸的特征,并根据这些特征确认身份的一种技术。 人脸识别技术的优势...

    iOS人脸识别

    Core ML是Apple推出的一个机器学习框架,它允许开发者将预先训练好的模型集成到iOS应用中,而Vision框架则提供了图像处理和计算机视觉的能力,包括实时人脸检测和识别。 1. Core ML框架:Core ML支持多种机器学习...

    基于Faster R-CNN的人脸识别算法研究.pdf

    旨在设计算法识别身份证人像与待检人像是否为同一旅客。使用卷积神经网络进行人脸识别算法的研究。使用检测人脸后计算人脸特征间距离的方式进行算法设计,最终达到95%的正确率。结果表明,Faster R-CNN算法能较精准...

    图像识别(包括人脸识别 和 虹膜识别)

    接下来,关键步骤是人脸检测,通常使用Haar级联分类器或者深度学习的SSD(Single Shot MultiBox Detector)等方法。检测到人脸后,会进行特征提取,如Local Binary Patterns (LBP)、Histogram of Oriented Gradients...

    基于人脸识别的身份识别系统.pdf

    在该系统中,人脸检测与人脸识别模块采用 SeetaFace,SeetaFace 是一个基于深度学习的面部识别系统,可以用于面部检测、面部识别、面部验证等应用。 人脸识别技术的发展前景非常广泛,在新兴领域也具有应用,如刷脸...

Global site tag (gtag.js) - Google Analytics