face_recognition人脸识别模块的使用教程

31 篇文章 3 订阅

face_recognition人脸识别模块的使用教程

文章目录:


为什么要用这个,当然是简单快捷,封装API易于使用,准确率还行,还开源,当然是不二之选啦


一、face_recognition模块介绍

  1. face_recognition基于dlib实现,用深度学习训练数据,模型准确率高达99.38%
  2. github项目地址:https://github.com/ageitgey/face_recognition

二、face_recognition模块的使用和案例介绍

  • 脸部位置检测
  • 脸部关键点检测
  • 脸部识别
  • 网络摄像头中采集到的人脸进行高斯模糊处理
  • 美妆(其实不美)
__Author__ = 'Shliang'

from PIL import Image
import face_recognition

from PIL import Image, ImageDraw


img = r"E:\MagicP\8_neural-style-transfer\StyleTransferCode\FaceRecognition\people.png"
img2 = r"E:\MagicP\8_neural-style-transfer\StyleTransferCode\FaceRecognition\girl.jpg"


image = face_recognition.load_image_file(img)
image2 = face_recognition.load_image_file(img2)

def detection_face_locations(image):
    """
    检测人脸的位置, 当然可以通过判断len(face_locations)的长度来判断有没有检测到人脸,如果长度为0,则没有检测到人脸
    :param image:
    :return: 返回的是每一个人脸的矩形的四个角的坐标位置的列表
    """
    face_locations = face_recognition.face_locations(image)  # model="cnn"

    print("I found {} face(s) in this photograph.".format(len(face_locations)))

    for face_location in face_locations:

        # 打印每一张脸在图片中的位置
        top, right, bottom, left = face_location
        print("A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))

        # 显示图片中每一张脸
        face_image = image[top:bottom, left:right]
        pil_image = Image.fromarray(face_image)
        pil_image.show()

    return face_locations


def detection_face_locations_gpu(image):
    """

   检测人脸的位置,但是会条用GPU资源,默认的模式 model=hog
    :param image:
    :return: 返回的是每一个人脸的矩形的四个角的坐标位置的列表
    """

    face_locations = face_recognition.face_locations(image, number_of_times_to_upsample=0, model="cnn")

    print("I found {} face(s) in this photograph.".format(len(face_locations)))  # 检测到的脸部的个数

    for face_location in face_locations:
        # Print the location of each face in this image
        top, right, bottom, left = face_location
        print("A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom,
                                                                                                    right))

        # You can access the actual face itself like this:
        face_image = image[top:bottom, left:right]
        pil_image = Image.fromarray(face_image)
        pil_image.show()
    return face_locations


def detectiion_face_landmarks(image):
    """
    检测人脸的关键点
     'chin':下巴 17
     'left_eyebrow':左眉毛 5
     'right_eyebrow':右眉毛 5
     'nose_bridge':鼻梁 4
     'nose_tip':鼻尖 5
    'left_eye':左眼 6
    'right_eye':右眼 6
    'top_lip':上嘴唇 12
    'bottom_lip:下嘴唇 12

    一共72 个关键点

    :param image:
    :return:  返回值是人脸的关键点
    """
    face_landmarks_list = face_recognition.face_landmarks(image)

    print("I found {} face(s) in this photograph.".format(len(face_landmarks_list)))

    # 创建一个 PIL imagedraw 对象,然后在图片中画出人脸
    pil_image = Image.fromarray(image)
    d = ImageDraw.Draw(pil_image)

    for face_landmarks in face_landmarks_list:

        # 打印人脸每一个部位的关键点
        for facial_feature in face_landmarks.keys():
            print("The {0} points_num:{2} in this face has the following points: {1} ".format(facial_feature,
                                                                            face_landmarks[facial_feature],
                                                                            len(face_landmarks[facial_feature],
                                                                            )))

        # 把脸部特征位置的关键点用线连接起来
        for facial_feature in face_landmarks.keys():
            d.line(face_landmarks[facial_feature], width=5)

    # Show the picture
    pil_image.show()

    return face_landmarks_list


def face_recognition_in_picture(image):
    """
    识别图片中的人脸是谁,就是人脸对比的过程
    :param image:
    :return:
    """
    import face_recognition

    # 加载要判别的图片
    biden_image = face_recognition.load_image_file("biden.jpg")
    obama_image = face_recognition.load_image_file("obama.jpg")
    unknown_image = face_recognition.load_image_file("obama2.jpg")

    # 获取在每张图片中人脸的编码
    # 由于一张图片中可能有多张人脸,因此返回的是一个编码的列表
    # 但是当我知道每个图像只有一个面,所以我只关心每个图像中的第一个编码,所以我抓取索引0
    try:
        biden_face_encoding = face_recognition.face_encodings(biden_image)[0]
        obama_face_encoding = face_recognition.face_encodings(obama_image)[0]
        unknown_face_encoding = face_recognition.face_encodings(unknown_image)[0]
    except IndexError:
        print("I wasn't able to locate any faces in at least one of the images. Check the image files. Aborting...")
        quit()

    # 对已知脸部进行编码
    known_faces = [
        biden_face_encoding,
        obama_face_encoding
    ]

    # 结果是一个True/False数组,用于判断未知的脸是否匹配known_faces数组中的任何人
    results = face_recognition.compare_faces(known_faces, unknown_face_encoding)

    print("Is the unknown face a picture of Biden? {}".format(results[0]))
    print("Is the unknown face a picture of Obama? {}".format(results[1]))
    print("Is the unknown face a new person that we've never seen before? {}".format(not True in results))






def webcam_face_gauss_blur():
    """
    把网络摄像头中采集到的人脸进行高斯模糊处理
    :return:
    """
    import face_recognition
    import cv2

    # This is a demo of blurring faces in video.

    # PLEASE NOTE: This example requires OpenCV (the `cv2` library) to be installed only to read from your webcam.
    # OpenCV is *not* required to use the face_recognition library. It's only required if you want to run this
    # specific demo. If you have trouble installing it, try any of the other demos that don't require it instead.

    # 获取网络摄像头的id,默认是0
    video_capture = cv2.VideoCapture(0)

    # 初始化一些变量
    face_locations = []


    while True:
        # 抓取视频帧
        ret, frame = video_capture.read()

        # 改变视频帧的大小为原来的四分之一,可以提高脸部检测的速度
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

        # 检测当前视频帧所有脸部的位置
        face_locations = face_recognition.face_locations(small_frame, model="cnn")

        # 显示结果
        for top, right, bottom, left in face_locations:
            # 缩放视频帧大小,之前检测进行了缩小的操作
            top *= 4
            right *= 4
            bottom *= 4
            left *= 4

            # 提取图片中包含脸部的区域
            face_image = frame[top:bottom, left:right]

            # 高斯模糊脸部区域
            face_image = cv2.GaussianBlur(face_image, (99, 99), 30)   # 30是x方向上的高斯核标准差  GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

            # 把模糊后的脸部区域放置到视频帧中的ROI
            frame[top:bottom, left:right] = face_image

        # 显示视频帧
        cv2.imshow('Video', frame)

        # 敲击q键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # Release handle to the webcam
    video_capture.release()
    cv2.destroyAllWindows()



def beauty_backup(image):
    """
    通过检测关键点,填充像素值的形式进行美妆,效果当然很差啦
    对图片中的人脸进行美妆操作(数字美妆), 这个美妆太粗糙啦,简直就是如花妆呀
    :param image:
    :return:
    """
    # 找出图片中所有人脸的特征点
    face_landmarks_list = face_recognition.face_landmarks(image)

    for face_landmarks in face_landmarks_list:
        pil_image = Image.fromarray(image)
        d = ImageDraw.Draw(pil_image, 'RGBA')

        # Make the eyebrows into a nightmare
        d.polygon(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 128))
        d.polygon(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 128))
        d.line(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 150), width=5)
        d.line(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 150), width=5)

        # Gloss the lips
        d.polygon(face_landmarks['top_lip'], fill=(150, 0, 0, 128))
        d.polygon(face_landmarks['bottom_lip'], fill=(150, 0, 0, 128))
        d.line(face_landmarks['top_lip'], fill=(150, 0, 0, 64), width=8)
        d.line(face_landmarks['bottom_lip'], fill=(150, 0, 0, 64), width=8)

        # Sparkle the eyes
        d.polygon(face_landmarks['left_eye'], fill=(255, 255, 255, 30))
        d.polygon(face_landmarks['right_eye'], fill=(255, 255, 255, 30))

        # Apply some eyeliner
        d.line(face_landmarks['left_eye'] + [face_landmarks['left_eye'][0]], fill=(0, 0, 0, 110), width=6)
        d.line(face_landmarks['right_eye'] + [face_landmarks['right_eye'][0]], fill=(0, 0, 0, 110), width=6)

        pil_image.show()

if __name__ == "__main__":
    # 人脸位置检测
    # faces_locate = detection_face_locations(image)
    # print(faces_locate)  # [(164, 273, 216, 222), (199, 222, 251, 170), (182, 556, 234, 504), (216, 452, 268, 400), (141, 429, 193, 377), (199, 371, 242, 328)]

    # 人脸位置检测用cnn模式(GPU)    测试在多人下没有检测到人脸,但是在单人下检测到了人脸
    # face_locate = detection_face_locations_gpu(image2)
    # print(face_locate)  # [(78, 296, 215, 159)]

    # 检测人脸的关键点
    # face_landmarks_list = detectiion_face_landmarks(image2)
    # print(face_landmarks_list)
    '''
    
    [{'chin': [(179, 154), (184, 167), (190, 179), (197, 190), (206, 199), (216, 207), (227, 214), (239, 219), (251, 218), (262, 213), (270, 203), (277, 191), (281, 177), (284, 164), (283, 149), (281, 134), (277, 119)],
     'left_eyebrow': [(180, 139), (184, 131), (192, 126), (201, 124), (210, 125)], 
     'right_eyebrow': [(230, 119), (238, 112), (247, 108), (257, 108), (266, 111)], 
     'nose_bridge': [(224, 135), (227, 145), (229, 155), (232, 166)], 
     'nose_tip': [(225, 174), (230, 174), (236, 174), (240, 171), (245, 168)],
    'left_eye': [(193, 146), (197, 140), (204, 138), (212, 142), (206, 146), (199, 148)],
    'right_eye': [(241, 133), (246, 126), (253, 123), (259, 125), (255, 130), (248, 132)], 
    'top_lip': [(224, 193), (228, 187), (233, 182), (238, 182), (243, 180), (250, 180), (257, 183), (255, 184), (244, 186), (240, 188), (235, 189), (227, 192)],
    'bottom_lip': [(257, 183), (253, 190), (248, 195), (243, 197), (238, 198), (231, 197), (224, 193), (227, 192), (236, 190), (241, 189), (245, 188), (255, 184)]}]
    '''

    #  把来自网络摄像头视频里的人脸高斯模糊(需要安装OpenCV)
    # webcam_face_gauss_blur()

    # 美妆
    beauty_backup(image2)

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

展开阅读全文
  • 3
    点赞
  • 0
    评论
  • 25
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值