OpenMV(五) 您所在的位置:网站首页 人脸识别需要哪些动作 OpenMV(五)

OpenMV(五)

2024-07-09 19:00| 来源: 网络整理| 查看: 265

STM32实现人脸识别 引前言1. 人脸检测1.1 构造函数1.2 源码分析 2. 人脸识别2.1 构造函数2.2 源码分析 3.通过本地特征文件进行人脸识别3.1 将人脸特征保存到本地3.2 通过本地特征文件进行人脸识别

OpenMV(一)–基础介绍与硬件架构 OpenMV(二)–IDE安装与固件下载 OpenMV(三)–实时获取摄像头图片 OpenMV(四)–STM32实现特征检测

前言

本专栏基于以STM32H743为MCU的OpenMV-H7基板,结合OV7725卷帘快门摄像头进行相关机器视觉应用的开发。人脸识别的前提是人脸检测,本篇博文基于OpenMV官方的Face-Detection例程,来解析一下怎么实现人脸识别。

1. 人脸检测

人脸检测就是通过摄像头实时获取的图片,来标记出人脸的位置。本节代码的目的就是将摄像头拍摄的画面中的人脸用矩形框表示出来。人脸检测的本质是特征识别,OpenMV中已经集成了非常多的特征库和算法库,比如image模块下的find_features()特征寻找函数。

1.1 构造函数 image.find_features(cascade, threshold=0.5, scale=1.5, roi) 搜索和Haar Cascade匹配的所有区域的图像,并返回一个关于这些特征的边界框矩形元祖(x, ,y, w, h)的列表,若没有发现任何特征,则返回一个空白列表。基于Haar特征的cascade分类器一种有效的物品检测(object detect)方法。它是一种机器学习方法,通过许多正负样例中训练得到cascade方程,然后将其应用于其他图片。详细内容可以参考博客:使用Haar Cascade 进行人脸识别 cascade:Haar Cascade 对象threshold: 是浮点数(0.0-1.0),其中较小的值在提高检测速率同时增加误报率。相反,较高的值会降低检测速率,同时降低误报率。scale: 是一个必须大于1.0的浮点数。较高的比例因子运行更快,但是其图像匹配相应较差。理想值介于1.35到1.5之间。roi:指定识别区域的矩形元组(x, y, w, h)。如果没有指定,roi即整个图像的图像矩形。 1.2 源码分析 """ 人脸检测例程 利用Haar Cascade特征检测器来实现:一个Haar Cascade是一系列简单区域的对比检查,人脸识别有25个阶段,每个阶段有几百次检测。Haar Cascade运行很快是因为它是逐个阶段进行检测的。 OpenMV使用一种称为积分图像的数据结构来在恒定时间内快速执行每个区域的对比度检查 """ # 导入相应的库 import sensor, image, time # 初始化摄像头 sensor.reset() # 设置相机图像的对比度为1 sensor.set_contrast(1) # 设置相机的增益上限为16 sensor.set_gainceiling(16) # 设置采集到照片的大小 sensor.set_framesize(sensor.HQVGA) # 设置采集到照片的格式:灰色图像 sensor.set_pixformat(sensor.GRAYSCALE) # 加载Haar Cascade 模型 # 默认使用25个步骤,减少步骤会加快速度但会影响识别成功率 face_cascade = image.HaarCascade("frontalface", stage = 25) print(face_cascade) # 创建一个时钟来计算摄像头每秒采集的帧数FPS clock = time.clock() while(True): # 更新FPS时钟 clock.tick() # 拍摄图片并返回img img = sensor.snapshot() # 寻找人脸对象 # threshold和scale_factor两个参数控制着识别的速度和准确性 objects = img.find_features(face_cascade, threshold=0.75, scale_factor=1.25) # 用矩形将人脸画出来 for r in objects: img.draw_rectangle(r) # 串口打印FPS参数 print(clock.fps())

我们将板子连接到OpenMV IDE, 新建文件,并将上述代码copy进去,点击左下角的绿色按钮,我们就可以看到IDE右边的窗口在实时显示提取到的人脸特征图片: 在这里插入图片描述

2. 人脸识别

人脸识别是通过短时间的人脸特征学习,再重新识别的过程,这节内容是基于第一小节的人脸检测的基础上完成的。

2.1 构造函数

本节是人脸检测和特征点识别的结合,实验用到的函数和对象在之前都有介绍过,分别是

image.find_features(cascade, threshold=0.5, scale=1.5, roi) 收获和Haar Cascade 匹配的所有区域的对象,并返回关于这个特征的边界框矩形元组image.find_keypoints(roi, threshold=20, normalize=False, scale_factor=1.5, max_keypoints=100, corner_detector=image.CORNER_AGAST) 特征点识别函数,返回一个image.rect矩形对象列表image.match_descriptor(descriptor0, descriptor1, threshold=70, filter_outliers=False) 特征点对比函数。 2.2 源码分析

对于人脸识别,具体的实现步骤如下: 初始化和配置相应模块–>加载人脸检测Haar Cascade模型–>对当前的人脸学习并记录特征点K1–>在采集的图像中提取特征点K2–>对比K1和K2是否一致–>如果一致就在图中用矩形画出相应位置

""" 人脸识别例程 第一步先使用Haar Cascade找出人脸并记录该关键点 第二步就是不停的检测当前获取图片的关键点是否匹配 """ # 导入相应的库 import sensor, image, time # 初始化摄像头 sensor.reset() # 设置相机图像的对比度为3 sensor.set_contrast(3) # 设置相机的增益上限为16 sensor.set_gainceiling(16) # 设置采集到照片的大小 sensor.set_framesize(sensor.VGA) # 在VGA(640*480)下开个小窗口,相当于数码缩放 sensor.set_windowing((320, 240)) # 设置采集到照片的格式:灰色图像 sensor.set_pixformat(sensor.GRAYSCALE) # 加载Haar Cascade 模型 # 默认使用25个步骤,减少步骤会加快速度但会影响识别成功率 face_cascade = image.HaarCascade("frontalface", stage = 25) print(face_cascade) # 初始化特征kpts1 kpts1 = None # 找到人脸 while(kpts1 == None): # 拍摄图片并返回img img = sensor.snapshot() img.draw_string(0, 0, "Looking for a face...") # 寻找人脸对象 # threshold和scale_factor两个参数控制着识别的速度和准确性 objects = img.find_features(face_cascade, threshold=0.5, scale_factor=1.25) if objects: # 将 ROI(x, y, w, h)往各个方向扩展31像素 face = (objects[0][0]-31, objects[0][1]-31, objects[0][2]+31*2, objects[0][3]+31*2) # 使用扩展后的ROI区域(人脸)学习关键点 kpts1 = img.find_keypoints(threshold = 10, scale_factor = 1.1, max_keypoints = 100, roi = face) img.draw_keypoints(kpts1, size=24) img = sensor.snapshot() time.sleep(2000) while(True): img = sensor.snapshot() # 从图像中提取关键点 kpts2 = img.find_keypoints(threshold = 10, scale_factor = 1.1, max_keypoints = 100, normalized = True) if(kpts2): # 跟kpts1匹配 c = image.match_descriptor(kpts1, kpts2, threshold = 85) # c[6]为match值,值越大表示匹配程度越高 match = c[6] if(match > 5): img.draw_rectangle(c[2:6]) img.draw_cross(c[0], c[1], size = 10)

我们将板子连接到OpenMV IDE, 新建文件,并将上述代码copy进去,点击左下角的绿色按钮,我们就可以看到IDE右边的窗口在首先学习了人脸特征: 在这里插入图片描述 然后我们换一张还是吴彦祖的人脸看看是否能够进行识别: 在这里插入图片描述 从图中可以发现,已经成功识别了这张人脸特征。

3.通过本地特征文件进行人脸识别

第2节的例程是在线学习特征然后进行人脸识别,但是绝大多数的应用场景需要我们对比本地的人脸特征库和目标图像。我们要做的步骤有两部,首先要将人脸特征保存到本地,其次是调用本地的特征来进行人脸识别,下面我们将通过实例来分析如果实现这两个步骤。

3.1 将人脸特征保存到本地

将人脸特征保存到本地只需要一句语句即可:

image.save_descriptor(kpts, "path")

其中kpts为要保存的特征点,path为保存路径。 源码如下:

""" 保存人脸特征例程 第一步先使用Haar Cascade识别出人脸,并获取人脸的特征 第二步就是将特征保存在本地文件中 """ # 导入相应的库 import sensor, image, time # 初始化摄像头 sensor.reset() # 设置相机图像的对比度为3 sensor.set_contrast(3) # 设置相机的增益上限为16 sensor.set_gainceiling(16) # 设置采集到照片的大小 sensor.set_framesize(sensor.VGA) # 在VGA(640*480)下开个小窗口,相当于数码缩放 sensor.set_windowing((320, 240)) # 设置采集到照片的格式:灰色图像 sensor.set_pixformat(sensor.GRAYSCALE) sensor.skip_frames(time = 3000) # Wait for settings take effect. # 加载Haar Cascade 模型 # 默认使用25个步骤,减少步骤会加快速度但会影响识别成功率 face_cascade = image.HaarCascade("frontalface", stage = 25) # 初始化特征kpts1 kpts1 = None # 文件名 FILE_NAME = "kpts1" # 找到人脸 while(kpts1 == None): # 拍摄图片并返回img img = sensor.snapshot() img.draw_string(0, 0, "Looking for a face...") # 寻找人脸对象 # threshold和scale_factor两个参数控制着识别的速度和准确性 objects = img.find_features(face_cascade, threshold=0.5, scale_factor=1.25) if objects: # 将 ROI(x, y, w, h)往各个方向扩展31像素 face = (objects[0][0]-31, objects[0][1]-31, objects[0][2]+31*2, objects[0][3]+31*2) # 使用扩展后的ROI区域(人脸)学习关键点 kpts1 = img.find_keypoints(threshold = 10, scale_factor = 1.1, max_keypoints = 100, roi = face) img.draw_keypoints(kpts1, size=24) img = sensor.snapshot() #将人脸保存打本地文件 image.save_descriptor(kpts1, "/face_feature/%s.orb"%(FILE_NAME)) 3.2 通过本地特征文件进行人脸识别

提取本地特征文件只需要一句语句即可:

kpts1 = image.load_descriptor("path")

其中kpts1为要本地文件中的特征,path为保存路径。 源码如下:

""" 加载本地特征文件进行人脸识别例程 第一步先从本地加载特征文件 第二步就是不停的检测当前获取图片的关键点判断是否和本地特征匹配 """ # 导入相应的库 import sensor, image, time # 初始化摄像头 sensor.reset() # 设置相机图像的对比度为3 sensor.set_contrast(3) # 设置相机的增益上限为16 sensor.set_gainceiling(16) # 设置采集到照片的大小 sensor.set_framesize(sensor.VGA) # 在VGA(640*480)下开个小窗口,相当于数码缩放 sensor.set_windowing((320, 240)) # 设置采集到照片的格式:灰色图像 sensor.set_pixformat(sensor.GRAYSCALE) sensor.skip_frames(time = 10000) # Wait for settings take effect. # 加载Haar Cascade 模型 # 默认使用25个步骤,减少步骤会加快速度但会影响识别成功率 face_cascade = image.HaarCascade("frontalface", stage = 25) print(face_cascade) # 从本地提取特征 kpts1 = image.load_descriptor("/face_feature/kpts1.orb") while(True): img = sensor.snapshot() # 从图像中提取关键点 kpts2 = img.find_keypoints(threshold = 10, scale_factor = 1.1, max_keypoints = 100, normalized = True) if(kpts2): # 跟kpts1匹配 c = image.match_descriptor(kpts1, kpts2, threshold = 85) # c[6]为match值,值越大表示匹配程度越高 match = c[6] if(match > 10): img.draw_rectangle(c[2:6]) img.draw_cross(c[0], c[1], color = (255,0,0), size = 10)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有