当前位置:首页 > 引流 > 正文内容

免费人脸识别软件(人脸识别软件app推荐)

admin2年前 (2022-10-10)引流662

各位同学好,今天和大家分享一下如何使用MediaPipe完成人脸实时跟踪检测,先放张图看效果,Fps值为14,右侧的输出为:每帧图像是人脸的概率,检测框的左上角坐标及框的宽高。

有需要的可以使用 cv2.VideoCapture(0) 捕获电脑摄像头。本节就用视频进行人脸识别。

   

1. 导入工具包

# 安装opencv
pip install opencv-contrib-python
# 安装mediapipe
pip install mediapipe
# pip install mediapipe --user  #有user报错的话试试这个
 
# 安装之后导入各个包
import cv2  #opencv
import mediapipe as mp
import time

人脸检测的相关说明见官方文档:Face Detection – mediapipe

MediaPipe 人脸检测是一种识别速度超快的方法,具有 6 个特征点和多面支持。它基于BlazeFcae一个轻量级且性能良好的面部检测器,专为移动GPU推理量身定制。该探测器的超实时性能使其能够应用于任何需要精确感兴趣面部区域作为其他任务特定模型输入的实时取景器体验,例如3D面部关键点或几何估计(例如 MediaPipe Face Mesh)面部特征或表情分类以及面部区域分割。

2. 相关函数说明

从mediapipe中导入检测方法,今天我们使用人脸检测
mediapipe.solutions.face_detection。

mediapipe.solutions.hands  # 手部关键点检测
mediapipe.solutions.pose   # 人体姿态检测
mediapipe.solutions.face_mesh  # 人脸网状检测
mediapipe.solutions.face_detection  # 人脸识别
....................

(1)
mediapipe.solutions.face_detection.FaceDetection() 人脸检测函数

参数:

min_detection_confidence: 默认为 0.5。人脸检测模型的最小置信值 (0-1之间),高于该置信度则将检测视为成功。

返回值:

detections:检测到的人脸的集合,其中每个人脸都表示为一个检测原始消息,其中包含 人脸的概率、1 个边界框、6 个关键点(右眼、左眼、鼻尖、嘴巴中心、右耳、左耳)。边界框由 xmin 和 width (由图像宽度归一化为 [0, 1])以及 ymin 和 height (由图像高度归一化为 [0, 1])组成。每个关键点由 x 和 y 组成,分别通过图像宽度和高度归一化为 [0, 1]。

返回值.score: 获取图像是人脸的概率

返回值.location_data: 获取识别框的 x, y, w, h 和 6个关键点的 x, y

返回值
.location_data.relative_bounding_box: 获取识别框的 x, y, w, h

返回值
.location_data.relative_keypoints: 6个关键点的 x, y 组成的列表

(2)
mediapipe.solutions.drawing_utils.draw_landmarks() 绘制手部关键点的连线

参数:

image: 需要画图的原始图片

landmark_list: 检测到的手部关键点坐标

connections: 连接线,需要把那些坐标连接起来

landmark_drawing_spec: 坐标的颜色,粗细

connection_drawing_spec: 连接线的粗细,颜色等

3. 只绘制识别框和关键点

使用 cv2.VideoCapture() 读取视频文件时,文件路径最好不要出现中文,防止报错。

变量.read() 每次执行就从视频中提取一帧图片,需要循环来不断提取。用success来接收是否能打开,返回True表示可以打开。img保存返回的的每一帧图像。

由于读入视频图像通道一般为RGB,而opencv中图像通道的格式为BGR,因此需要 cv2.cvtColor() 函数将opencv读入的视频图像转为RGB格式 cv2.COLOR_BGR2RGB。

import cv2
import mediapipe as mp
import time
 
# 导入人脸识别模块
mpFace = mp.solutions.face_detection
# 导入绘图模块
mpDraw = mp.solutions.drawing_utils
# 自定义人脸识别方法,最小的人脸检测置信度0.5
faceDetection = mpFace.FaceDetection(min_detection_confidence=0.5)
 
#(1)导入视频
filepath = 'C:\GameDownload\Deep Learning\face.mp4'
cap = cv2.VideoCapture(filepath)
 
pTime = 0  # 记录每帧图像处理的起始时间
 
#(2)处理每一帧图像
while True:
    
    # 每次取出一帧图像,返回是否读取成功(True/False),以及读取的图像数据
    success, img = cap.read()
    
    # 将opencv导入的BGR图像转为RGB图像
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    # 将每一帧图像传给人脸识别模块
    results = faceDetection.process(imgRGB)
    
    # 如果检测不到人脸那就返回None
    if results.detections:
        
        # 返回人脸关键点索引index,和关键点的坐标信息
        for index, detection in enumerate(results.detections):
            
            # 遍历每一帧图像并打印结果
            print(index, detection)  
            # 每帧图像返回一次是人脸的几率,以及识别框的xywh,后续返回关键点的xy坐标
            # print(detection.score)  # 是人脸的的可能性
            # print(detection.location_data.relative_bounding_box)  # 识别框的xywh
             
            # 绘制关键点信息及边界框
            mpDraw.draw_detection(img, detection)
    
    # 记录每帧图像处理所花的时间
    cTime = time.time()
    fps = 1/(cTime-pTime)  #计算fps值
    pTime = cTime  # 更新每张图像处理的初始时间
    
    # 把fps值显示在图像上,img画板;fps变成字符串;显示的位置;设置字体;字体大小;字体颜色;线条粗细
    cv2.putText(img, f'FPS: {str(int(fps))}', (10,50), cv2.FONT_HERSHEY_PLAIN, 3, (0,255,0), 3) 
    
    # 显示图像,输入窗口名及图像数据
    cv2.imshow('image', img)    
    if cv2.waitKey(50) & 0xFF==27:  #每帧滞留50毫秒后消失,ESC键退出
        break
 
# 释放视频资源
cap.release()
cv2.destroyAllWindows()

结果如下图所示,准确找到了人脸位置,并绘制识别框。右侧打印识别框和关键点信息。

   

4. 编辑识别框,保存人脸位置信息

在这里我更加关注识别框的位置位置,不太关心关键点的坐标信息,因此接下来我们单独绘制识别框,并把每一帧图像的人脸概率显示出来。如果有同学更关注人脸关键点,可以使用mediapipe的人脸网状检测,能得到的关键点非常多,这个我在后续章节也会写。

因此,接下来我们在上面代码的基础上继续补充。
detection.location_data.relative_bounding_box 获取检测框的左上角坐标和检测框的宽高,保保存在bbox中。如下我们可以看到识别框的信息都是归一化之后的,需要将其转换为像素坐标。

IN[21]: detection.location_data.relative_bounding_box
Out[21]: 
xmin: 0.6636191606521606
ymin: 0.16451001167297363
width: 0.1620280146598816
height: 0.28804928064346313

转换方法也很简单,只需要将比例长度x和w乘以实际图像宽度即可得到像素长度下的x和w,同理y和h。注意,像素长度一定是整数,如[200,200],比例长度是小数,如[0.5, 0.5]

使用自定义矩形绘制函数cv2.rectangle(),现在有了像素坐标下的左上坐标xy,框的宽w和高h。就可以在原图像img上把框绘制出来。

detection.score 获取检测框的人脸概率值,返回只有一个元素的列表。detection.score[0] 提取这个元素,返回浮点型数值。

# 导入人脸识别模块
mpFace = mp.solutions.face_detection
# 导入绘图模块
mpDraw = mp.solutions.drawing_utils
# 自定义人脸识别方法,最小的人脸检测置信度0.5
faceDetection = mpFace.FaceDetection(min_detection_confidence=0.5)
 
#(1)导入视频
filepath = 'C:\GameDownload\Deep Learning\face.mp4'
cap = cv2.VideoCapture(filepath)
 
pTime = 0  # 记录每帧图像处理的起始时间
 
boxlist = []  # 保存每帧图像每个框的信息
 
#(2)处理每一帧图像
while True:
    
    # 每次取出一帧图像,返回是否读取成功(True/False),以及读取的图像数据
    success, img = cap.read()
    
    # 将opencv导入的BGR图像转为RGB图像
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    # 将每一帧图像传给人脸识别模块
    results = faceDetection.process(imgRGB)
    
    # 如果检测不到人脸那就返回None
    if results.detections:
        
        # 返回人脸索引index(第几张脸),和关键点的坐标信息
        for index, detection in enumerate(results.detections):
            
            # 遍历每一帧图像并打印结果
            # print(index, detection)  
            # 每帧图像返回一次是人脸的几率,以及识别框的xywh,后续返回关键点的xy坐标
            print(detection.score)  # 是人脸的的可能性
            print(detection.location_data.relative_bounding_box)  # 识别框的xywh
            
            # 设置一个边界框,接收所有的框的xywh及关键点信息
            bboxC = detection.location_data.relative_bounding_box
            
            # 接收每一帧图像的宽、高、通道数
            ih, iw, ic = img.shape
            
            # 将边界框的坐标点从比例坐标转换成像素坐标
            # 将边界框的宽和高从比例长度转换为像素长度
            bbox = (int(bboxC.xmin * iw), int(bboxC.ymin * ih),  
                   int(bboxC.width * iw), int(bboxC.height * ih))
            
            # 有了识别框的xywh就可以在每一帧图像上把框画出来
            cv2.rectangle(img, bbox, (255,0,0), 5)  # 自定义绘制函数,不适用官方的mpDraw.draw_detection
            
            # 把人脸的概率显示在检测框上,img画板,概率值*100保留两位小数变成百分数,再变成字符串
            cv2.putText(img, f'{str(round(detection.score[0] * 100, 2))}%', 
                        (bbox[0], bbox[1]-20),   # 文本显示的位置,-20是为了不和框重合
                        cv2.FONT_HERSHEY_PLAIN,   # 文本字体类型
                        2, (0,0,255), 2)   # 字体大小; 字体颜色; 线条粗细
            
            # 保存索引,人脸概率,识别框的x/y/w/h
            boxlist.append([index, detection.score, bbox])
 
    # 记录每帧图像处理所花的时间
    cTime = time.time()
    fps = 1/(cTime-pTime)  #计算fps值
    pTime = cTime  # 更新每张图像处理的初始时间
    
    # 把fps值显示在图像上,img画板;fps变成字符串;显示的位置;设置字体;字体大小;字体颜色;线条粗细
    cv2.putText(img, f'FPS: {str(int(fps))}', (10,50), cv2.FONT_HERSHEY_PLAIN, 3, (0,255,0), 3) 
    
    # 显示图像,输入窗口名及图像数据
    cv2.imshow('image', img)    
    if cv2.waitKey(50) & 0xFF==27:  #每帧滞留50毫秒后消失,ESC键退出
        break
 
# 释放视频资源
cap.release()
cv2.destroyAllWindows()

结果如下图所示,右侧输出每帧图像的每个识别框的概率和框坐标

   

5. 优化识别框

接下来把识别框做的好看一些,只需要修改矩形框样式即可,我们接着上面的代码编辑。把识别框宽度调细一些,在四个角上添加粗线段。

# 导入人脸识别模块
mpFace = mp.solutions.face_detection
# 导入绘图模块
mpDraw = mp.solutions.drawing_utils
# 自定义人脸识别方法,最小的人脸检测置信度0.5
faceDetection = mpFace.FaceDetection(min_detection_confidence=0.5)
 
#(1)导入视频
filepath = 'C:\GameDownload\Deep Learning\face.mp4'
cap = cv2.VideoCapture(filepath)
 
pTime = 0  # 记录每帧图像处理的起始时间
 
boxlist = []  # 保存每帧图像每个框的信息
 
#(2)处理每一帧图像
while True:
    
    # 每次取出一帧图像,返回是否读取成功(True/False),以及读取的图像数据
    success, img = cap.read()
    
    # 将opencv导入的BGR图像转为RGB图像
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    # 将每一帧图像传给人脸识别模块
    results = faceDetection.process(imgRGB)
    
    # 如果检测不到人脸那就返回None
    if results.detections:
        
        # 返回人脸索引index(第几张脸),和关键点的坐标信息
        for index, detection in enumerate(results.detections):
            
            # 遍历每一帧图像并打印结果
            # print(index, detection)  
            # 每帧图像返回一次是人脸的几率,以及识别框的xywh,后续返回关键点的xy坐标
            print(detection.score)  # 是人脸的的可能性
            print(detection.location_data.relative_bounding_box)  # 识别框的xywh
            
            # 设置一个边界框,接收所有的框的xywh及关键点信息
            bboxC = detection.location_data.relative_bounding_box
            
            # 接收每一帧图像的宽、高、通道数
            ih, iw, ic = img.shape
            
            # 将边界框的坐标点从比例坐标转换成像素坐标
            # 将边界框的宽和高从比例长度转换为像素长度
            bbox = (int(bboxC.xmin * iw), int(bboxC.ymin * ih),  
                   int(bboxC.width * iw), int(bboxC.height * ih))
            
            # 有了识别框的xywh就可以在每一帧图像上把框画出来
            # cv2.rectangle(img, bbox, (255,0,0), 5)  # 自定义绘制函数,不适用官方的mpDraw.draw_detection
            
            # 把人脸的概率显示在检测框上,img画板,概率值*100保留两位小数变成百分数,再变成字符串
            cv2.putText(img, f'{str(round(detection.score[0] * 100, 2))}%', 
                        (bbox[0], bbox[1]-20),   # 文本显示的位置,-20是为了不和框重合
                        cv2.FONT_HERSHEY_PLAIN,   # 文本字体类型
                        2, (0,0,255), 2)   # 字体大小; 字体颜色; 线条粗细
            
            # 保存索引,人脸概率,识别框的x/y/w/h
            boxlist.append([index, detection.score, bbox])
            
            
            #(3)修改识别框样式
            x, y, w, h = bbox  # 获取识别框的信息,xy为左上角坐标点
            x1, y1 = x+w, y+h  # 右下角坐标点
            
            # 绘制比矩形框粗的线段,img画板,线段起始点坐标,线段颜色,线宽为8
            cv2.line(img, (x,y), (x+20,y), (255,0,255), 4)  
            cv2.line(img, (x,y), (x,y+20), (255,0,255), 4)
            
            cv2.line(img, (x1,y1), (x1-20,y1), (255,0,255), 4)  
            cv2.line(img, (x1,y1), (x1,y1-20), (255,0,255), 4)
            
            cv2.line(img, (x1,y), (x1-20,y), (255,0,255), 4)  
            cv2.line(img, (x1, y), (x1, y+20), (255, 0, 255), 4)
 
            cv2.line(img, (x,y1), (x+20,y1), (255,0,255), 4)
            cv2.line(img, (x,y1), (x,y1-20), (255,0,255), 4)            
 
            # 在每一帧图像上绘制矩形框
            cv2.rectangle(img, bbox, (255,0,255), 1)  # 自定义绘制函数
 
    # 记录每帧图像处理所花的时间
    cTime = time.time()
    fps = 1/(cTime-pTime)  #计算fps值
    pTime = cTime  # 更新每张图像处理的初始时间
    
    # 把fps值显示在图像上,img画板;fps变成字符串;显示的位置;设置字体;字体大小;字体颜色;线条粗细
    cv2.putText(img, f'FPS: {str(int(fps))}', (10,50), cv2.FONT_HERSHEY_PLAIN, 3, (0,255,0), 3) 
    
    # 显示图像,输入窗口名及图像数据
    cv2.imshow('image', img)    
    if cv2.waitKey(50) & 0xFF==27:  #每帧滞留50毫秒后消失,ESC键退出
        break
 
# 释放视频资源
cap.release()
cv2.destroyAllWindows()

修改后的检测框效果如下

   

我们将坐标信息存放在了boxlist中,boxlist.append([index, detection.score, bbox]) 存放人脸索引、评分、检测框信息,把它打印出来看一下,比如某帧图像所在的视频有3张脸,每一帧都会输出0、1、2三个识别框的概率,左上角坐标xy,框的宽高wh

。。。。。。。。。。。。。。。。。。。。。。。。。
 [0, [0.9619430303573608], (98, 100, 96, 96)],
 [1, [0.9173532128334045], (457, 65, 118, 118)],
 [2, [0.8985080122947693], (268, 52, 123, 123)],
 [0, [0.9615015983581543], (98, 100, 97, 97)],
 [1, [0.9164762496948242], (457, 65, 118, 118)],
 [2, [0.9118367433547974], (269, 53, 123, 123)],
 [0, [0.9616674780845642], (97, 100, 97, 97)],
 [1, [0.9218802452087402], (272, 53, 122, 122)],
 [2, [0.9176990389823914], (456, 65, 118, 118)],
 [0, [0.9638006091117859], (97, 101, 97, 97)],
 [1, [0.9180505275726318], (276, 56, 119, 119)],
 [2, [0.9177079796791077], (456, 64, 118, 118)],
  。。。。。。。。。。。。。。。。。。。。。。。。。。

标签: app 软件

扫描二维码推送至手机访问。

版权声明:本文中部分文字、图片、音频、视频来源于互联网及公开渠道,仅供学习参考,版权归原创者所有! 如侵犯到您的权益,请及时通知我们!我们将在第一时间内删除。

本文链接:https://73ya.com/yinliu/1498.html

分享给朋友:

“免费人脸识别软件(人脸识别软件app推荐)” 的相关文章

短视频高清素材哪里找 抖音短视频高清素材在哪里找

在短视频行业如此火热的当下,成千上万的小白纷纷入行,但很多新手前期运营时都会遇到一个问题,那就是,素材找不到。今天就给大家介绍一下,几个免费找素材的网站: 01 易撰 易撰的视频库用来找素材非常方便,拥有几乎全部短视频平台的内容,包括抖音、火山小视频、美拍、快手等,不仅素材库内容...

短视频制作的基本流程,各种小技巧

关于视频制作并不是那么简单的,很多人都很喜欢短视频制作,觉得新颖有趣还能挣钱。为自己带来快乐的同时还可以为学习许多技能,那么新手小白想要对短视频制作的基本流程了解并没有那么深入。那么接下来就跟着小编一起来看看基本流程是什么吧。 短视频制作的基本流程 1. 脚本 脚本是短视频的核心,一个...

短视频制作软件推荐大全,精品中的精品

当你无聊的时候你会干啥,现在拿起手机的第一件事就是打开自己喜欢的app观看短视频。现在的短视频不拘于门槛,很多人都很喜欢观看短视频。人们的时间逐渐被短视频占据,不少人通过拍摄短视频年入百万。大学里的视频博主也越来越多了。所以你就会发现有一个适合自己的短视频制作软件有多么重要。好物都在下面...

怎么剪辑出优秀的短视频,不收费的剪辑软件来了

怎么剪辑出优秀的短视频,一个剧本出来以后靠的是什么,后期落下了坚强的眼泪。一个成品出来必须要依靠剪辑软件,那么怎么剪辑出优秀的短视频呢。学会灵活运用,你就是那个大神,快来看看有什么剪辑软件吧。 01.快剪辑 “快剪辑”作为一款功能齐全、操作简捷、可以在线边看边剪的免费PC端视频剪辑软件...

快速学会短视频制作,短视频的优势有哪些

转眼之间,2022已经来临,在短视频的红利期越多的人倾向于学习短视频。还有各种直播带货,产品运营,精彩剧本,搞笑视频,形式各样,但是最后的目的是什么。盈利和喜欢。你只有有想要做的事情,感兴趣才能做的更好。那么新手小白也能在这样的平台上快速的展现身手。那么接下来快速学会短视频制作。跟着小编...

新手小白怎么制作精美的短视频,新手小白的定位是

抖音刚开始做的时候其实并不是特别容易上手,万事开头难,做好第一步开头,后面就很容易上手了,那么对于新手小白怎么制作精美的短视频呢?废话少说,咱们直接进入正题。直接观看满满的干货吧。 第一,选择抖音的分类众所周知,抖音的分类有搞笑类、正能量类、才艺类、生活技能类、魔术类等,我们在做抖音运...