文章目录

  • 前言
  • 一、opencv 人脸识别函数
  • 二、从素材准备到预测
  • 三、意外的发现
  • 四、结论

前言

学习opencv, 用网上找到的男女明星照骗试了下opencv的3种人脸识别机制, 似乎都不太行。


一、opencv 人脸识别函数

  • 有3个识别器:
recognizer_eigenface = cv2.face.EigenFaceRecognizer_create()
recognizer_fisher = cv2.face.FisherFaceRecognizer_create()
recognizer_LBPH = cv2.face.LBPHFaceRecognizer_create()
  • 使用方法是一样的,都要先准备好训练集来训练,训练后再预测
  • 注意安装标准版的opencv-python是不行的,要安装opencv-contrib-python才行。

二、从素材准备到预测

  1. 下载图片
    男女明星各一组,每组2人,每人各9张。图片找小冰要的,度娘也一样。
  2. 图片规整化
    训练时要求图片尺寸统一,而下载来的图片大大小小,所以要统一到同一尺寸. 用简单粗暴的方法,查出所有图片的最小尺寸,然后将所有照片调到此尺寸。不能变形,不足的方向补黑边。
def unifyImg(strSource):#read all images and get the smallest sizex_min = 9999y_min = 9999img_Bingbing = list()img_file_list = os.listdir(strSource)for i in range(0,len(img_file_list)):strFileName = os.path.join(strSource,img_file_list[i]) if os.path.isfile(strFileName):img = cv2.imread(strFileName)if img is None:print('Failed when read file %s'%strFileName)continue# record sizeif img.shape[0] < y_min:y_min = img.shape[0]if img.shape[1] < x_min:x_min = img.shape[1]#store img and its nameimg_Bingbing.append([img,img_file_list[i]])#Resize images  frontFaceCascade = cv2.CascadeClassifier(r'.\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')profileFaceCascade = cv2.CascadeClassifier(r'.\Lib\site-packages\cv2\data\haarcascade_profileface.xml')for i in range(0,len(img_Bingbing)):img = img_Bingbing[i][0]#check if face is identified in the imagefrontFaces = frontFaceCascade.detectMultiScale(img)profileFaces = profileFaceCascade.detectMultiScale(img)if len(frontFaces) == 0:if len(profileFaces) == 0:print("no face detected on img: %s, deleted."%img_Bingbing[i][1])continueelse:x = profileFaces[0][0]y = profileFaces[0][1]w = profileFaces[0][2]h = profileFaces[0][3]else:x = frontFaces[0][0]y = frontFaces[0][1]w = frontFaces[0][2]h = frontFaces[0][3]img_new = img[y:y+h,x:x+w]cv2.imwrite(strSource + "\\Face_only\\" + img_Bingbing[i][1],img_new)# 98% make sure the output image size is smaller than the min_x or min_yrate_x = x_min / img.shape[1] * 0.98rate_y = y_min / img.shape[0] * 0.98 rate = min(rate_x, rate_y)img_new = cv2.resize(img, None, fx = rate, fy = rate)if len(img_new.shape) == 2:# greyimg_template = np.zeros((y_min, x_min),np.uint8) else:img_template = np.zeros((y_min, x_min, 3),np.uint8) h = img_new.shape[0]w = img_new.shape[1]img_template[0:h,0:w] = img_newcv2.imwrite(strSource + "\\Unified\\" + img_Bingbing[i][1],img_template)strSource = r'C:\Waley\Personal\Learning\Python\Image\TryFaceIdentify'
unifyImg(strSource)
  1. 挑一部分统一好尺寸的图片整合进一个列表,用来训练
src = list()
lables = list()
# LiYiFeng
for i in range(0,6):img = cv2.imread(strSource + "\\unified\\LYF_" + str(i+1) + ".jpg",cv2.IMREAD_GRAYSCALE)if img is None:print("Fail to read images")sys.exit(0)else:src.append(img)lables.append(0)
#YiYangQianXi
for i in range(0,6):img = cv2.imread(strSource + "\\unified\\YYQX_" + str(i+1) + ".jpg",cv2.IMREAD_GRAYSCALE)if img is None:print("Fail to read images")sys.exit(0)else:src.append(img)lables.append(1)
names = {"0":"LiYiFeng","1":"YiYangQianXi"}#train recognizer
recognizer_eigenface.train(src,np.array(lables))
recognizer_fisher.train(src, np.array(lables))
recognizer_LBPH.train(src, np.array(lables))
  1. 识别
for i in range(7,10):img = cv2.imread(strSource + "\\unified\\LYF_" + str(i) + '.jpg',cv2.IMREAD_GRAYSCALE)print("LYF %d : "%i)lable, confidence = recognizer_eigenface.predict(img)print("predicted by Eigenface: %s, confidence is: %d"%(names[str(lable)],confidence))lable, confidence = recognizer_fisher.predict(img)print("predicted by Fisher: %s, confidence is: %d"%(names[str(lable)],confidence))lable, confidence = recognizer_LBPH.predict(img)print("predicted by LBPH: %s, confidence is: %d"%(names[str(lable)],confidence))print("\n\n")for i in range(7,10):img = cv2.imread(strSource + "\\unified\\YYQX_" + str(i) + '.jpg',cv2.IMREAD_GRAYSCALE)print("YYQX %d : "%i)lable, confidence = recognizer_eigenface.predict(img)print("predicted by Eigenface: %s, confidence is: %d"%(names[str(lable)],confidence))lable, confidence = recognizer_fisher.predict(img)print("predicted by Fisher: %s, confidence is: %d"%(names[str(lable)],confidence))lable, confidence = recognizer_LBPH.predict(img)print("predicted by LBPH: %s, confidence is: %d"%(names[str(lable)],confidence))
  1. 以上可以合并为一个函数,方便换人试验:
def trainAndPredict(strSource, strName1, strName2):# prepare training datasetsrc = list()lables = list()for i in range(0,6):img = cv2.imread(strSource + "\\unified\\" + strName1 + '_' + str(i+1) + ".jpg",cv2.IMREAD_GRAYSCALE)if img is None:print("Fail to read images")sys.exit(0)else:src.append(img)lables.append(0)for i in range(0,6):img = cv2.imread(strSource + "\\unified\\" + strName2 + '_' +  str(i+1) + ".jpg",cv2.IMREAD_GRAYSCALE)if img is None:print("Fail to read images")sys.exit(0)else:src.append(img)lables.append(1)              names = {"0":strName1,"1":strName2}#set up creatorrecognizer_eigenface = cv2.face.EigenFaceRecognizer_create()recognizer_fisher = cv2.face.FisherFaceRecognizer_create()recognizer_LBPH = cv2.face.LBPHFaceRecognizer_create()#train recognizerrecognizer_eigenface.train(src,np.array(lables))recognizer_fisher.train(src, np.array(lables))recognizer_LBPH.train(src, np.array(lables))for i in range(7,10):img = cv2.imread(strSource + "\\unified\\" + strName1 + '_' +  str(i) + '.jpg',cv2.IMREAD_GRAYSCALE)print("%s %d : "%(strName1,i))lable, confidence = recognizer_eigenface.predict(img)print("predicted by Eigenface: %s, confidence is: %d"%(names[str(lable)],confidence))lable, confidence = recognizer_fisher.predict(img)print("predicted by Fisher: %s, confidence is: %d"%(names[str(lable)],confidence))lable, confidence = recognizer_LBPH.predict(img)print("predicted by LBPH: %s, confidence is: %d"%(names[str(lable)],confidence))print("\n\n")for i in range(7,10):img = cv2.imread(strSource + "\\unified\\" + strName2 + '_' +  str(i) + '.jpg',cv2.IMREAD_GRAYSCALE)print("%s %d : "%(strName2,i))lable, confidence = recognizer_eigenface.predict(img)print("predicted by Eigenface: %s, confidence is: %d"%(names[str(lable)],confidence))lable, confidence = recognizer_fisher.predict(img)print("predicted by Fisher: %s, confidence is: %d"%(names[str(lable)],confidence))lable, confidence = recognizer_LBPH.predict(img)print("predicted by LBPH: %s, confidence is: %d"%(names[str(lable)],confidence))#strSource = r'C:\Waley\Personal\Learning\Python\Image\TryFaceIdentify'
#strName1 = 'LYF'
#strName2 = 'YYQX'strSource = r'C:\Waley\Personal\Learning\Python\Image\FaceIdentify'
strName1 = 'LiBingbing'
strName2 = 'YangMi'
trainAndPredict(strSource, strName1, strName2)
  1. 结果让人意外
    对于两位男明星,简直没有任何识别率。

    这两位明星都不太熟悉,会不会是网站也是AI标的,标错了呢?哈哈。

换了两位女明星试验,效果似乎还行:

三、意外的发现

  • 发现这张图片opencv 检测不出来脸部,正面侧面都不行。等继续研究为什么。
  • 发现这张图片opencv识别出来的脸部是错误的

    识别出来的脸是肘部,

原因待进一步研究。

四、结论

将opencv 的人脸识别用于生产环境估计是不行的。下一步准备用同样的这些图片训练下TensorFlow试试

用opencv的人脸识别来分辨明星似乎不太灵光相关推荐

  1. 怎样使用OpenCV进行人脸识别

    不断维护的地址:http://plzcoding.com/face-recognition-with-opencv/ 怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Re ...

  2. Java使用OpenCV实现人脸识别

    通过OpenCV实现人脸识别,包括图片,视频,摄像头中人脸识别. 首先看一下效果(在网上随便找的一张图片): 下面开始说一下如何实现的: 第一步:  需要安装OpenCV 下载链接:https://o ...

  3. python使用opencv实现人脸识别系统

    1.首先安装过python环境,在这里就不过说    检测是否安装成功如下,在cmd中输入Python     2.安装numpy 现在开始安装numpy,打开cmd,输入pip install nu ...

  4. 基于OpenCV实现人脸识别--Python

    目录 前言 第一章 OpenCV介绍 第二章 功能描述 2.1 对已有的数据进行检测 2.2 陌生人检测并发出警告 2.3 保存陌生人的视频 2.4 输入图片进行检测 2.5 现场录用信息 第三章 功 ...

  5. java调起本地摄像头,利用openCV进行人脸识别(一)

    嗨咯,又好久没有更新了.今天写个前阵子做的人脸识别程序.该程序客户端基于Jave JFrame 客户端的主要作用是,调用电脑的摄像头(我的直接调用笔记本摄像头),然后回显摄像头录取的信息,再利用ope ...

  6. python视频图片识别算法_python利用Opencv进行人脸识别(视频流+图片)

    首先:需要在在自己本地安装opencv具体步骤可以问度娘 如果从事于开发中的话建议用第三方的人脸识别(推荐阿里) 1.视频流中进行人脸识别 # -*- coding: utf-8 -*- import ...

  7. opencv + face_recognition —— 人脸识别案例

    文章目录 opencv + face_recognition -- 人脸识别案例 0. 版本信息 1. 导包 2. 识别图片中的面部 3. 实现摄像头中的面部追踪 4. 人脸追踪+识别,分析出不同的人 ...

  8. 树莓派与OpenCV实现人脸识别(OpenCV安装篇)

    主要看了以下两位博客的文章完成的,也遇到了不少的坑,在这里一一填补说明. 链接: https://blog.csdn.net/weixin_42163073/article/details/10730 ...

  9. 使用OpenCV进行人脸识别的三种算法(官方网翻译)

    怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Reconition with OpenCV这节内容(http://docs.opencv.org/modules/con ...

最新文章

  1. 聊聊linux查看服务和端口状态命令netstat
  2. ios 圆形旋转菜单_iOS高级动画:圆形树展开收起动画
  3. saas 困难_将不可信的Javascript作为SaaS运行非常困难。 这就是我驯服恶魔的方式。...
  4. 聚合矩阵+中心化处理
  5. linux换硬盘网卡不能启动,服务器硬盘冷迁移后网卡无法启动问题
  6. ubuntu查看本地ip
  7. 5G+AIoT“零碳”解决方案 | 模组助力“4S” 融合的新一代智能汽车驶入快车道
  8. 黑马程序员-银行业务调度系统
  9. PS去掉图片上的文字的6种基本方法
  10. 鼓励别人谈论他们自己
  11. K1-K4分组控制LED
  12. java clh_【Java并发编程实战】—– AQS(四):CLH同步队列
  13. 2022年3000元电脑最强组装 组装电脑配置推荐3000元左右
  14. Wireshark网络安全之传输层安全-UDP泛洪(UDP Flood)
  15. Soot -- Soot中的一些语句细节
  16. linux命令之------Cat命令
  17. OpenGL实现图片边缘暗角效果(1)
  18. NRF905无线通讯小车
  19. 预测|2019软件测试职业发展趋势,附BAT、TMD入职指南!
  20. Windows下QT界面简单提供电子时间表

热门文章

  1. repo init 与 repo sync 区别
  2. 对不起!我来晚了!——《Android群英传》出版祭
  3. 华为发布新一代5G网络解决方案,加速5G生态发展
  4. MVG(second)读书笔记-2D射影几何和变换
  5. php用什么打开_我的php文件怎么打开_如何打开php文件的办法
  6. Spring入门——SpringBoot(春季靴???)
  7. 腾讯广告算法大赛冠军、Kaggle Grandmaster倾力打造,涵盖Kaggle、阿里天池等赛题...
  8. Codeforces 912 D. Fishes (贪心、bfs)
  9. Kafka 中 AR、ISR、OSR 是什么?ISR 的伸缩性什么?
  10. Vue动态面包屑功能的实现方法