python 人脸检测与人脸识别

python 复制代码
'''
安装库文件: pip install dlib face_recognition
'''

import dlib
import face_recognition
import cv2
from PIL import Image, ImageDraw

# 判断运行环境 cpu or gpu
def check_env():
    print(dlib.DLIB_USE_CUDA)
    print(dlib.cuda.get_num_devices())

# 判断人脸在图片当中的位置
def get_face_location(image_flle):
    image_fr = face_recognition.load_image_file(image_flle)
    face_locations = face_recognition.face_locations(image_fr)
    print(face_locations)

    # 标记人脸的位置
    image_cv = cv2.imread(image_flle)
    for location in face_locations:
        y0, x1, y1, x0 = location
        cv2.rectangle(image_cv,(x0,y0),(x1,y1),(0,0,255),4)
    cv2.imwrite(image_flle + '.new_image.jpg', image_cv)

    return face_locations


# 提取人脸画面保存到本地
def extract_face(image_file):
    image_cv = cv2.imread(image_file)
    face_recognitions = get_face_location(image_file)
    for i, location in enumerate(face_recognitions):
        y0,x1,y1,x0 = location
        face_image = image_cv[y0:y1,x0:x1]
        cv2.imwrite(f"{image_file}.face_{i}.jpg",face_image)


# 把人脸信息编码为一个128维的向量
def encode_face(image_file):
    image_fr = face_recognition.load_image_file(image_file)
    face_recognitions = face_recognition.face_locations(image_fr)
    face_encodings = face_recognition.face_encodings(image_fr,face_recognitions)
    return face_encodings[0]
    
# 判断2个人脸是否为同一个人
def compare_face(image_file1, image_file2):
    face_encoding1 = encode_face(image_file1)
    face_encoding2 = encode_face(image_file2)
    ret = face_recognition.compare_faces([face_encoding1],face_encoding2)
    return ret

# 标记人脸局部和标识
def mark_face(image_file):
    image_fr = face_recognition.load_image_file(image_file)
    face_marks = face_recognition.face_landmarks(image_fr)
    
    image_pil = Image.fromarray(image_fr)
    image_draw = ImageDraw.Draw(image_pil)
    for face_mark in face_marks:
        for facial_feature in face_mark.keys():
            image_draw.line(face_mark[facial_feature],width=5)
    image_pil.save(f"{image_file}_face_mark.jpg")


# 人脸补扮
def beautify_face(image_file):
    image_fr = face_recognition.load_image_file(image_file)
    face_marks = face_recognition.face_landmarks(image_fr)
    image_pil = Image.fromarray(image_fr)
    for i, face_mark in enumerate(face_marks):
        image_draw = ImageDraw.Draw(image_pil)
        # 眉毛
        image_draw.polygon(face_mark['left_eyebrow'],fill=(68,54,39,128))
        image_draw.polygon(face_mark['right_eyebrow'],fill=(68,54,39,128))
        image_draw.line(face_mark['left_eyebrow'],fill=(68,54,39,150),width=2)
        image_draw.line(face_mark['right_eyebrow'],fill=(68,54,39,150),width=2)
        # 嘴唇
        image_draw.polygon(face_mark['top_lip'],fill=(150,0,0,60))
        image_draw.polygon(face_mark['bottom_lip'],fill=(150,0,0,60))
        image_draw.line(face_mark['top_lip'],fill=(150,0,0,20),width=2)
        image_draw.line(face_mark['bottom_lip'],fill=(150,0,0,20),width=2)
        # 眼睛
        image_draw.polygon(face_mark['left_eye'],fill=(255,255,255,20))
        image_draw.polygon(face_mark['right_eye'],fill=(255,255,255,20))
        image_draw.line(face_mark['left_eye'] + [face_mark['left_eye'][0]],fill=(0,0,0,50),width=2)
        image_draw.line(face_mark['right_eye'] + [face_mark['right_eye'][0]],fill=(0,0,0,50),width=2)

    image_pil.save(f"{image_file}.beautify_face.png")


def main():
    check_env()

    face_locations = get_face_location('1.webp')
    print(face_locations)

    extract_face('3.jpg')

    face_encodings = encode_face('1.webp.face_0.jpg')
    print(face_encodings)

    ret = compare_face('1.webp.face_1.jpg','3.jpg.face_1.jpg')
    print(ret)

    mark_face('1.webp')

    beautify_face('1.webp')


if __name__=="__main__":
    main()
相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
神奇霸王龙4 小时前
GB/T 46886 闭环屠夫:5 旗舰多模态 LLM 工业质检实测
人工智能·计算机视觉·ai·开源·ai编程·本地部署
二十雨辰4 小时前
[爬虫]-Urllib
爬虫·python
玉鸯6 小时前
Agent Hook:在概率推理之上,为 Agent 叠加确定性控制
python·langchain·agent
weixin_446260857 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
我的xiaodoujiao7 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
qetfw7 小时前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
用户8356290780518 小时前
Python 实现 Excel 页面布局与打印设置自动化
后端·python