文章目录博主精品专栏导航人脸检测与识别一实战人脸检测图片二实战人脸检测与识别视频博主精品专栏导航 【深度学习环境配置】详细教程资源已上传 【深度学习项目实战目录】算法详解 项目详解 数据集 完整源码 【sklearn】线性回归、最小二乘法、岭回归、Lasso回归 【yolo系列详解】yolov1、yolov2、yolov3、yolov4、yolov5、yolov7 卷积神经网络CNN的经典模型 卷积神经网络CNN的实战知识 Pytorch基础全 Opencv图像处理全 Python常用内置函数全 Pillow图像处理PIL.Image类的详细使用人脸检测与识别face_recognition是开源人脸识别库。Face Recognition官网。其依赖于python的两个库dlib和CMake。安装分为三个步骤1dlib安装2CMake安装3face_recognition安装。人脸检测是目标检测的一种。人脸检测和人脸识别原理目标检测即找出图像中所有感兴趣的目标确定他们的类别和位置。1早期框架有Viola Jones、HOG2加入深度学习后的框架OverFeat、R-CNN、Fast R-CNN、Faster R-CNN等。主要影响因素分辨率、光照、模糊度、遮挡、角度等。人脸检测与识别属于生物特征识别技术通过对生物体本身的生物特征来区分生物体个体。生物特征包括脸、指纹、手掌纹、虹膜、视网膜、声音、体型、签字等。其主要的挑战1单一限定场景发展到广场、车站、地铁口等2人脸尺度多变、姿态多样性包括俯拍、搞帽子口罩、表情夸张、化妆伪装、光照条件恶劣、分辨率低到人眼难辩等。如何实现人脸识别通过定位和对齐得到人脸的区域图像然后卷积网络提取人脸特征进行分类识别。定位Detection在图像中找到所有人脸的位置并画出矩形框。对齐Alignment找到人脸的若干个关键点如眼角、鼻尖、嘴角等然后通过相似变换如旋转、缩放和平移得到标准人脸模板。特征提取Feature Extraction通过深度卷积网络提取特征权重参数。基于CNN的人脸定位与对齐方法MTCNNMulti-task Cascaded Convolutional Networks主要由三个神经网络组成PNet、RNet、ONet。主要流程1resieze预处理对给定图像进行裁剪生成不同大小的图像。构建图像金字塔以便适应不同尺寸的人脸。2PNet一次过滤使用PNet网络生成候选窗口并利用边框回归方法矫正候选窗口然后使用非极大值抑制NMS提取相关度最大的窗口。3RNet二次过滤使用NRNet网络改善候选窗口。拒绝掉大部分假窗口并继续使用边框回归矫正窗口和NMS提取窗口。4ONet检测人脸使用ONet网络输出最终的人脸框和五个特征点的位置。如何衡量人脸的相似性与不同设计有效的Loss Function使得类内的变化程度最小同时保持类间的可区分性。损失函数包括1交叉熵损失2三元组损失3中心损失4ArcFace。实战人脸识别库face_recognition使用教程人脸检测、人脸马赛克、人脸关键点识别、人脸涂色、人眼睁闭状态识别、人脸识别一实战人脸检测图片importface_recognitionimportcv2# opencv读取图像的格式BGR图像的格式RGBimgface_recognition.load_image_file(女团.jpg)# 加载图片imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)# BGR转换为RGBface_locationsface_recognition.face_locations(img)# 提取人脸位置print(I found {} face(s) in this photograph..format(len(face_locations)))# 打印图像中的人脸数######################################################## 提取图像中所有人脸forface_locationinface_locations:top,right,bottom,leftface_location start(left,top)end(right,bottom)cv2.rectangle(img,start,end,color(255,255,255),thickness3)######################################################## 显示识别结果cv2.namedWindow(face_recognition)cv2.imshow(face_recognition,img)cv2.waitKey(0)cv2.destroyAllWindows()二实战人脸检测与识别视频importface_recognitionimportcv2importnumpyasnp########################################################## 1自定义已知面孔及标签video_capturecv2.VideoCapture(0)# cv2.VideoCapture可以捕获摄像头用数字来控制不同的设备obama_imageface_recognition.load_image_file(小胖墩.jpg)# 自定义已知面孔1obama_face_encodingface_recognition.face_encodings(obama_image)[0]biden_imageface_recognition.load_image_file(obama.jpg)# 自定义已知面孔2biden_face_encodingface_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_frameTruewhileTrue:########################################################## 人脸检测与识别匹配两张面孔的距离ret,framevideo_capture.read()# 循环读取视频的每一帧图像ifprocess_this_frame:# 为了节省时间每隔一帧视频就处理一次small_framecv2.resize(frame,(0,0),fx0.25,fy0.25)# 调整视频帧的大小为1/4大小以更快的人脸识别处理rgb_small_framesmall_frame[:,:,::-1]# 将图像从BGR颜色(OpenCV使用)转换为RGB颜色(face_recognition使用)face_locationsface_recognition.face_locations(rgb_small_frame)# 查找当前视频帧中的所有人脸位置face_encodingsface_recognition.face_encodings(rgb_small_frame,face_locations)# 查找当前视频帧中的所有人脸编码face_names[]forface_encodinginface_encodings:nameUnknown# 若新面孔与已知面孔不同则显示“ 未知”matchesface_recognition.compare_faces(known_face_encodings,face_encoding)# 看这张脸是否与已知的脸匹配face_distancesface_recognition.face_distance(known_face_encodings,face_encoding)# 计算与新面孔与已知面孔的距离best_match_indexnp.argmin(face_distances)# 计算与新面孔与已知面孔的最小距离ifmatches[best_match_index]:nameknown_face_names[best_match_index]face_names.append(name)process_this_framenotprocess_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)# 在脸下方画一个有名字的标签fontcv2.FONT_HERSHEY_DUPLEX cv2.putText(frame,name,(left6,bottom-6),font,1.0,(255,255,255),1)cv2.imshow(Video,frame)ifcv2.waitKey(1)0xFF27:# 27 表示退出键Escbreakvideo_capture.release()cv2.destroyAllWindows()