当前位置: 首页 > news >正文

DNN人脸识别和微笑检测

目录

一.人脸识别

1.人脸识别原理

2. HARAL级联分类器代码实现

3.代码实现

①读取图片

②加载分类器

③检测人脸

④标注人脸及显示

二.微笑检测

1.微笑检测实现原理

2.代码实现

①加载分类器

②读取视频文件

③循环读取每一帧,作人脸检测

④循环提取每一帧图片中所有人脸位置,并对每一个人脸做笑脸检测

⑤提取笑脸的位置,并在原图上用矩形框画出,并显示文字

⑥显示结果


一.人脸识别

1.人脸识别原理

  • 人脸识别需先进行人脸检测,定位人脸区域,再进行特征提取与比对以判断身份。
  • 本次讲解的核心是使用OPEN CV中的哈尔级联分类器进行人脸检测。
  • 分类器通过分析哈尔特征(如黑白区域对比值)和采用级联结构(分步判断,逐级淘汰)来高效检测人脸。

2. HARAL级联分类器代码实现

  • 加载已存在的哈尔分类器XML文件,其路径固定在OpenCV源文件cv2库下的的data目录下。
  • 利用detectMultiScale()方法进行检测,核心参数包括:
    • scaleFactor: 搜索窗口的缩放比例,用于扩大搜索范围以发现不同大小的人脸。
    • minNeighbors: 需要检测出的人脸特征阈值,是影响检测精确度的关键参数。
    • minSize/maxSize: 忽略过小或过大的人脸区域。
  • 检测函数返回值为包含所有检测到的人脸坐标(左上角X, Y及宽高)的对象数组。

3.代码实现

①读取图片

并获取灰度图

import cv2
image=cv2.imread('img1.png')
image=cv2.resize(image,(800,500))
grey=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

②加载分类器

需要提前将xml文件复制到当前目录下

#加载分类器
faceCascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

③检测人脸

detectMultiScale()方法会返回检测到的人脸的位置

faces=faceCascade.detectMultiScale(grey,scaleFactor=1.05,minNeighbors=10,minSize=(5,5))
print(f'发现{len(faces)}个人脸')
print(f'其位置分别是{faces}')

④标注人脸及显示

根据位置信息画出矩形框

#标注人脸及显示
for (x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow('result',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

二.微笑检测

1.微笑检测实现原理

  • “微笑检测”并非独立模型,而是基于“人脸识别”模型,再对检测到的人脸图片进行进一步分析。
  • 实现流程主要包括:1) 使用前置模型加载人脸和微笑检测两套模型;2) 从视频流中捕获图像,并先通过人脸模型定位面部区域;3) 将检测到的人脸区域进行图像抠图处理;4) 在抠图后的单独胡脸上,应用“微笑”模型进行特征分析;5) 最后将结果绘制到原视频画面上,如框选口部并标注“smile”字符。

2.代码实现

①加载分类器

加载用于人脸识别和笑脸检测的xml文件

import cv2
faceCasecade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile=cv2.CascadeClassifier('haarcascade_smile.xml')

②读取视频文件

cap=cv2.VideoCapture('test4.mp4')

③循环读取每一帧,作人脸检测

while True:ret,image=cap.read()image=cv2.flip(image,1)#图片翻转,水平翻转(镜像)if not ret:breakgray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)faces=faceCasecade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=15,minSize=(5,5))#人脸检测

④循环提取每一帧图片中所有人脸位置,并对每一个人脸做笑脸检测

    for (x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)#提取人脸所在区域,单通道形式roi_gray_face=gray[y:y+h,x:x+w]cv2.imshow('lian',roi_gray_face)#微笑检测,仅在人脸区域内检测smiles=smile.detectMultiScale(roi_gray_face,scaleFactor=1.5,minNeighbors=18,minSize=(50,50))

⑤提取笑脸的位置,并在原图上用矩形框画出,并显示文字

注意这里的坐标要加上之前的x,y

        for (sx,sy,sw,sh) in smiles:#绘制微笑区域a=x+sxb=y+sycv2.rectangle(image,(a,b),(a+sw,b+sh),(255,0,0),2)#显示文字cv2.putText(image,'smile',(x,y),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,0),2)

⑥显示结果

#显示结果cv2.imshow('dect',image)key=cv2.waitKey(25)if key==27:break

http://www.dtcms.com/a/391986.html

相关文章:

  • 从API调用到UI效果:直播美颜SDK特效面具功能的集成实战
  • 神经网络学习笔记13——高效卷积神经网络架构ShuffleNet
  • MySQL双写缓冲区:数据安全的终极防线
  • 第八章 惊喜09 运维支持VS产品迭代
  • sward入门到实战(2) - 如何管理知识库
  • Vue: 依赖注入(Provide Inject)
  • nethunter 中文乱码解决
  • 【软件测试】第5章 测试分类(上)
  • [硬件电路-262]:MPH6250SQ 管脚定义、概述、功能、技术指标、使用场景及原理分析
  • git status
  • synchronized的高频面试题以及答案
  • cka解题思路1.32-4
  • gradle 和 maven 有什么区别?
  • C/C++语言中`char`类型在x86与ARM平台上的符号性定义差异
  • 台积电纳米泄密事件:Curtain e-locker数据全链路防护
  • 正点原子imx6ull+ov2640+lcd显示问题汇总
  • 【Spring AI】简单入门(一)
  • Java中接口入参验证
  • 【高并发内存池——项目】central cache 讲解
  • vue3 <el-image 的:src=“event.fileName[0]“ 长度为 “0“ 的元组类型 “[]“ 在索引 “0“ 处没有元素。
  • 问题记录: 跨服务接口调用日期类型字段格式转换问题
  • 亚马逊关键词按什么角度筛选?从人工摸索到智能化系统的全面升级
  • C语言基础【19】:指针6
  • 正则表达式【阿里版】
  • 使用云端GPU训练Lerobot
  • RNA-seq分析之基因ID转换
  • [视图功能9] 图表联动与多维度分析:打造协同动态的数据洞察仪表盘
  • Python基础 6》数据类型_列表(List)
  • 40、大模型工程平台全景对比 - 技术选型指南
  • BEVformer训练nusenes-mini数据集