人脸识别就是一个程序能识别给定图像或视频中的人脸,OpenCV是用一系列分类好的图像来训练程序,并基于这些图像来进行识别。

它的每个识别,都有置信评分,在实际应用中通过对其设置阈值来进行筛选。


为了简单实现人脸识别的功能,写了几个函数从文件夹的图片、从视频中获取头像数据集合

  • 从视频中获取头像

  1. 创建存储头像的文件夹,用名称做文件夹的名字
  2. 用上一节的检查头像的方法,检测到头像后,调整大小到200*200,方便后面头像识别时对比
def genarate(user_name):userdir = './data/at/%s' % user_nameif not os.path.exists(userdir):print('make dir ', userdir)os.mkdir(userdir)face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_alt.xml')camera = cv2.VideoCapture(0)isopen = camera.isOpened()if not isopen:print('打开摄像头失败...')camera.set(3, 1280)camera.set(4, 720)cv2.namedWindow('face')while isopen:ret, frame = camera.read()if ret:gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.2, 5,minSize=(50,50))for (x,y,w,h) in faces:cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)f = cv2.resize(gray[y:y+h,x:x+w],(200,200))filename = './data/at/%s/%s.pgm' % (user_name, str(count))cv2.imwrite(filename, f)cv2.imshow('face', frame)pressKey = cv2.waitKey(1)if cv2.getWindowProperty('face', cv2.WND_PROP_AUTOSIZE) < 1:breakif pressKey == 27:  # ESCprint('退出。。。。。')breakelse:breakcamera.release()cv2.destroyAllWindows()
  • 从文件夹中获取头像图片

  1. 传入待查找的文件夹
  2. 读取目录里面的.jpg的图片,进行头像检测
  3. 将检测到头像存到文件夹中。(此处生成的图片用了.jpg的后缀,没有用之前的.pgm,用JPG方便后面手工分类,可以看到预览图)
  4. 这个函数主要是把目录里面的所有的头像生成到一个位置,再手工拷贝到对应的训练库的文件夹中去
def getpic_fromdir(dirname):face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_alt.xml')cv2.namedWindow('face',0)cv2.resizeWindow('face',1280,720)count = 0for filename in os.listdir(dirname):filedir = os.path.join(dirname,filename)if os.path.isdir(filedir):continueextname = os.path.splitext(filename)[1]if extname.upper() != '.jpg'.upper():continueprint('search in :',filename)frame = cv2.imread(filedir)if frame is None:print('read %s failed...' % filedir)continuegray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.3, 5,minSize=(50,50))for (x,y,w,h) in faces:cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)f = cv2.resize(gray[y:y+h,x:x+w],(200,200))filename = './data/from/%s.jpg' % str(count)cv2.imwrite(filename, f)count += 1print(count)cv2.imshow('face', frame)pressKey = cv2.waitKey(10)if pressKey == 27:  # ESCprint('退出。。。。。')breakcv2.destroyAllWindows()
  • 从头像文件夹中读取人脸数据

传入待查找识别的人的数据集 :

names = { 'AAA':1, 'BBB':2, 'CCC':3 }
  1. 查找存储人脸的目录,找到文件夹名字在待初始化的名称字典中时,才装载人脸数据
  2. 读取数据,存入待返回数组,已经人脸数据对应的ID(为数字,后面初始化时需要数字)
  3. 同时存储ID对应名称的字典,方便后面根据ID翻译名称
def read_images(path, names, sz=None):c = 0X,Y,index = [],[],{}for dirname in os.listdir(path):userid = int(names.get(dirname))if userid is None:continueindex[userid] = dirnamesubdir = os.path.join(path, dirname)if not os.path.isdir(subdir):continuefor file in os.listdir(subdir):try:filename = os.path.join(subdir, file)if os.path.isdir(filename):continueimg = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)if sz is None:img = cv2.resize(img, (200,200))else:img = cv2.resize(img, sz)X.append(np.asarray(img, dtype=np.uint8))Y.append(userid)except IOError as e:print("I/O error ({}): {1}.".format(e.errno, e.strerror))except:print("Unexcepted error:", sys.exc_info()[0])raise# c = c+1return [X,Y,index]
  • 从摄像头进行人脸识别

OpenCV有三种人脸识别的算法:

  • Eigenfaces

他是通过PCA来处理的。PCA是计算机视觉中用的较多的数学概念。它的本质是,识别某个训练集上的主成分,并计算出检测到人脸相对于数据库的发散程度,并输出一个值,该值越小,表明人脸数据库和检测到的人脸之间的差别就越小,0表示完全匹配。低于4000-5000的值相对可靠

  • Fisherfaces

它是从PCA衍生发展起来的,逻辑更复杂,计算更密集,但是比Eigenfaces更容易得到准确的效果。

  • LBPH(Local Binary Pattern Histogram)

在非常搞的层次上,将检测到的人脸分成小单元,并将其与模型中的对应单元进行比较,对每个区域的匹配值产生一个直方图,由于这种方法的灵活性,它是唯一运行模型样本人脸和检测到的人脸在形状、大小上可以不同的人脸识别算法。置信分在50以内的相对来说比较可靠

  1. 初始化算法

    model = cv2.face.EigenFaceRecognizer_create()

    model = cv2.face.FisherFaceRecognizer_create()

    model = cv2.face.LBPHFaceRecognizer_create()

  2. 训练 model.train,两个参数:图像数组、标签数组
  3. 检测出人脸后,调整到200*200大小,然后进行对比 model.predict(roi) ,返回匹配到的人脸的标签值,以及置信分
def face_rec(names, video_filename=None):read_images(r"./data/at",names)[X, Y, index] = read_images(r"./data/at",names)# model = cv2.face.EigenFaceRecognizer_create()model = cv2.face.LBPHFaceRecognizer_create()model.train(np.asarray(X), np.asarray(Y))face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_alt.xml')camera = Noneif not video_filename:camera = cv2.VideoCapture(0)isopen = camera.isOpened()if not isopen:print('打开摄像头失败...')else:camera = cv2.VideoCapture(video_filename)camera.set(3, 1280)camera.set(4, 720)cv2.namedWindow('face')ret, img = camera.read()while ret:ret, img = camera.read()if ret:gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray,1.2, 5,minSize=(50,50))for (x,y,w,h) in faces:img = cv2.rectangle(img, (x,y),(x+w,y+h),(255,0,0),2)roi = gray[y:y+h,x:x+w]try:roi = cv2.resize(roi,(200,200),interpolation=cv2.INTER_LINEAR)params = model.predict(roi)# print(params)if params[1] < 60:print("Label:{}, Confidence: {:.2f}".format(params[0],params[1]))cv2.putText(img, index[params[0]], (x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1.2,255,2)except Exception as ex:print('no rec: ',ex)continuecv2.imshow('face',img)pressKey = cv2.waitKey(20)if cv2.getWindowProperty('face', cv2.WND_PROP_AUTOSIZE) < 1:breakif pressKey == 27:  # ESCprint('退出。。。。。')breakcamera.release()cv2.destroyAllWindows()
  • model = cv2.face.FisherFaceRecognizer_create()

这个fish算法的model.train好慢。。。。。

在摄像头上识别我自己,识别的置信分大概140-350之间,里面有几个ID是2的,说明识别错了。。。

  • model = cv2.face.EigenFaceRecognizer_create()

它的train更慢。。。。

置信分在4000以内的还可以。。。

  • model = cv2.face.LBPHFaceRecognizer_create()

它的train快好多。。。  置信分在40以内的靠谱点

闲着无聊,对自己电脑上的一个文件夹里面的所有jpg文件进行了识别,当识别到的时候,停顿一下1.5秒再继续,中间跳转的过程中,按空格可以暂停。后面可以扩展下,将识别到的图片分类复制到对应的人名文件夹中去

def face_files(names, filedir):read_images(r"./data/at",names)[X, Y, index] = read_images(r"./data/at",names)model = cv2.face.LBPHFaceRecognizer_create()model.train(np.asarray(X), np.asarray(Y))face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_alt.xml')cv2.namedWindow('face',0)cv2.resizeWindow('face', 1280, 720)for file in os.listdir(filedir):filename = os.path.join(filedir, file)if os.path.isdir(filename):continueextname = os.path.splitext(file)[1]if extname.upper() != '.jpg'.upper():continueframe = cv2.imread(filename)if frame is None:print('read %s failed...' % filename)continuegray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.3, 5, minSize=(50, 50))rec_count = 0for (x, y, w, h) in faces:# cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)roi = gray[y:y + h, x:x + w]try:roi = cv2.resize(roi, (200, 200), interpolation=cv2.INTER_LINEAR)params = model.predict(roi)# print(params)if params[1] < 35:rec_count += 1cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)print("Label:{}, Confidence: {:.2f}".format(index[params[0]], params[1]))cv2.putText(frame, index[params[0]] + " Cf: {:.2f}".format(params[1]),(x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1.2, 255, 2)except Exception as ex:print('no rec: ', ex)continueframe = cv2.resize(frame,(1280,720),interpolation=cv2.INTER_LINEAR)cv2.imshow('face', frame)pressKey = cv2.waitKey(10)if rec_count > 0:cv2.putText(frame, "GET :{}".format(str(rec_count)),(500, 40),cv2.FONT_HERSHEY_SIMPLEX, 1.2, 255, 2)cv2.imshow('face', frame)pressKey = cv2.waitKeyEx(1500)if pressKey == 27:  # ESCprint('退出。。。。。')breakelif pressKey == 32: #空格 暂停cv2.putText(frame, "PAUSE",(20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, 255, 2)cv2.imshow('face', frame)pressKey = cv2.waitKey(0)if pressKey == 27:  # ESCprint('退出。。。。。')breakelif pressKey == 32:  # 空格 暂停cv2.putText(frame, "PAUSE" + " Cf: {:.2f}".format(params[1]),(20, 20), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 2)cv2.waitKey(0)cv2.destroyAllWindows()

【笔记】OpenCV3 人脸识别相关推荐

  1. 吴恩达老师深度学习视频课笔记:人脸识别

            什么是人脸识别:人脸验证和人脸识别的区别,如下图:         One-shot learning:人脸识别所面临的挑战就是需要解决一次学习(one-shot learning)问 ...

  2. 吴恩达深度学习笔记(105)-人脸识别之面部验证与二分类

    https://www.toutiao.com/a6652895489354105351/ 面部验证与二分类(Face verification and binary classification) ...

  3. 学习笔记TF058:人脸识别

    人脸识别,基于人脸部特征信息识别身份的生物识别技术.摄像机.摄像头采集人脸图像或视频流,自动检测.跟踪图像中人脸,做脸部相关技术处理,人脸检测.人脸关键点检测.人脸验证等.<麻省理工科技评论&g ...

  4. 计算机视觉与图像处理学习笔记之人脸识别的三种方法

    人脸检测是指在图像中完成人脸定位的过程,而人脸识别是在人脸检测的基础上进一步判断人的身份,OpenCV提供了三种人脸识别的方法:EigenFaces(特征脸).FisherFaces(人鱼脸).Loc ...

  5. 【论文笔记】—人脸识别—FaceNet—2015-CVPR

    论文介绍  FaceNet用到了两个网络,分别是ZFNet和 GoogleNet(Inception V1).FaceNet是直接利用triplet loss训练模型(输入图像,输出欧式空间中的)12 ...

  6. 【陈工笔记】# 人脸识别的实际操作记录 #

    "良好的习惯,才不会让努力白白浪费." 首先,需要down一个OpenCV出来,刚开始练习,可以在Windows上上手,安装包传送门:如果享用Linux,就down一个出来,也可以 ...

  7. Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储

    原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...

  8. 人脸识别系列(十五):COCO Loss

    论文链接:Rethinking Feature Discrimination and Polymerization for Large-scale Recognition 这篇文章其实和NormFac ...

  9. SpringBoot 实现人脸识别功能 !so easy

    Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 人脸识别因为起安全.便捷的特点,在当下的互联网产品中,可以说随处可见:常常用来解锁.授权.登录等,虽然用起来方便,但是要想自行实现, ...

  10. OpenCV3计算机视觉Python语言实现人脸识别笔记

    老衲最近在学习<OpenCV3计算机视觉Python语言实现>中文版,学到第五章人脸识别时懵逼了,书上代码都是片段,不会搞啊,不死心找了英文版官网的源代码,找了个遍,发现原版源代码排版错误 ...

最新文章

  1. MySQL 中的myisam内部临时表
  2. concurrent (二)AQS
  3. spring-boot的spring-cache中的扩展redis缓存的ttl和key名
  4. nfc/nfc模式_NFC的完整形式是什么?
  5. weblogic启动失败案例(root启动引起的权限问题)
  6. UNION 和UNION ALL 的区别
  7. 网页聊天室win10界面源码
  8. Java 8 golang 1.8_Java8 新特性(一) - Lambda
  9. EvolvingNetLib,嗯,一个网络请求库而已
  10. 指针 —— C语言的灵魂,你会了吗
  11. 【bzoj5166】[HAOI2014]遥感监测 贪心
  12. luncence学习
  13. 微信小程序字符头像,自定义任意字符头像,字符图片,avatar,利用minui
  14. win7系统两台计算机共享文件,教你设置win7系统的两台电脑实现文件共享的详细步骤...
  15. 在VMware Server上安装Windows Home Server“ Vail”
  16. Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container..
  17. 怎么学计算机自学,自学经验:如何学习计算机知识
  18. dad my_每个爸爸都应该给孩子读的大师绘本 - 《My Dad》绘本解读
  19. 盘点2016最值得突击的七大海外市场:最后一年窗口期,不出海就出局!
  20. 81、前后端等上下游岗位配合的思考和参考工作方法,望文知意,约定优于沟通

热门文章

  1. 三菱梯形图转换c语言软件,三菱PLC编程软件的梯形图程序的生成与编辑
  2. Maple 教程 何青,科学出版社
  3. 市级规划课题《小学数学教材解读策略研究》评审书
  4. Spring3注解零配置【私塾在线原创】
  5. 3dmax软件如何导入光网文件?
  6. php网页顶部菜单代码,5款个性的网页回到顶部特效代码
  7. CSS-返回顶部代码
  8. 5分钟实战QQ机器人教程(保姆级)
  9. everything软件使用技巧
  10. matlab数字图像处理课程设计报告,数字图像处理实验报告范文