~附:安装依赖库及工程源码)
别再死磕枯燥理论了AI 时代拿实战作品说话才是硬道理原创不易哈希望可以帮到还有些许学习劲儿的同学们【进阶版还在创作中耗费精力中……】跳转到专栏目录你学习更有方向和思路……入门实践工程十一人脸识别门禁系统基于 face_recognition~附:安装依赖库及工程源码简介基于face_recognition库先对录入人员照片做特征编码入库再用摄像头或图片识别已知人员并标记姓名实现简易门禁/考勤 Demo支持多人脸同时识别理解「人脸检测→特征编码→余弦相似度匹配」链路。工程详细介绍核心思想人脸识别 检测 特征编码 比对。先用预训练模型把人脸映射为 128 维嵌入同一人相近、不同人远离再把待识别人脸嵌入与入库嵌入做距离比对最近且过阈即判定身份是「度量学习」的典型应用。实现方法数据 / 输入人员库照片known_faces/文件名即人名 待识别图片或摄像头。模型face_recognition基于 dlib 的 ResNet 人脸嵌入模型。流程register 模式把人员照编码入库识别时对图片做人脸检测 编码 → compare_faces 逐个比对待选嵌入tolerance0.6→ 匹配则标名、未知标红摄像头模式逐帧实时框选–demo 下载示例数据自动跑通。输出每张人脸身份 绿/红框标注图。目录结构11_face_recognition/ ├── main.py # 录入 / 图片识别 / 摄像头识别主程序 ├── requirements.txt ├── known_faces/ # 人员库文件名即人员名如 张三.jpg └── output/ └── recognized.jpg # 标注结果图正确安装face_recognition依赖dlibWindows 上安装较麻烦# 需先安装 CMake 和 Visual Studio Build ToolsC 桌面开发组件pipinstallcmake pipinstalldlib pipinstallface_recognition opencv-python若 dlib 编译失败可改用 condaconda 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--imagetest.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/ 目录每张图文件名即人员名。 importargparseimportosimportsys BASE_DIRos.path.dirname(os.path.abspath(__file__))KNOWN_DIRos.path.join(BASE_DIR,known_faces)OUT_DIRos.path.join(BASE_DIR,output)defregister(name:str,image_path:str):importshutil os.makedirs(KNOWN_DIR,exist_okTrue)ifnotos.path.exists(image_path):print(f[错误] 图片不存在:{image_path})sys.exit(1)extos.path.splitext(image_path)[1]or.jpgdstos.path.join(KNOWN_DIR,f{name}{ext})shutil.copy(image_path,dst)# 验证能检测到人脸importface_recognition imgface_recognition.load_image_file(dst)encsface_recognition.face_encodings(img)ifnotencs:print(f[警告] 未在图片中检测到人脸请更换清晰正面照:{dst})returnprint(f已录入人员 [{name}] -{dst}检测到{len(encs)}张人脸采用第 1 张)defload_known_encodings():importface_recognitionifnotos.path.isdir(KNOWN_DIR)ornotos.listdir(KNOWN_DIR):print([提示] 人员库为空。请先录入人员)print( python main.py --register 张三 photo.jpg)print( 或运行 python main.py --demo 下载示例数据)return[],[]names,encodings[],[]forfnameinos.listdir(KNOWN_DIR):fpathos.path.join(KNOWN_DIR,fname)nameos.path.splitext(fname)[0]imgface_recognition.load_image_file(fpath)encsface_recognition.face_encodings(img)ifencs:names.append(name)encodings.append(encs[0])print(f已加载{len(names)}位人员:{, .join(names)})returnnames,encodingsdefrecognize_image(image_path:str,names,encodings):importcv2importface_recognition imageface_recognition.load_image_file(image_path)locsface_recognition.face_locations(image)encsface_recognition.face_encodings(image,locs)print(f\n检测到{len(locs)}张人脸)results[]fori,encinenumerate(encs):matchesface_recognition.compare_faces(encodings,enc,tolerance0.6)name未知人员ifTrueinmatches:namenames[matches.index(True)]results.append(name)print(f 人脸{i1}:{name})# 标注并保存image_bgrcv2.cvtColor(image,cv2.COLOR_RGB2BGR)for(top,right,bottom,left),nameinzip(locs,results):color(0,255,0)ifname!未知人员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,(left4,bottom-6),cv2.FONT_HERSHEY_SIMPLEX,0.7,(255,255,255),1)os.makedirs(OUT_DIR,exist_okTrue)out_pathos.path.join(OUT_DIR,recognized.jpg)cv2.imwrite(out_path,image_bgr)print(f\n标注结果已保存到:{out_path})defrecognize_camera(names,encodings):importcv2importface_recognition capcv2.VideoCapture(0)print(摄像头已开启按 q 退出 ...)whileTrue:ret,framecap.read()ifnotret:breaksmallcv2.resize(frame,(0,0),fx0.5,fy0.5)rgbsmall[:,:,::-1]locsface_recognition.face_locations(rgb)encsface_recognition.face_encodings(rgb,locs)for(top,right,bottom,left),encinzip(locs,encs):matchesface_recognition.compare_faces(encodings,enc,tolerance0.6)namenames[matches.index(True)]ifTrueinmatcheselse未知top,right,bottom,lefttop*2,right*2,bottom*2,left*2color(0,255,0)ifname!未知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)ifcv2.waitKey(1)0xFFord(q):breakcap.release()cv2.destroyAllWindows()defdownload_demo():下载示例人物照 合照自动录入并识别。importurllib.requestimportshutil basehttps://raw.githubusercontent.com/ageitgey/face_recognition/master/examples/samples{obama.jpg:obama,biden.jpg:biden}test_filetwo_people.jpgprint(下载示例人物照片到人员库 ...)os.makedirs(KNOWN_DIR,exist_okTrue)forfname,nameinsamples.items():dstos.path.join(KNOWN_DIR,f{name}.jpg)ifnotos.path.exists(dst):try:urllib.request.urlretrieve(basefname,dst)print(f 下载{fname}-{dst})exceptExceptionase:print(f[错误] 下载失败{fname}:{e})print(请手动将清晰正面照放入 known_faces/ 目录文件名即人员名)sys.exit(1)test_pathos.path.join(BASE_DIR,test_file)ifnotos.path.exists(test_path):try:urllib.request.urlretrieve(basetest_file,test_path)print(f 下载{test_file}-{test_path})exceptExceptionase:print(f[错误] 下载测试图失败:{e})print(请用 --image 指定本地测试图片)sys.exit(1)names,encodingsload_known_encodings()recognize_image(test_path,names,encodings)defmain():parserargparse.ArgumentParser()parser.add_argument(--register,nargs2,metavar(NAME,IMAGE),help录入人员名字 照片路径)parser.add_argument(--image,typestr,help识别指定图片中的人脸)parser.add_argument(--camera,actionstore_true,help摄像头实时识别)parser.add_argument(--demo,actionstore_true,help下载示例数据并自动跑通)argsparser.parse_args()ifargs.register:register(args.register[0],args.register[1])returnifargs.demo:download_demo()returnnames,encodingsload_known_encodings()ifnotnames:sys.exit(0)ifargs.image:recognize_image(args.image,names,encodings)elifargs.camera:recognize_camera(names,encodings)else:print(请指定操作--register / --image / --camera / --demo 之一-h 查看帮助)if__name____main__:main()