python学opencv|读取图像(七十四)人脸识别:EigenFaces算法 ...

打印 上一主题 下一主题

主题 883|帖子 883|积分 2649

【1】引言

前序学习进程中,做的是检测,只是能检测出来由人脸、猫脸和行人,相关文章链接为:
python学opencv|读取图像(七十一)使用cv2.CascadeClassifier()函数+detectMultiScale()函数实现图像中的人脸检测-CSDN博客
python学opencv|读取图像(七十二)猫脸检测:使用cv2.CascadeClassifier()函数+detectMultiScale()函数实现图像中的猫脸检测-CSDN博客
python学opencv|读取图像(七十三)行人检测:使用cv2.CascadeClassifier()函数+detectMultiScale()函数实现图像中的行人检测-CSDN博客
更进一步,如果想在检测出来的人脸上识别出是谁的脸,就要用到人脸识别。
人脸识别的算法有三种,本次学习其中的EigenFaces算法。
【2】原理阐明

人脸识别必要用到不同的算法,把算法理解成识别器。详细操纵的时间,先挑选一种算法,然后使用这种算法举行练习,练习之后再去看识别结果。   
【3】官网教程

首先点击下方链接,直达人脸识别的阐明页官网教程:
OpenCV: Face Recognition with OpenCV
在这里,非常清晰地阐明了当前有三种人脸识别算法:

图1  人脸识别官网阐明

官网页面内容非常丰富,但学习必要抓重要内容,因此只要关注Eigenfaces就可以。
固然,细心的朋侪肯定也发现了,这个页面提供了一些照片集,大家可以自行下载。
继承下拉会看到,关于Eigenfaces给出了背后的算法证实:

图2  Eigenfaces算法证实

现实上,如果不是做研究,这个算法说空也不用太过穷究,由于重要的精力要放在实现好的人脸识别上。
在这个页面之后,给出了C++的案例,就不继承研究这个页面了,请点击下方链接直达新的页面:
OpenCV: cv::face::EigenFaceRecognizer Class Reference
这个新页面给出了在python中怎样通过Eigenfaces算法创建进人脸识别器:

图3  cv.face.EigenFaceRecognizer.create识别器

详细的,cv.face.EigenFaceRecognizer.create识别器有两个参数:
   cv.face.EigenFaceRecognizer.create(    
  num_components              #可选参数,PCA(主成分分析)中保留分量的个数
  threshold  )                        #可选参数,人脸识别的阈值
  创建识别器之后,必要对图像举行练习,所以还要用一个函数cv.face.FaceRecognizer.train()来创建练习器,点击下方链接直达:
OpenCV: cv::face::FaceRecognizer Class Reference

图4   用函数cv.face.FaceRecognizer.train()创建练习器

详细的,cv.face.FaceRecognizer.train()练习器有两个参数:
   cv.face.FaceRecognizer.train( 
  src                    #用来练习的样本图像,要求尺寸巨细一致
  labels )             #样本图像对应的标签
  练习器练习完样本之后,可以使用cv.face.FaceRecognizer.predict()函数对待识别图像举行识别,点击下方链接,直达cv.face.FaceRecognizer.predict()函数的官网页面:
OpenCV: cv::face::FaceRecognizer Class Reference
详细的,cv.face.FaceRecognizer.predict()只有一个参数:
   cv.face.FaceRecognizer.predict(
  src            #待识别图像,要求与练习样本尺寸一致
  )
  cv.face.FaceRecognizer.predict(src)会输出两个结果:
   label:待测图像和样本图像最佳匹配时,对应的样本图像标签值
  confidence:匹设置信度,小于5000认为匹配结果好,0表现完全一样。
  【4】代码测试

此处举行代码测试:
首先是引入必要的模块,界说两个空列表,分别用来存储图像和图像对应的标签:
  1. import cv2 as cv #引入cv2模块
  2. import numpy as np #引入numpy模块
  3. photos = []  #定义photo空列表,用来存储图像
  4. labels = []  #定义lables空列表,用来存储图像对应的标签
复制代码
然后使用了3张图像作为样本来练习,这里要给出样本的存储地址:
  1. # 定义图片路径列表
  2. image_paths = [
  3.     r"D:\python\pythonworkspace\pythonProject3\zyz\01.jpg",
  4.     r"D:\python\pythonworkspace\pythonProject3\zyz\02.jpg",
  5.     r"D:\python\pythonworkspace\pythonProject3\zyz\03.jpg"
  6. ]
复制代码
为了把图像同一尺寸,必要先给定相关尺寸的约束条件:
  1. #定义图像尺寸信息
  2. width=600  #定义一个初始宽度量
  3. height=800  #定义一个初始高度量
  4. target_size = (width,height) #定义一个元组,存储宽度量和高度量
  5. # 读取其余图片并调整尺寸
  6. for path in image_paths[0:]:
  7.     img = cv.imread(path, 0)
  8.     if img is not None:
  9.         # 调整图像尺寸为与第一张图片相同
  10.         img = cv.resize(img, target_size)
  11.         photos.append(img)
  12.         labels.append(0)
  13.     else:
  14.         print(f"无法读取图片: {path}")
复制代码
图像尺寸同一完成之后,必要给这一组图像加一个标签:
  1. #定义标签
  2. names = {"0": "su"}
复制代码
然后创建人脸识别器:
  1. # 创建人脸识别器
  2. recognizer = cv.face.EigenFaceRecognizer.create()
复制代码
然后练习人脸识别器:
  1. # 训练人脸识别器
  2. if photos and labels:
  3.     recognizer.train(photos, np.array(labels)) #训练器读入人脸样本和对应标签
复制代码
之后就是把待测图像拿进来举行测试。
先读取图像:
  1. # 读取测试图片
  2.     test_image_path = r"D:\python\pythonworkspace\pythonProject3\zyz\09.jpg"
  3.     test_img = cv.imread(test_image_path, 0)
复制代码
然后把图像尺寸修改成和样本同一的巨细,之后就可以举行对比识别:
  1.     if test_img is not None:
  2.         # 调整测试图像尺寸与第一张图片一致
  3.         test_img = cv.resize(test_img, target_size)
  4.         label, confidence = recognizer.predict(test_img)
复制代码
对于识别结果,必要按照匹配度再次处置惩罚:
  1. # 设定识别阈值
  2.         threshold = 5000  # 可根据实际情况调整
  3.         if confidence > threshold:
  4.             # 将灰度图转换为彩色图以便添加彩色文字
  5.             test_img_color = cv.cvtColor(test_img, cv.COLOR_GRAY2BGR)
  6.             # 添加未识别标记
  7.             cv.putText(test_img_color, "Unrecognized", (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
  8.             output_img = test_img_color
  9.         else:
  10.             print(f'confidence={confidence}')
  11.             print(names[str(label)])
  12.             # 将灰度图转换为彩色图
  13.             output_img = cv.cvtColor(test_img, cv.COLOR_GRAY2BGR)
复制代码
末了是输出图像:
  1.         # 输出图像
  2.         cv.imshow('Result Image', output_img)
  3.         cv.waitKey(0)
  4.         cv.destroyAllWindows()
  5.     else:
  6.         print(f"无法读取测试图片: {test_image_path}")
复制代码
为了更好地理解,直接给出完整代码:
  1. import cv2 as cv #引入cv2模块
  2. import numpy as np #引入numpy模块
  3. photos = []  #定义photo空列表,用来存储图像
  4. labels = []  #定义lables空列表,用来存储图像对应的标签# 定义图片路径列表
  5. image_paths = [
  6.     r"D:\python\pythonworkspace\pythonProject3\zyz\01.jpg",
  7.     r"D:\python\pythonworkspace\pythonProject3\zyz\02.jpg",
  8.     r"D:\python\pythonworkspace\pythonProject3\zyz\03.jpg"
  9. ]#定义图像尺寸信息
  10. width=600  #定义一个初始宽度量
  11. height=800  #定义一个初始高度量
  12. target_size = (width,height) #定义一个元组,存储宽度量和高度量
  13. # 读取其余图片并调整尺寸
  14. for path in image_paths[0:]:
  15.     img = cv.imread(path, 0)
  16.     if img is not None:
  17.         # 调整图像尺寸为与第一张图片相同
  18.         img = cv.resize(img, target_size)
  19.         photos.append(img)
  20.         labels.append(0)
  21.     else:
  22.         print(f"无法读取图片: {path}")#定义标签
  23. names = {"0": "su"}# 创建人脸识别器
  24. recognizer = cv.face.EigenFaceRecognizer.create()# 训练人脸识别器
  25. if photos and labels:
  26.     recognizer.train(photos, np.array(labels)) #训练器读入人脸样本和对应标签    # 读取测试图片
  27.     test_image_path = r"D:\python\pythonworkspace\pythonProject3\zyz\09.jpg"
  28.     test_img = cv.imread(test_image_path, 0)    if test_img is not None:
  29.         # 调整测试图像尺寸与第一张图片一致
  30.         test_img = cv.resize(test_img, target_size)
  31.         label, confidence = recognizer.predict(test_img)
  32.         # 设定识别阈值
  33.         threshold = 5000  # 可根据实际情况调整
  34.         if confidence > threshold:
  35.             # 将灰度图转换为彩色图以便添加彩色文字
  36.             test_img_color = cv.cvtColor(test_img, cv.COLOR_GRAY2BGR)
  37.             # 添加未识别标记
  38.             cv.putText(test_img_color, "Unrecognized", (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
  39.             output_img = test_img_color
  40.         else:
  41.             print(f'confidence={confidence}')
  42.             print(names[str(label)])
  43.             # 将灰度图转换为彩色图
  44.             output_img = cv.cvtColor(test_img, cv.COLOR_GRAY2BGR)        # 输出图像
  45.         cv.imshow('Result Image', output_img)
  46.         cv.waitKey(0)
  47.         cv.destroyAllWindows()
  48.     else:
  49.         print(f"无法读取测试图片: {test_image_path}")
复制代码
代码运行使用的练习样本均为女明星:

图5  练习样本

使用豆包AI天生的篮球明星举行识别,发现很好辨认出不是一个人:

图6 识别结果

【5】总结

掌握了python+opencv实现通过EigenFaces算法实现人脸识别的技巧。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表