(二)混合边缘AI人脸检测
目录
介绍
人脸检测方法
MTCNN检测器
图像中的人脸检测
视频中的人脸检测
下一步
- 下载源 - 152.7 KB
- 下载帧 - 3.1 MB
- 下载面孔 - 2.7 MB
- 下载数据库 - 531.6 KB
介绍
人脸识别是人工智能(AI)的一个领域,深度学习(DL)在过去十年中取得了巨大成功。最好的人脸识别系统可以以与人类相同的精度识别图像和视频中的人物,甚至更好。人脸识别的两个主要基础阶段是人员验证和身份识别。
在本系列文章的前半部分(当前)中,我们将:
- 讨论现有的AI人脸检测方法并开发运行预训练DNN模型的程序
- 考虑面部对齐并使用面部标志实现一些对齐算法
- 在Raspberry Pi设备上运行人脸检测DNN,探索其性能,并考虑可能的方法来更快地运行它,以及实时检测人脸
- 创建一个简单的人脸数据库并用从图像或视频中提取的人脸填充它
我们假设您熟悉DNN、Python、Keras和TensorFlow。
在上一篇文章中,我们讨论了人脸检测和人脸识别的原理。在这一节中,我们将了解特定的人脸检测方法并实现其中的一种。
人脸检测方法
人脸检测是任何人脸识别过程的第一阶段。这是影响所有后续步骤的关键步骤。它需要一种稳健的方法来最小化检测误差。人脸检测的方法有很多种;我们将专注于基于人工智能的方法。
我们想提及以下现代人脸检测方法:最大边距目标检测(MMOD)、单次检测器(SSD)、多任务级联卷积网络(MTCNN) 和您只看一次(YOLO)。
MMOD模型需要太多资源才能在边缘设备上运行。最快的DNN是YOLO;它在检测真实场景视频中的人脸时提供了相当好的精度。上述方法中最精确的是SSD。它具有足够的处理速度,可用于低功耗设备。
YOLO和SSD方法的主要缺点是它们无法提供有关面部标志的信息。正如我们将进一步看到的,这些信息对于人脸对齐很重要。
MTCNN提供良好的精度并找到面部标志。它足够轻量级,可以在资源受限的边缘设备上运行。
MTCNN检测器
在本系列中,我们将使用MTCNN检测器的免费Keras实现。您可以使用标准pip命令在 Python环境中安装此库。它需要OpenCV 4.1和TensorFlow 2.0(或更高版本)。
您可以通过运行简单的Python代码来测试MTCNN是否安装成功:
import mtcnnprint(mtcnn.__version__)
输出必须显示已安装库的版本——0.1.0。
安装库后,我们可以为简单的人脸检测器编写基于MTCNN的代码:
import os
import time
import numpy as np
import copy
import mtcnn
from mtcnn import MTCNN
import cv2class MTCNN_Detector: def __init__(self, min_size, min_confidence):self.min_size = min_sizeself.f_detector = MTCNN(min_face_size=min_size)self.min_confidence = min_confidencedef detect(self, frame):faces = self.f_detector.detect_faces(frame)detected = []for (i, face) in enumerate(faces):f_conf = face['confidence']if f_conf>=self.min_confidence:detected.append(face)return detecteddef extract(self, frame, face):(x1, y1, w, h) = face['box'](l_eye, r_eye, nose, mouth_l, mouth_r) = Utils.get_keypoints(face)f_cropped = copy.deepcopy(face)move = (-x1, -y1)l_eye = Utils.move_point(l_eye, move)r_eye = Utils.move_point(r_eye, move)nose = Utils.move_point(nose, move)mouth_l = Utils.move_point(mouth_l, move)mouth_r = Utils.move_point(mouth_r, move)f_cropped['box'] = (0, 0, w, h)f_img = frame[y1:y1+h, x1:x1+w].copy()f_cropped = Utils.set_keypoints(f_cropped, (l_eye, r_eye, nose, mouth_l, mouth_r))return (f_cropped, f_img)
检测器类具有带有两个参数的构造函数:min_size——人脸的最小尺寸(以像素为单位);和min_confidence——最小的自信,以确认所检测到的物体是人脸。该类的detect方法使用内部MTCNN检测器获取帧中的人脸,然后过滤检测到的至少具有最小置信度值的对象。最后一个方法,extract,旨在从帧中裁剪面部图像。
我们还需要以下Utils类:
class Utils: @staticmethoddef draw_face(face, color, frame, draw_points=True, draw_rect=True, n_data=None):(x1, y1, w, h) = face['box']confidence = face['confidence']x2 = x1+wy2 = y1+hif draw_rect:cv2.rectangle(frame, (x1, y1), (x2, y2), color, 1)y3 = y1-12if not (n_data is None):(name, conf) = n_datatext = name+ (" %.3f" % conf)else:text = "%.3f" % confidencecv2.putText(frame, text, (x1, y3), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 1, cv2.LINE_AA)if draw_points:(l_eye, r_eye, nose, mouth_l, mouth_r) = Utils.get_keypoints(face)Utils.draw_point(l_eye, color, frame)Utils.draw_point(r_eye, color, frame)Utils.draw_point(nose, color, frame)Utils.draw_point(mouth_l, color, frame)Utils.draw_point(mouth_r, color, frame)@staticmethoddef get_keypoints(face):keypoints = face['keypoints']l_eye = keypoints['left_eye']r_eye = keypoints['right_eye']nose = keypoints['nose']mouth_l = keypoints['mouth_left']mouth_r = keypoints['mouth_right']return (l_eye, r_eye, nose, mouth_l, mouth_r)def set_keypoints(face, points):(l_eye, r_eye, nose, mouth_l, mouth_r) = pointskeypoints = face['keypoints']keypoints['left_eye'] = l_eyekeypoints['right_eye'] = r_eyekeypoints['nose'] = nosekeypoints['mouth_left'] = mouth_lkeypoints['mouth_right'] = mouth_rreturn face@staticmethoddef move_point(point, move):(x, y) = point(dx, dy) = moveres = (x+dx, y+dy)return res@staticmethoddef draw_point(point, color, frame):(x, y) = pointx1 = x-1y1 = y-1x2 = x+1y2 = y+1cv2.rectangle(frame, (x1, y1), (x2, y2), color, 1)@staticmethoddef draw_faces(faces, color, frame, draw_points=True, draw_rect=True, names=None):for (i, face) in enumerate(faces):n_data = Noneif not (names is None):n_data = names[i]Utils.draw_face(face, color, frame, draw_points, draw_rect, n_data)
在MTCNN检测器的输出,每个面对象是具有以下键的字典:box,confidence和keypoints。该keypoints项是一个包含面部标志数据字典:left_eye,right_eye,nose,mouth_left,和mouth_right。Utils类提供简单的访问脸数据并实现多种功能来操纵数据,并绘制图像边界周围的面框。
图像中的人脸检测
现在我们可以编写Python代码来检测图像中的人脸:
d = MTCNN_Detector(30, 0.5)
print("Detector loaded.")f_file = r"C:\PI_FR\frames\frame_5_02.png"
fimg = cv2.imread(f_file)faces = d.detect(fimg)for face in faces:print(face)Utils.draw_faces(faces, (0, 0, 255), fimg, True, True)res_path = r"C:\PI_FR\detect"
f_base = os.path.basename(f_file)
r_file = os.path.join(res_path, f_base+"_detected.png")
cv2.imwrite(r_file, fimg)for (i, face) in enumerate(faces):(f_cropped, f_img) = d.extract(fimg, face)Utils.draw_faces([f_cropped], (255, 0, 0), f_img, True, False)dfname = os.path.join(res_path, f_base + ("_%06d" % i) + ".png")cv2.imwrite(dfname, f_img)
运行上述代码会在detect文件夹中生成此图像。
如您所见,检测器以良好的置信度找到了所有三张脸——约99%。我们还在同一目录中获得了裁剪过的面孔。
对不同的帧运行相同的代码,我们可以测试各种情况的检测。这是两帧的结果。
结果表明,检测器能够找到戴眼镜的人脸,并成功地检测到婴儿的脸。
视频中的人脸检测
在单独的图像上测试了检测器后,现在让我们编写用于检测视频中的人脸的代码:
class VideoFD: def __init__(self, detector):self.detector = detectordef detect(self, video, save_path = None, align = False, draw_points = False):detection_num = 0;capture = cv2.VideoCapture(video)img = Nonedname = 'AI face detection'cv2.namedWindow(dname, cv2.WINDOW_NORMAL)cv2.resizeWindow(dname, 960, 720)frame_count = 0dt = 0face_num = 0# Capture all frameswhile(True): (ret, frame) = capture.read()if frame is None:breakframe_count = frame_count+1t1 = time.time()faces = self.detector.detect(frame)t2 = time.time()p_count = len(faces)detection_num += p_countdt = dt + (t2-t1)if (not (save_path is None)) and (len(faces)>0) :f_base = os.path.basename(video)for (i, face) in enumerate(faces):(f_cropped, f_img) = self.detector.extract(frame, face)if (not (f_img is None)) and (not f_img.size==0):if draw_points:Utils.draw_faces([f_cropped], (255, 0, 0), f_img, draw_points, False)face_num = face_num+1dfname = os.path.join(save_path, f_base + ("_%06d" % face_num) + ".png") cv2.imwrite(dfname, f_img)if len(faces)>0:Utils.draw_faces(faces, (0, 0, 255), frame)# Display the resulting framecv2.imshow(dname,frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcapture.release()cv2.destroyAllWindows() fps = frame_count/dtreturn (detection_num, fps)
该VideoFD类仅包装我们执行MTCNN检测器的实现,并将从视频文件中提取的帧提供给它。它使用OpenCV库中的VideoCapture类。
我们可以使用以下代码启动视频检测器:
d = MTCNN_Detector(50, 0.95)
vd = VideoFD(d)
v_file = r"C:\PI_FR\video\5_3.mp4"save_path = r"C:\PI_FR\detect"
(f_count, fps) = vd.detect(v_file, save_path, False, False)print("Face detections: "+str(f_count))
print("FPS: "+str(fps))
测试显示出良好的结果:在视频文件的大多数帧中都检测到了人脸。Core i7 CPU的处理速度约为20 FPS。对于像人脸检测这样的艰巨任务来说,这令人印象深刻。
下一步
看起来我们可以使用MTCNN检测器的实现来进行实时视频检测。我们的最终目标是在低功耗边缘设备上运行检测器。在开始使用边缘设备进行实验之前,我们必须实现人脸识别流程的另一部分——人脸对齐。在接下来的文章中,我们将解释如何执行基于面部地标检测器已经找到了比对。
https://www.codeproject.com/Articles/5306636/Hybrid-Edge-AI-Face-Detection
(二)混合边缘AI人脸检测相关推荐
- (三)混合边缘AI人脸对齐
目录 介绍 对齐算法 算法的实现 向检测器添加人脸对齐 修改对齐算法 下一步 在这里,我们将简要说明如何在Raspberry Pi上安装MTCNN.TensorFlow和Keras.然后我们在视频文件 ...
- (五)为边缘AI人脸识别创建人脸数据库
目录 介绍 数据库中有什么 创建数据库 填充数据库 下一步 在这里,我们将解释用于人脸识别的简单人脸数据库的结构,开发用于将人脸添加到人脸数据库的实用程序的Python代码,并提供下载人脸以创建数据库 ...
- (一)开始使用混合边缘AI进行面部识别
目录 介绍 人脸检测和对齐 人脸识别 本系列文章 工具和假设 下一步 在这里,我们陈述使用AI和边缘设备进行人脸识别的问题.然后列出主要步骤:检测.对齐.特征提取.识别.最后,简要概述该系列并说明我们 ...
- AI人脸检测智能分析网关新增车辆检测/车牌识别,支持车辆违停告警
AI人脸检测/口罩检测智能分析网关是一款基于AI边缘计算的智能分析硬件设备,内置多种AI深度学习算法,支持对视频监控场景中的人.车.物.行为等进行抓拍.检测与识别,对异常情况进行实时告警等,可广泛应用 ...
- 调用百度ai人脸检测接口
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.人脸检测是什么? 二.使用步骤 1.引入库 2.分包操作 3.添加自定义MyApplication 4.Netwo ...
- AI人脸检测和人脸识别是一个概念吗?有什么区别?
人脸检测 - 也称为面部检测 - 是一种基于人工智能 (AI) 的计算机技术,用于在数字图像中查找和识别人脸.人脸检测技术可应用于各个领域--包括安全.生物识别.执法.娱乐和个人安全--以提供对人员的 ...
- AI人脸检测/安全帽检测智能分析网关告警消息配置——微信告警消息配置
AI智能分析网关内置多种深度学习算法,可支持对接入的多路视频流进行智能检测.智能识别等,包括人脸检测与识别.车辆检测与识别.车牌识别.烟火识别.安全帽识别.区域入侵检测等.将智能分析网关与EasyCV ...
- 微信小程序开发之颜值测试,调用百度AI人脸检测接口
页面效果 插播一下,颜值71,还可以那么狂,哼........ 项目介绍 页面实现上传一张带有人像的图片,点击测试颜值之后返回照片中人像的年龄和颜值,此项目为颜值测试初级,access_token值 ...
- 鲁哇客:超低功耗边缘计算人脸检测方案对比调研
鲁哇客,持续关注超低功耗,在各种领域的发展. 前言 最近对AI(人工智能)的最常见领域:人脸检测,做了一个比较深入的市场调查研究,把调查结果记录如下,可以给有需求的朋友节约一点时间.有其它发现的朋友欢 ...
最新文章
- linux环境insight安装与使用
- 轰动程序员圈的大事:女程序员将代码写到退休,返聘再续传奇
- 【mybatis基础】mybatis开发dao两种方法
- python语言怎么用-科学家们是如何使用 Python 语言的?
- 基于用户投票的排名算法(三):Stack Overflow
- (论坛答疑点滴)DataGrid的EditCommandColumn如何使用图片作为按钮?
- Android中获取手机电量信息
- 你碰到过的最难调试的 Bug 是什么样的?
- 【渝粤教育】广东开放大学 物权法 形成性考核 (43)
- 韩国各大银行纷纷开始引进区块链技术
- C#-求int数组中连续偶数列的个数
- C++/C代码审查表
- 使用lightbox插件实现图片预览功能
- soldworks文件在线预览
- 加法器与数据选择器(数电实验报告)
- cruzer php sandisk 闪迪u盘量产工具_sandisk量产工具(闪迪U盘量产工具) 1.4
- 激活win7 home版 administrator
- java.io.IOException: Server returned HTTP response code: 503 for UR
- C/C++每日一问--判断素数
- vue实现网络监控摄像头直播拍照功能
热门文章
- mysql索引的概念和作用_索引的基本概念及作用
- 壁纸网站的高清图片,完美符合视觉控的你!
- 设计师社区网站-交流、学习、展示
- 平面设计学习社区,让你的作品展示出来
- 2021牛气新年素材模板,你真的不来看一看吗?
- 最火UI素材|短视频、直播APP套件,轻松搞定设计
- Adobe Illustrator的教程:如何建立扁平化设计角色动画
- webstorm代码行数统计_来测试下 2019 你一共写了多少行代码?
- oracle服务名连接慢,数据库 – Oracle SID和服务名称;连接问题
- python设置文件权限_Python os.chmod() 方法