环境问题
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("未检测到人脸")

4406

被折叠的 条评论
为什么被折叠?



