• 基于dlib进行人脸识别demo


    环境准备:win10,python3.9,cv2,numpy,dlib

    项目所要达到的目的:

    实现人脸识别(输入几张图片,人脸检测、关键点检测、人脸关键点进行编码存储起来,再传进来一张图片,判断新传来来这张图片属于哪一个人)

    如果dlib安装不成功请参考我前面的文章

    原理:

     

    主体采用Resnet生成一个128D的特征向量,resnet是采用34层的(resnet34)。

    但由于resnet34最后一层神经网络里实际上有1000个神经元,所以dlib在后面加了Dense(128),所以生成的是128维度的向量

     

    生成128D编码模型:dlib_face_recognition_resnet_model_v1.dat

    下载地址:https://github.com/davisking/dlib-models

    关键点监测模型:shape_predictor_68_face_landmarks.dat

    下载地址:http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

    分别准备4张刘亦菲小头像和一张陈乔恩小头像

     

    过程描述:分别获取陈乔恩和刘亦菲的头像128d编码,然后和测试照片刘亦菲计算欧氏距离,欧氏距离越小,意味着图片的相似度就越高,然后拿着刘亦菲图片测试。 

    基本准本就绪,那就开始吧:

    1. # 1、导入库
    2. import cv2
    3. import dlib
    4. import numpy as np
    5. from PIL import Image, ImageDraw, ImageFont
    6. # 2、定义:关键点编码为128D维度,upsample下采样,jet是拉伸都设置为1
    7. def encoder_face(image, detector, predictor, encoder, upsample=1, jet=1):
    8. # 检测人脸
    9. faces = detector(image, upsample)
    10. # 对每张人脸进行关键点检测,列表推导
    11. # BGR图片转换为灰度图
    12. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    13. face_keypoints = [predictor(image, face) for face in faces] # 每张脸的关键点
    14. # 返回每个关键点的128维向量
    15. return [np.array(encoder.compute_face_descriptor(image, face_keypoint, jet)) for face_keypoint in face_keypoints]
    16. # 3、定义:人脸比较,通过欧氏距离比较
    17. def compare_faces(face_encoding, test_encoding):
    18. return list(np.linalg.norm(np.array(face_encoding) - np.array(test_encoding), axis=1)) # 计算俩个向量的欧氏距离,1表示按照行向量处理
    19. # 4、定义:比较之后,写出对应图片的名称
    20. def compare_faces_order(face_encoding, test_encoding, names):
    21. distance = list(np.linalg.norm(np.array(face_encoding) - np.array(test_encoding), axis=1))
    22. return zip(*sorted(zip(distance, names))) # 逆序输出
    23. #解决opencv显示中文乱码
    24. def main():
    25. # 2、读取4张图片
    26. img1 = cv2.imread("../images/liuyifei1.jpg")
    27. img2 = cv2.imread("../images/liuyifei2.jpg")
    28. img3 = cv2.imread("../images/liuyifei3.jpg")
    29. img4 = cv2.imread("../images/chenqiaoen.jpg")
    30. test = cv2.imread("../images/liuyifei.jpg")
    31. # BGR转换成RGB(通道转换)
    32. # img1 = img1[:, :, ::-1]
    33. # img2 = img2[:, :, ::-1]
    34. # img3 = img3[:, :, ::-1]
    35. # img4 = img4[:, :, ::-1]
    36. # test = test[:, :, ::-1]
    37. image_name = ["刘亦菲1", "刘亦菲2", "刘亦菲3", "陈乔恩0"]
    38. add_name = ["../images/liuyifei1.jpg","../images/liuyifei2.jpg","../images/liuyifei3.jpg","../images/chenqiaoen.jpg"]
    39. # 3、加载人脸检测器
    40. detector = dlib.get_frontal_face_detector()
    41. # 4、加载关键点的检测器
    42. predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
    43. # 5、加载人脸特征编码模型
    44. encoder = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")
    45. # 6、调用编码方法:128维特征向量输出,[0]表示只取第一张人脸,可能存在很多张人脸
    46. # 注意这里一定要传入BGR的图片
    47. img1_128D = encoder_face(img1, detector, predictor, encoder)[0]
    48. img2_128D = encoder_face(img2, detector, predictor, encoder)[0]
    49. img3_128D = encoder_face(img3, detector, predictor, encoder)[0]
    50. img4_128D = encoder_face(img4, detector, predictor, encoder)[0]
    51. test_128D = encoder_face(test, detector, predictor, encoder)[0]
    52. # 四张图片放到一起
    53. four_images_128D = [img1_128D, img2_128D, img3_128D, img4_128D]
    54. # 7、调用方法:比较人脸,计算特征项之间的距离,判断是否为同一个人,测试一下
    55. distance = compare_faces(four_images_128D, test_128D)
    56. print(distance)
    57. # 输出对应的名字(返回一个距离对应一个名字)
    58. distance, name = compare_faces_order(four_images_128D, test_128D, image_name)
    59. print("\n")
    60. print("distance:{},\n names:{}".format(distance, name))
    61. #找出最小值以及最小值对应下表
    62. min_value = min(distance)
    63. index_value = distance.index(min_value)
    64. print(min_value)
    65. print(index_value)
    66. value_img=name[index_value]#名字集合对应的名字下
    67. index_name=image_name.index(value_img)
    68. add = add_name[index_name] #获取图片的地址
    69. #加载图片显示图片
    70. result_face = cv2.imread(add)
    71. #再次检测人脸
    72. face = detector(result_face,1)[0]
    73. cv2.rectangle(result_face,(face.left(),face.top()),(face.right(),face.bottom()),(0,188,0),5)
    74. gbk_title = value_img.encode("gbk").decode(errors="ignore")
    75. #绘制半透明的边框
    76. blk = np.zeros(result_face.shape, np.uint8)
    77. pis = cv2.rectangle(blk, (40, 40), (300, 400), (255, 0, 0), -1) # 注意在 blk的基础上进行绘制;
    78. cv2.putText(pis,"name:liuyifei",(50,80),cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.0,(0,255,0),1)
    79. cv2.putText(pis,"sex:female",(50,120),cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.0,(0,255,0),1)
    80. cv2.putText(pis,"age:34",(50,160),cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.0,(0,255,0),1)
    81. cv2.putText(pis,"love:dance@swim@player",(50,200),cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.0,(0,255,0),1)
    82. cv2.putText(pis,"healthy:good",(50,240),cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.0,(0,255,0),1)
    83. cv2.putText(pis,"temperature:36.5",(50,280),cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.0,(0,255,0),1)
    84. cv2.putText(pis,"presure:124/78",(50,320),cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.0,(0,255,0),1)
    85. picture = cv2.addWeighted(result_face, 1.0, blk, 0.5, 1)
    86. cv2.imshow(gbk_title,picture)
    87. cv2.waitKey(0)
    88. if __name__ == "__main__":
    89. main()

    数据结果:

    F:\开发工具\pythonProject\Dlib\venv\Scripts\python.exe F:/开发工具/pythonProject/Dlib/face_recognition_dlib/face_rg_dlib_show.py
    [0.3456185279221268, 0.3770550639977901, 0.3562150489993451, 0.5097962418015457]


    distance:(0.3456185279221268, 0.3562150489993451, 0.3770550639977901, 0.5097962418015457),
     names:('刘亦菲1', '刘亦菲3', '刘亦菲2', '陈乔恩0')

    测试结果:系统准确的识别出来,这张照片是刘亦菲。

     

  • 相关阅读:
    微服务集成redis并通过redis实现排行榜的功能
    AI「鸟口普查」,康奈尔大学利用深度学习分析北美林莺分布
    vscode 配置网址
    树莓派学习笔记(一)
    Windows 允许 Ping 请求
    【Python机器学习】零基础掌握QuadraticDiscriminantAnalysis判别分析
    CAS:1445723-73-8 DSPE-PEG-NHS 磷脂-聚乙二醇-活性酯常用活性磷脂之一
    React之组件实例的三大属性之rel
    Ubuntu本地快速搭建web小游戏网站,公网用户远程访问【内网穿透】
    【C++】map和set的封装
  • 原文地址:https://blog.csdn.net/chehec2010/article/details/126895423