news 2026/6/10 5:00:01

【OpenCV项目实战】基于face_recognitionde的人脸检测与识别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【OpenCV项目实战】基于face_recognitionde的人脸检测与识别

文章目录

  • 博主精品专栏导航
  • 人脸检测与识别
    • (一)实战:人脸检测(图片)
    • (二)实战:人脸检测与识别(视频)

博主精品专栏导航

  • 🥫 【深度学习环境配置】详细教程(资源已上传)
  • 🍕 【深度学习项目实战目录】算法详解 + 项目详解 + 数据集 + 完整源码
  • 🍔 【sklearn】线性回归、最小二乘法、岭回归、Lasso回归
  • 🥘 【yolo系列详解】yolov1、yolov2、yolov3、yolov4、yolov5、yolov7
  • 🍰 卷积神经网络CNN的经典模型
  • 🍟 卷积神经网络CNN的实战知识
  • 🍝 Pytorch基础(全)
  • 🌭 Opencv图像处理(全)
  • 🥙 Python常用内置函数(全)
  • 🍳 Pillow图像处理(PIL.Image类的详细使用)

人脸检测与识别

face_recognition是开源人脸识别库。Face Recognition官网。其依赖于python的两个库:dlib和CMake。安装分为三个步骤:(1)dlib安装(2)CMake安装(3)face_recognition安装。

人脸检测是🚌目标检测的一种。人脸检测和人脸识别原理

  • 目标检测即找出图像中所有感兴趣的目标,确定他们的类别和位置。
    (1)早期框架有Viola Jones、HOG;
    (2)加入深度学习后的框架OverFeat、R-CNN、Fast R-CNN、Faster R-CNN等。
    主要影响因素:分辨率、光照、模糊度、遮挡、角度等。
  • 人脸检测与识别属于生物特征识别技术,通过对生物体本身的生物特征来区分生物体个体。生物特征包括:脸、指纹、手掌纹、虹膜、视网膜、声音、体型、签字等。
    其主要的挑战:
    (1)单一限定场景发展到广场、车站、地铁口等;
    (2)人脸尺度多变、姿态多样性包括俯拍、搞帽子口罩、表情夸张、化妆伪装、光照条件恶劣、分辨率低到人眼难辩等。

如何实现人脸识别?

通过定位和对齐得到人脸的区域图像,然后卷积网络提取人脸特征进行分类识别。

  • 定位(Detection):在图像中找到所有人脸的位置,并画出矩形框。
  • 对齐(Alignment):找到人脸的若干个关键点(如眼角、鼻尖、嘴角等),然后通过相似变换(如旋转、缩放和平移)得到标准人脸(模板)。
  • 特征提取(Feature Extraction):通过深度卷积网络提取特征(权重参数)。

基于CNN的人脸定位与对齐方法:MTCNN(Multi-task Cascaded Convolutional Networks)

主要由三个神经网络组成:PNet、RNet、ONet
主要流程:
(1)resieze(预处理):对给定图像进行裁剪,生成不同大小的图像。构建图像金字塔,以便适应不同尺寸的人脸。
(2)PNet(一次过滤):使用PNet网络生成候选窗口,并利用边框回归方法矫正候选窗口,然后使用非极大值抑制NMS提取相关度最大的窗口。
(3)RNet(二次过滤):使用NRNet网络改善候选窗口。拒绝掉大部分假窗口,并继续使用边框回归矫正窗口和NMS提取窗口。
(4)ONet(检测人脸);使用ONet网络输出最终的人脸框和五个特征点的位置。

如何衡量人脸的相似性与不同?

设计有效的Loss Function,使得类内的变化程度最小,同时保持类间的可区分性。损失函数包括:(1)交叉熵损失(2)三元组损失(3)中心损失(4)ArcFace。

实战:人脸识别库face_recognition使用教程(人脸检测、人脸马赛克、人脸关键点识别、人脸涂色、人眼睁闭状态识别、人脸识别)

(一)实战:人脸检测(图片)

importface_recognitionimportcv2# opencv读取图像的格式BGR(图像的格式RGB)img=face_recognition.load_image_file("女团.jpg")# 加载图片img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)# BGR转换为RGBface_locations=face_recognition.face_locations(img)# 提取人脸位置print("I found {} face(s) in this photograph.".format(len(face_locations)))# 打印图像中的人脸数######################################################## 提取图像中所有人脸forface_locationinface_locations:top,right,bottom,left=face_location start=(left,top)end=(right,bottom)cv2.rectangle(img,start,end,color=(255,255,255),thickness=3)######################################################## 显示识别结果cv2.namedWindow("face_recognition")cv2.imshow("face_recognition",img)cv2.waitKey(0)cv2.destroyAllWindows()

(二)实战:人脸检测与识别(视频)

importface_recognitionimportcv2importnumpyasnp########################################################## (1)自定义已知面孔及标签video_capture=cv2.VideoCapture(0)# cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备obama_image=face_recognition.load_image_file("小胖墩.jpg")# 自定义已知面孔1obama_face_encoding=face_recognition.face_encodings(obama_image)[0]biden_image=face_recognition.load_image_file("obama.jpg")# 自定义已知面孔2biden_face_encoding=face_recognition.face_encodings(biden_image)[0]known_face_encodings=[obama_face_encoding,biden_face_encoding]# 创建已知人脸编码(数组)known_face_names=["Fat Boy","obama"]# 创建已知人脸的名称(数组)########################################################## 参数初始化face_locations=[]face_encodings=[]face_names=[]process_this_frame=TruewhileTrue:########################################################## 人脸检测与识别(匹配两张面孔的距离)ret,frame=video_capture.read()# 循环读取视频的每一帧(图像)ifprocess_this_frame:# 为了节省时间,每隔一帧视频就处理一次small_frame=cv2.resize(frame,(0,0),fx=0.25,fy=0.25)# 调整视频帧的大小为1/4大小,以更快的人脸识别处理rgb_small_frame=small_frame[:,:,::-1]# 将图像从BGR颜色(OpenCV使用)转换为RGB颜色(face_recognition使用)face_locations=face_recognition.face_locations(rgb_small_frame)# 查找当前视频帧中的所有人脸位置face_encodings=face_recognition.face_encodings(rgb_small_frame,face_locations)# 查找当前视频帧中的所有人脸编码face_names=[]forface_encodinginface_encodings:name="Unknown"# 若新面孔与已知面孔不同,则显示“ 未知”matches=face_recognition.compare_faces(known_face_encodings,face_encoding)# 看这张脸是否与已知的脸匹配face_distances=face_recognition.face_distance(known_face_encodings,face_encoding)# 计算与新面孔与已知面孔的距离best_match_index=np.argmin(face_distances)# 计算与新面孔与已知面孔的最小距离ifmatches[best_match_index]:name=known_face_names[best_match_index]face_names.append(name)process_this_frame=notprocess_this_frame# 为了节省时间,每隔一帧视频就处理一次########################################################## 框出人脸并显示标签for(top,right,bottom,left),nameinzip(face_locations,face_names):# 由于我们检测到的帧被缩放到1/4大小,所以将面位置缩小top*=4;right*=4;bottom*=4;left*=4cv2.rectangle(frame,(left,top),(right,bottom),(0,0,255),2)# 在脸周围画一个方框cv2.rectangle(frame,(left,bottom-35),(right,bottom),(0,0,255),cv2.FILLED)# 在脸下方画一个有名字的标签font=cv2.FONT_HERSHEY_DUPLEX cv2.putText(frame,name,(left+6,bottom-6),font,1.0,(255,255,255),1)cv2.imshow('Video',frame)ifcv2.waitKey(1)&0xFF==27:# 27 表示退出键(Esc)breakvideo_capture.release()cv2.destroyAllWindows()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 4:56:28

json2csv命令行参数详解:从基础到精通的完整手册

json2csv命令行参数详解:从基础到精通的完整手册 【免费下载链接】json2csv command line tool to convert json to csv 项目地址: https://gitcode.com/gh_mirrors/jso/json2csv json2csv是一款高效实用的命令行工具,能够帮助用户快速将JSON格式…

作者头像 李华
网站建设 2026/6/10 4:55:15

终极指南:如何在电脑上免费畅玩Switch游戏?yuzu模拟器完整教程

终极指南:如何在电脑上免费畅玩Switch游戏?yuzu模拟器完整教程 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在电脑上体验Switch游戏的乐趣吗?yuzu模拟器就是你一直在寻找的…

作者头像 李华
网站建设 2026/6/10 4:53:09

oneapi安装QE

1,安装依赖 sudo apt-get install g gcc gfortran 2,下载oneAPI HPC Toolkit 与 https://www.intel.com/content/www/us/en/developer/tools/oneapi/toolkits.html?wapkwtoolkit#base-kit 使用-a --cli进行无图形化界面安装 sudo sh XXX.sh -a --cl…

作者头像 李华
网站建设 2026/6/10 4:51:02

Laravel-Mediable 高级用法:自定义源适配器和 URL 生成器

Laravel-Mediable 高级用法:自定义源适配器和 URL 生成器 【免费下载链接】laravel-mediable Laravel-Mediable is a package for easily uploading and attaching media files to models with Laravel 项目地址: https://gitcode.com/gh_mirrors/la/laravel-medi…

作者头像 李华
网站建设 2026/6/10 4:50:04

FXLabel高级用法:自定义渐变方向与超采样抗锯齿优化

FXLabel高级用法:自定义渐变方向与超采样抗锯齿优化 【免费下载链接】FXLabel [DEPRECATED] 项目地址: https://gitcode.com/gh_mirrors/fx/FXLabel FXLabel是一款功能强大的iOS标签控件,它扩展了UILabel的功能,提供了丰富的文本样式定…

作者头像 李华
网站建设 2026/6/10 4:47:00

Claude Code WebUI核心架构解析:前端React + 后端Hono的完美组合

Claude Code WebUI核心架构解析:前端React 后端Hono的完美组合 【免费下载链接】claude-code-webui Web-based interface for Claude CLI with streaming chat responses 项目地址: https://gitcode.com/gh_mirrors/cl/claude-code-webui Claude Code WebUI…

作者头像 李华