欢迎光临
我们一直在努力

入门实践工程十一:人脸识别门禁系统(基于 face_recognition)~附:安装依赖库及工程源码

🔥 别再死磕枯燥理论了!AI 时代,拿实战作品说话才是硬道理!(原创不易哈,希望可以帮到还有些许学习劲儿的同学们) 🔥 【进阶版还在创作中,耗费精力中……】

跳转到专栏目录,你学习更有方向和思路……

入门实践工程十一:人脸识别门禁系统(基于 face_recognition)~附:安装依赖库及工程源码

简介

基于 face_recognition 库,先对录入人员照片做特征编码入库,再用摄像头或图片识别已知人员并标记姓名,实现简易门禁/考勤 Demo,支持多人脸同时识别,理解「人脸检测→特征编码→余弦相似度匹配」链路。

工程详细介绍

核心思想: 人脸识别 = 检测 + 特征编码 + 比对。先用预训练模型把人脸映射为 128 维嵌入(同一人相近、不同人远离),再把待识别人脸嵌入与入库嵌入做距离比对,最近且过阈即判定身份,是「度量学习」的典型应用。

实现方法:

  • 数据 / 输入: 人员库照片(known_faces/,文件名即人名)+ 待识别图片或摄像头。
  • 模型: face_recognition(基于 dlib 的 ResNet 人脸嵌入模型)。
  • 流程: register 模式把人员照编码入库;识别时对图片做人脸检测 + 编码 → compare_faces 逐个比对待选嵌入(tolerance=0.6)→ 匹配则标名、未知标红;摄像头模式逐帧实时框选;–demo 下载示例数据自动跑通。
  • 输出: 每张人脸身份 + 绿/红框标注图。

目录结构

11_face_recognition/
├── main.py # 录入 / 图片识别 / 摄像头识别主程序
├── requirements.txt
├── known_faces/ # 人员库(文件名即人员名,如 张三.jpg)
└── output/
└── recognized.jpg # 标注结果图

正确安装

face_recognition 依赖 dlib,Windows 上安装较麻烦:

# 需先安装 CMake 和 Visual Studio Build Tools(C++ 桌面开发组件)
pip install cmake
pip install dlib
pip install face_recognition opencv-python

若 dlib 编译失败,可改用 conda:conda install -c conda-forge dlib face_recognition

运行方式

# 一键 Demo:下载示例人物(Obama/Biden)+合照,自动跑通
python main.py –demo

# 录入人员
python main.py –register 张三 path/to/zhangsan.jpg

# 识别图片中的人脸
python main.py –image test.jpg

# 摄像头实时识别(按 q 退出)
python main.py –camera

预期结果

  • 控制台逐张打印识别出的人员名(未知则标「未知人员」)
  • 生成 output/recognized.jpg:绿框(已知)/红框(未知) + 姓名标注

扩展方向

  • 换用 InsightFace / ArcFace 提升精度与速度
  • 增加活体检测(眨眼/转头检测)防照片攻击
  • 接入数据库做考勤打卡记录 + Web 后台

工程源码

main.py

"""
入门实践工程十一:人脸识别门禁系统(基于 face_recognition)
==================================================
流程:对录入人员照片做特征编码入库 -> 摄像头/图片中实时识别已知人员 -> 标记姓名。
支持多人脸同时识别,实现简易门禁/考勤 Demo。

命令:
python main.py –register 张三 person1.jpg # 录入人员(名字 + 照片)
python main.py –image test.jpg # 识别图片中的人脸
python main.py –camera # 摄像头实时识别(按 q 退出)
python main.py –demo # 下载示例人物+合照,自动跑通

人员库保存在 known_faces/ 目录(每张图文件名即人员名)。
"""

import argparse
import os
import sys

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
KNOWN_DIR = os.path.join(BASE_DIR, "known_faces")
OUT_DIR = os.path.join(BASE_DIR, "output")

def register(name: str, image_path: str):
import shutil
os.makedirs(KNOWN_DIR, exist_ok=True)
if not os.path.exists(image_path):
print(f"[错误] 图片不存在: {image_path}")
sys.exit(1)
ext = os.path.splitext(image_path)[1] or ".jpg"
dst = os.path.join(KNOWN_DIR, f"{name}{ext}")
shutil.copy(image_path, dst)
# 验证能检测到人脸
import face_recognition
img = face_recognition.load_image_file(dst)
encs = face_recognition.face_encodings(img)
if not encs:
print(f"[警告] 未在图片中检测到人脸,请更换清晰正面照: {dst}")
return
print(f"已录入人员 [{name}] -> {dst}(检测到 {len(encs)} 张人脸,采用第 1 张)")

def load_known_encodings():
import face_recognition
if not os.path.isdir(KNOWN_DIR) or not os.listdir(KNOWN_DIR):
print("[提示] 人员库为空。请先录入人员:")
print(" python main.py –register 张三 photo.jpg")
print(" 或运行 python main.py –demo 下载示例数据")
return [], []

names, encodings = [], []
for fname in os.listdir(KNOWN_DIR):
fpath = os.path.join(KNOWN_DIR, fname)
name = os.path.splitext(fname)[0]
img = face_recognition.load_image_file(fpath)
encs = face_recognition.face_encodings(img)
if encs:
names.append(name)
encodings.append(encs[0])
print(f"已加载 {len(names)} 位人员: {', '.join(names)}")
return names, encodings

def recognize_image(image_path: str, names, encodings):
import cv2
import face_recognition

image = face_recognition.load_image_file(image_path)
locs = face_recognition.face_locations(image)
encs = face_recognition.face_encodings(image, locs)
print(f"\\n检测到 {len(locs)} 张人脸:")

results = []
for i, enc in enumerate(encs):
matches = face_recognition.compare_faces(encodings, enc, tolerance=0.6)
name = "未知人员"
if True in matches:
name = names[matches.index(True)]
results.append(name)
print(f" 人脸 {i+1}: {name}")

# 标注并保存
image_bgr = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
for (top, right, bottom, left), name in zip(locs, results):
color = (0, 255, 0) if name != "未知人员" else (0, 0, 255)
cv2.rectangle(image_bgr, (left, top), (right, bottom), color, 2)
cv2.rectangle(image_bgr, (left, bottom 25), (right, bottom), color, cv2.FILLED)
cv2.putText(image_bgr, name, (left + 4, bottom 6),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 1)

os.makedirs(OUT_DIR, exist_ok=True)
out_path = os.path.join(OUT_DIR, "recognized.jpg")
cv2.imwrite(out_path, image_bgr)
print(f"\\n标注结果已保存到: {out_path}")

def recognize_camera(names, encodings):
import cv2
import face_recognition

cap = cv2.VideoCapture(0)
print("摄像头已开启,按 q 退出 …")
while True:
ret, frame = cap.read()
if not ret:
break
small = cv2.resize(frame, (0, 0), fx=0.5, fy=0.5)
rgb = small[:, :, ::1]
locs = face_recognition.face_locations(rgb)
encs = face_recognition.face_encodings(rgb, locs)

for (top, right, bottom, left), enc in zip(locs, encs):
matches = face_recognition.compare_faces(encodings, enc, tolerance=0.6)
name = names[matches.index(True)] if True in matches else "未知"
top, right, bottom, left = top * 2, right * 2, bottom * 2, left * 2
color = (0, 255, 0) if name != "未知" else (0, 0, 255)
cv2.rectangle(frame, (left, top), (right, bottom), color, 2)
cv2.putText(frame, name, (left, top 8),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2)

cv2.imshow("Face Recognition (press q)", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()

def download_demo():
"""下载示例人物照 + 合照,自动录入并识别。"""
import urllib.request
import shutil

base = "https://raw.githubusercontent.com/ageitgey/face_recognition/master/examples/"
samples = {"obama.jpg": "obama", "biden.jpg": "biden"}
test_file = "two_people.jpg"

print("下载示例人物照片到人员库 …")
os.makedirs(KNOWN_DIR, exist_ok=True)
for fname, name in samples.items():
dst = os.path.join(KNOWN_DIR, f"{name}.jpg")
if not os.path.exists(dst):
try:
urllib.request.urlretrieve(base + fname, dst)
print(f" 下载 {fname} -> {dst}")
except Exception as e:
print(f"[错误] 下载失败 {fname}: {e}")
print("请手动将清晰正面照放入 known_faces/ 目录(文件名即人员名)")
sys.exit(1)

test_path = os.path.join(BASE_DIR, test_file)
if not os.path.exists(test_path):
try:
urllib.request.urlretrieve(base + test_file, test_path)
print(f" 下载 {test_file} -> {test_path}")
except Exception as e:
print(f"[错误] 下载测试图失败: {e}")
print("请用 –image 指定本地测试图片")
sys.exit(1)

names, encodings = load_known_encodings()
recognize_image(test_path, names, encodings)

def main():
parser = argparse.ArgumentParser()
parser.add_argument("–register", nargs=2, metavar=("NAME", "IMAGE"),
help="录入人员:名字 + 照片路径")
parser.add_argument("–image", type=str, help="识别指定图片中的人脸")
parser.add_argument("–camera", action="store_true", help="摄像头实时识别")
parser.add_argument("–demo", action="store_true", help="下载示例数据并自动跑通")
args = parser.parse_args()

if args.register:
register(args.register[0], args.register[1])
return

if args.demo:
download_demo()
return

names, encodings = load_known_encodings()
if not names:
sys.exit(0)

if args.image:
recognize_image(args.image, names, encodings)
elif args.camera:
recognize_camera(names, encodings)
else:
print("请指定操作:–register / –image / –camera / –demo 之一(-h 查看帮助)")

if __name__ == "__main__":
main()

赞(0)
未经允许不得转载:171主机测评 » 入门实践工程十一:人脸识别门禁系统(基于 face_recognition)~附:安装依赖库及工程源码
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址