python --insightface人脸识别

环境问题

python: 3.10.3

insightface==0.7.3
numpy==1.24.4
opencv-python==4.11.0.86

模型下载地址

通过网盘分享的文件:models.zip
链接: https://pan.baidu.com/s/1RNIw6KI5iL2FngJGUldjLQ 提取码: 1111

linux : pip install insightface 直接安装目前无错误

windows遇到错误:
在这里插入图片描述
把这个安装上 就可以正常安装了
在这里插入图片描述

人脸检测

import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image

app = FaceAnalysis(
    name='buffalo_l',
    root=r'./models/renlian',
    providers=['CPUExecutionProvider'])

app.prepare(ctx_id=0, det_size=(1024, 1024))
img = cv2.imread(r"C:\Users\123\Desktop\12.png")

faces = app.get(img)
rimg = app.draw_on(img, faces) # 可视化


if faces:  # 若检测到人脸
    first_face = faces[0]  # 获取第一张人脸
    print("人脸信息:")
    print(f"边界框:{first_face.bbox.astype(int)}")  # 转换为整数坐标
    print(f"关键点:{first_face.kps.astype(int)}")
    print(f"检测置信度:{first_face.det_score:.2f}")
    print(f"性别(0=女,1=男):{first_face.gender}")
    print(f"预测年龄:{first_face.age}岁")
    print(f"特征向量长度:{len(first_face.embedding)}")  # 如512
    print("人脸姿态(yaw, pitch, roll):", first_face.pose) # yaw(偏航角):左右旋转(-90°~90°,正值为右转,负值为左转);  pitch(俯仰角):上下旋转(-90°~90°,正值为抬头,负值为低头); roll(翻滚角):平面旋转(-90°~90°,正值为向右倾斜,负值为向左倾斜)。
    print("2D 106点关键点数量:", len(first_face.landmark_2d_106))  # 106
    print("3D 68点关键点数量:", len(first_face.landmark_3d_68))    # 68



cv2.imshow('', rimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

自定义画关键点信息

import cv2
import numpy as np
from insightface.app import FaceAnalysis

# 初始化人脸分析工具
app = FaceAnalysis(
    name='buffalo_l',
    root=r'./models/renlian',
    providers=['CPUExecutionProvider']
)
app.prepare(ctx_id=-1, det_size=(1024, 1024))  # 使用CPU

# 读取图片
img_path = r"C:\Users\123\Desktop\12.png"
img = cv2.imread(img_path)
if img is None:
    print(f"无法读取图片:{img_path}")
else:
    # 复制原图用于绘制(避免修改原图)
    rimg = img.copy()
    faces = app.get(img)

    if faces:
        for i, face in enumerate(faces):
            # --------------------------
            # 1. 绘制人脸边界框(蓝色)
            # --------------------------
            bbox = face.bbox.astype(int)
            x1, y1, x2, y2 = bbox
            cv2.rectangle(rimg, (x1, y1), (x2, y2), (255, 0, 0), 2)  # 蓝色矩形框

            # 在框上方标注人脸ID
            cv2.putText(
                rimg, f"Face {i+1}", (x1, y1-10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2
            )

            # --------------------------
            # 2. 绘制5点基础关键点(红色)
            # --------------------------
            for (x, y) in face.kps.astype(int):
                cv2.circle(rimg, (x, y), 3, (0, 0, 255), -1)  # 红色实心圆

            # --------------------------
            # 3. 绘制2D 106点关键点(绿色,更密集)
            # --------------------------
            for (x, y) in face.landmark_2d_106.astype(int):
                cv2.circle(rimg, (x, y), 2, (0, 255, 0), -1)  # 绿色小圆点

            # --------------------------
            # 4. 绘制3D 68点关键点(紫色,带深度示意)
            # --------------------------
            # 为了区分3D点,用稍大的紫色点并标注序号(选前10个示例,避免过于密集)
            for idx, (x, y, z) in enumerate(face.landmark_3d_68.astype(int)):
                if idx < 10:  # 只标前10个,否则画面太乱
                    cv2.circle(rimg, (x, y), 4, (255, 0, 255), -1)  # 紫色点
                    cv2.putText(
                        rimg, f"{idx}", (x+5, y),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.3, (255, 0, 255), 1
                    )

            # --------------------------
            # 5. 标注其他信息(性别、年龄、姿态等)
            # --------------------------
            info = [
                f"Score: {face.det_score:.2f}",
                f"Gender: {'Female' if face.gender == 0 else 'Male'}",
                f"Age: {face.age}",
                f"Pose: yaw={face.pose[0]:.1f}, pitch={face.pose[1]:.1f}, roll={face.pose[2]:.1f}"
            ]
            # 在人脸框右侧依次绘制信息
            for j, text in enumerate(info):
                y_pos = y1 + 20 + j * 20
                cv2.putText(
                    rimg, text, (x2 + 10, y_pos),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 255), 1
                )

        # 保存标注后的图片
        output_path = "labeled_face.jpg"
        cv2.imwrite(output_path, rimg)
        print(f"标注完成,结果已保存至:{output_path}")
    else:
        print("未检测到人脸")

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值