MediaPipe人脸检测
MediaPipe人脸检测是一种超快速的人脸检测解决方案,具有6个界标和多人脸支持。它基于BlazeFace,BlazeFace是为移动GPU推理量身定制的轻巧且性能良好的面部检测器。检测器的超实时性能使其可应用于需要准确地关注面部区域作为其他任务特定模型:
例如 1、3D面部关键点或几何估计MediaPipe Face Mesh 2、面部特征或表情分类,以及面部区域分割等
BlazeFace使用了一个轻量级的特征提取网络,该网络受MobileNetV1 / V2的启发,但与MobileNetV1 / V2不同,该网络可以有效运行在移动设备上,且速度极快,该模型是从Single Shot MultiBox Detector(SSD)修改而来的GPU友好锚定方案,以及替代非最大抑制的改进的平局分辨率策略。
下图为BlazeFace的一些框图,关于BlazeFace的详细细节,可以下载BlazeFace的官方论文进行查看
BlazeFace
MediaPipe人脸检测代码示例:
当然在进行本期文章前,首先需要安装MediaPipe,安装MediaPipe可以直接在cmd命令框中输入如下
Python –m pip install MediaPipe,等待系统自动安装即可,这里需要提醒一下由于最新的MediaPipe版本不再支持python3.7以下的版本,所以MediaPipe的代码最好运行在python3.7以上版本
import cv2
import mediapipe as mp
mp_face_detction = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils
首先我们import需要的mediapipe库,然后定义一个face人脸检测模型
mp_face_detction = mp.solutions.face_detection
其函数输入只有一个参数:
MIN_DETECTION_CONFIDENCE
[0.0, 1.0]来自人脸检测模型的最小置信度值,预设为0.5
此函数输出如下数据:
检测到的面部的集合,其中每个面部都表示为检测原型数据,其中包含边界框和6个关键点(右眼,左眼,鼻尖,嘴中部,右耳和左耳)。边界框由xmin和width(均[0.0, 1.0]通过图像宽度标准化)和ymin和height(均[0.0, 1.0]通过图像高度标准化)组成。每个关键点由x和组成y,分别[0.0, 1.0]通过图像的宽度和高度将其标准化。
# 图片人脸检测:
with mp_face_detection.FaceDetection(
min_detection_confidence=0.5) as face_detection:
for idx, file in enumerate(file_list):
image = cv2.imread(file)
# 转换图片到RGB颜色空间
results = face_detection.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 画出检测到的人脸
if not results.detections:
continue
annotated_image = image.copy()
代码截图
首先我们使用函数
with mp_face_detection.FaceDetection(
min_detection_confidence=0.5) as face_detection:
建立一个face_detection检测模型,模型检测置信度设置为0.5,意思是置信度小于0.5的人脸不再显示给用户
然后我们遍历file_list下的图片数据,进行图片的读取
读取到图片后,由于OpenCV使用BGR颜色空间,一般我们习惯上RGB颜色空间,因此后期开发的第三方库一般的颜色空间都是RGB颜色空间,这里我们使用cv2.cvtColor(image, cv2.COLOR_BGR2RGB)函数对图片进行颜色空间的转换
最后使用face_detection.process函数对图片进行人脸的检测
当然,我们可以设置当检测不到人脸时,直接跳过图片的展示
当检测到人脸后,我们便得到了人脸的方框以及6个检测点(右眼,左眼,鼻尖,嘴中部,右耳和左耳)
for detection in results.detections:
print(mp_face_detection.get_key_point(
detection, mp_face_detection.FaceKeyPoint.NOSE_TIP))
mp_drawing.draw_detection(annotated_image, detection)
cv2.imwrite('/tmp/annotated_image' + str(idx) + '.png', annotated_image)
cv2.imshow('annotated_image',annotated_image)
cv2.waitKey(0)
代码截图
当检测到人脸后,我们便可以遍历检测到的结果,然后使用mp_drawing.draw_detection函数对检测到的图片进行画图,并保存检测图片到本地。
人脸检测
当然OpenCV也有类似的人脸检测与人脸识别方面的应用,如下专栏,详细介绍了人脸检测与人脸识别应用方面的文章
Mediapipe 检测实时检测代码实现
当然mediapipe也同样支持视频人脸的实时检测
import cv2
import mediapipe as mp
mp_face_detction = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils
跟图片人脸检测类似,我们import mediapipe以及其他需要的库
# 视频人脸检测
cap = cv2.VideoCapture(0)
with mp_face_detection.FaceDetection(
min_detection_confidence=0.5) as face_detection:
while cap.isOpened():
success, image = cap.read()
if not success:
continue
# Flip 图片
# BGR 图片转化到 RGB.
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
# 为了提高性能,可以选择将图像标记为不可写,以便通过引用传递
image.flags.writeable = False
results = face_detection.process(image)
代码截图
首先我们使用OpenCV打开默认摄像头cv2.VideoCapture(0),当然这里也可以传递一个视频的路径地址来检测视频中的人脸
当摄像头打开后,我们便可以从视频帧中提取视频图片,然后按照图片检测的步骤进行人脸的检测
这里为了增强图片数据,我们首先对图片进行翻转,这里是因为前置摄像头拍摄出来的图片都是被镜像过的,然后我们再转换图片到RGB颜色空间,当然为了提高性能,我们标记图片的读写操作标志位,首先设置为不可写
然后使用face_detection.process函数对图片进行人脸的检测
# 画出检测到的人脸
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.detections:
for detection in results.detections:
mp_drawing.draw_detection(image, detection)
cv2.imshow('MediaPipe Face Detection', image)
if cv2.waitKey(5) & 0xFF == ord('q'):
break
cap.release()
代码截图
当检测到人脸后,我们设置图片的可写标签为true,以便我们更改图片,然后我们遍历检测到的人脸数据,并把人脸边框已经人脸6点检测点显示到原始图片上,然后循环检测视频帧中的人脸图片,这样便可以实现了人脸视频检测。
有关MediaPipe的其他文章
当然mediapipe不仅可以进行人脸的检测,还可以提供更加详细的人脸识别数据,更多文章,请参考:
利用机器学习,进行人体33个2D姿态检测与评估
利用机器学习,进行人手的21个3D手关节坐标检测
利用机器学习进行人脸468点的3D坐标检测,并生成3D模型
MediaPipe 集成人脸识别,人体姿态评估,人手检测模型
热门跟贴