提供一种通过人脸识别和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,不知道侵犯肖像权没有,如有冒犯请第一时间联系我!
相关推荐
腾讯AI的身份证识别服务能够自动识别身份证正反两面的图像,然后通过OCR(Optical Character Recognition)技术将文字信息提取出来,极大地提高了信息录入的效率和准确性。 3. **人脸识别**:人脸识别技术是基于人...
在本项目中,可能采用了如Haar级联分类器或Dlib等方法进行初步的人脸检测。这些算法能检测到图像中的人脸区域,为后续的处理提供基础。 身份证照片的标准要求严格,通常需要满足一定的尺寸比例(例如中国身份证照片...
在本文中,我们将深入探讨如何使用uniapp框架来构建微信小程序,实现实名认证、身份证识别和人脸识别功能。uniapp是一个跨平台的开发框架,它允许开发者使用一套代码编写,即可发布到iOS、Android、H5等多个平台。...
至于OCR,可能使用的库有Tesseract或者Google的Cloud Vision API,它们能识别身份证上的文字信息,包括姓名、性别、出生日期和证件号码等。 在Android源码实现中,整个流程可能如下: 1. **启动相机**:使用...
人证比对涉及将现场拍摄的人脸与身份证上的照片进行匹配,验证持证人的真实性。在无人零售店,顾客可以通过人脸识别进行支付,提供快速便捷的购物体验。 综上所述,"人脸识别C#源码(静态活体检测,不用动作配合)...
在C#中,可以通过Emgu CV这样的.NET封装库来使用OpenCV的功能,包括人脸检测和特征提取。 3. **本地化与检测**:在进行人脸识别前,需要先检测图像中的人脸。这通常通过Haar级联分类器或者HOG+SVM方法完成,这些...
- **Face Detection API**:Android系统内置了人脸检测API,可以从摄像头流中检测人脸,适用于简单的应用场景。 - **Deep Learning Models**:如SSD、YOLO或预训练的深度学习模型(如MTCNN、FaceNet)可以提供更高...
人脸识别虽然在名称中提及,但在身份证识别中,更侧重的是字符识别而非人脸检测,尽管在某些场景下,两者可能会结合使用,比如通过人脸识别来验证身份证持有者的真实性。 总的来说,这个Java身份证号码识别系统结合...
**人脸识别**:人脸检测,五官定位,个体信息管理,人脸验证,人脸对比及人脸检索 **人脸核身**:照片核身(通过照片和身份证信息),获取唇语验证码(用于活体核身),活体核身(通过视频和照片),活体核身(通过...
腾讯云人脸识别服务提供了丰富的API接口,涵盖了人脸检测、人脸识别、人脸比对、人脸搜索等多种应用场景。以下是对这一技术的详细讲解: 1. **人脸识别基础概念** - **人脸识别**:是一种生物特征识别技术,通过...
身份证识别通常涉及图像处理、模式识别、深度学习等技术,用于自动识别身份证上的文字、头像以及其他关键信息。 首先,身份证识别的核心在于图像预处理。在这个阶段,系统会接收身份证的图像,通过去噪、二值化、...
该技术可以分为两个部分:人脸检测和人脸识别。人脸检测是指对人脸图像进行初步检测,以确定人脸的位置和大小;人脸识别是指对人脸图像进行深入检测,以确定人脸的身份。 六、Adaboost算法在人脸检测中的应用 ...
- **百度智能云人脸识别API**:百度提供了丰富的AI服务,其中人脸识别API可以实现人脸检测、人脸识别、人脸比对等功能。在本项目中,开发者需要设置API的调用密钥,编写接口调用代码,将获取到的用户面部图像数据...
它包含了多个模型,用于人脸检测、识别以及对齐等任务,这些都是计算机视觉领域中人脸识别技术的关键组成部分。本篇文章将深入探讨这些模型及其在实际应用中的作用。 1. **人脸检测**: 人脸检测是识别图像中人脸...
在身份证识别中,OCR会读取身份证上的姓名、性别、出生日期、住址等个人信息,这对于身份验证和数据录入等场景非常有用。OCR技术通常包含图像预处理、字符分割、特征提取和字符识别四个阶段。 在"易语言"中实现这些...
人脸识别是一种基于生物特征的识别技术,通过摄像头拍摄人的行为图像,通过人脸检测算法,从原始的行为图像中得到人脸区域,用特征提取算法提取人脸的特征,并根据这些特征确认身份的一种技术。 人脸识别技术的优势...
Core ML是Apple推出的一个机器学习框架,它允许开发者将预先训练好的模型集成到iOS应用中,而Vision框架则提供了图像处理和计算机视觉的能力,包括实时人脸检测和识别。 1. Core ML框架:Core ML支持多种机器学习...
旨在设计算法识别身份证人像与待检人像是否为同一旅客。使用卷积神经网络进行人脸识别算法的研究。使用检测人脸后计算人脸特征间距离的方式进行算法设计,最终达到95%的正确率。结果表明,Faster R-CNN算法能较精准...
接下来,关键步骤是人脸检测,通常使用Haar级联分类器或者深度学习的SSD(Single Shot MultiBox Detector)等方法。检测到人脸后,会进行特征提取,如Local Binary Patterns (LBP)、Histogram of Oriented Gradients...
在该系统中,人脸检测与人脸识别模块采用 SeetaFace,SeetaFace 是一个基于深度学习的面部识别系统,可以用于面部检测、面部识别、面部验证等应用。 人脸识别技术的发展前景非常广泛,在新兴领域也具有应用,如刷脸...