opencv人脸识别效果好吗(通过opencv制作人脸识别的窗口)
opencv人脸识别效果好吗
通过opencv制作人脸识别的窗口
人脸检测,看似要使用深度学习,觉得很高大牛逼,其实通过opencv就可以制作人脸识别的窗口。
今天,Runsen教大家将构建一个简单的Python脚本来处理图像中的人脸,使在OpenCV库中两种方法 。
首先,我们将使用haar级联分类器,这对初学者来说是一种简单的方法(也不太准确),也是最方便的方法。
其次是单发多盒检测器(或简称SSD),这是一种深度神经网络检测图像中对象的方法。
使用Haar级联进行人脸检测
基于haar特征的级联分类器的,OpenCV已经为我们提供了一些分类器参数,因此我们无需训练任何模型,直接使用。
opencv的安装
- pip install opencv-python
我们首先导入OpenCV:
- import cv2
下面对示例图像进行测试,我找来了我学校的两个漂亮美女的图像:
- image = cv2.imread("beauty.jpg" alt="opencv人脸识别效果好吗(通过opencv制作人脸识别的窗口)" border="0" />)
函数imread()从指定的文件加载图像,并将其作为numpy的 N维数组返回。
在检测图像中的面部之前,我们首先需要将图像转换为灰度图:
- image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
下面,因为要初始化人脸识别器(默认的人脸haar级联),需要下载对应的参数xml文件,
这里选择最初的haarcascade_frontalface_default.xml
下面代码就是加载使用人脸识别器
- face_cascade = cv2.CascadeClassifier("haarcascade_fontalface_default.xml")
现在让我们检测图像中的所有面孔:
- # 检测图像中的所有人脸
- faces = face_cascade.detectMultiScale(image_gray)
- print(f"{len(faces)} faces detected in the image.")
detectMultiScale() 函数将图像作为参数并将不同大小的对象检测为矩形列表,因此我们绘制矩形,同样有rectangle方法提供
- #为每个人脸绘制一个蓝色矩形
- for x, y, width, height in faces:
- # 这里的color是 蓝 黄 红,与rgb相反,thickness设置宽度
- cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)
最后,让我们保存新图像:
- cv2.imwrite("beauty_detected.jpg" alt="opencv人脸识别效果好吗(通过opencv制作人脸识别的窗口)" border="0" />, image)
基于haar特征的级联分类器的结果图
我们惊奇的发现图片1是没有设备出来的,这是因为存在障碍物,
我们惊奇的发现图片2是竟然设别出来了两个窗口。
Haar级联结合摄像头
使用Haar级联进行人脸检测可以说是opencv最基础的效果,下面我们利用摄像头将Haar级联进行合并,这样就可以达到开头的效果。
- import cv2
- #创建新的cam对象
- cap = cv2.VideoCapture(0)
- #初始化人脸识别器(默认的人脸haar级联)
- face_cascade = cv2.CascadeClassifier("haarcascade_fontalface_default.xml")
- while True:
- # 从摄像头读取图像
- _, image = cap.read()
- # 转换为灰度
- image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
- # 检测图像中的所有人脸
- faces = face_cascade.detectMultiScale(image_gray, 1.3, 5)
- # 为每个人脸绘制一个蓝色矩形
- for x, y, width, height in faces:
- cv2.rectangle(image, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)
- cv2.imshow("image", image)
- if cv2.waitKey(1) == ord("q"):
- break
- cap.release()
- cv2.destroyAllWindows()
使用SSD的人脸检测
上面的效果是已经过时了,但是OpenCV为我们提供了包装中dnn模块cv2,从而可以直接加载经过预训练的深度学习模型。
2015年底有人提出了一个实时对象检测网络Single Shot MultiBox Detector缩写为SSD
SSD对象检测的Model
SSD对象检测网络简单说可以分为三个部分:
- 基础网络(backbone) 这里为VGG16
- 特征提取Neck,构建多尺度特征
- 检测头 – 非最大抑制与输出
要开始使用SSD在OpenCV中,需要下载RESNET人脸检测模型和其预训练的权重,然后将其保存到代码weights工作目录:
RESNET人脸检测模型和权重
- import cv2
- import numpy as np
- # 下载链接:https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt
- prototxt_path = "weights/deploy.prototxt.txt"
- # 下载链接:https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180205_fp16/res10_300x300_ssd_iter_140000_fp16.caffemodel
- model_path = "weights/res10_300x300_ssd_iter_140000_fp16.caffemodel"
- # 加载Caffe model
- model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path)
- # 读取所需图像
- image = cv2.imread("beauty.jpg" alt="opencv人脸识别效果好吗(通过opencv制作人脸识别的窗口)" border="0" />)
- # 获取图像的宽度和高度
- h, w = image.shape[:2]
现在,需要这个图像传递到神经网络中,由于下载的模型是(300, 300) px的。
因此,我们需要将图像调整为的(300, 300)px形状:
- # 预处理图像:调整大小并执行平均减法。104.0, 177.0, 123.0 表示b通道的值-104,g-177,r-123
- # 在深度学习中通过减去数人脸据集的图像均值而不是当前图像均值来对图像进行归一化,因此这里写死了
- blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300),(104.0, 177.0, 123.0))
将此blob对象用作神经网络的输入,获取检测到的面部:
- # 将图像输入神经网络
- model.setInput(blob)
- # 得到结果
- output = np.squeeze(model.forward())
输出对象output 具有所有检测到的对象,在这种情况下一般都是人脸,让我们遍历output,并在取一个置信度大于50%的判断条件:
- font_scale = 1.0
- # output.shape ==(200, 7)
- for i in range(0, output.shape[0]):
- # 置信度
- confidence = output[i, 2]
- # 如果置信度高于50%,则绘制周围的方框
- if confidence > 0.5:
- # 之前将图片变成300*300,接下来提取检测到的对象的模型的置信度后,我们得到周围的框 output[i, 3:7],然后将其width与height原始图像的和相乘,以获得正确的框坐标
- box = output[i, 3:7] * np.array([w, h, w, h])
- # 转换为整数
- start_x, start_y, end_x, end_y = box.astype(np.int)
- # 绘制矩形
- cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)
- # 添加文本
- cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)
最后我们展示并保存新图像:
- cv2.imshow("image", image)
- cv2.waitKey(0)
- cv2.imwrite("beauty_detected.jpg" alt="opencv人脸识别效果好吗(通过opencv制作人脸识别的窗口)" border="0" />, image)
下面是完整代码
- import cv2
- import numpy as np
- # 下载链接:https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt
- prototxt_path = "weights/deploy.prototxt.txt"
- # 下载链接:https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180205_fp16/res10_300x300_ssd_iter_140000_fp16.caffemodel
- model_path = "weights/res10_300x300_ssd_iter_140000_fp16.caffemodel"
- model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path)
- image = cv2.imread("beauty.jpg" alt="opencv人脸识别效果好吗(通过opencv制作人脸识别的窗口)" border="0" />)
- h, w = image.shape[:2]
- blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300),(104.0, 177.0, 123.0))
- model.setInput(blob)
- output = np.squeeze(model.forward())
- font_scale = 1.0
- for i in range(0, output.shape[0]):
- confidence = output[i, 2]
- if confidence > 0.5:
- box = output[i, 3:7] * np.array([w, h, w, h])
- start_x, start_y, end_x, end_y = box.astype(np.int)
- cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)
- cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)
- cv2.imshow("image", image)
- cv2.waitKey(0)
- cv2.imwrite("beauty_detected.jpg" alt="opencv人脸识别效果好吗(通过opencv制作人脸识别的窗口)" border="0" />, image)
SSD结合摄像头的人脸检测
SSD结合摄像头的人脸检测方法更好,更准确,但是每秒传输帧数FPS方面可能低,因为它不如Haar级联方法快,但这问题并不大。
下面是SSD结合摄像头的人脸检测的全部代码
- import cv2
- import numpy as np
- prototxt_path = "weights/deploy.prototxt.txt"
- model_path = "weights/res10_300x300_ssd_iter_140000_fp16.caffemodel"
- model = cv2.dnn.readNetFromCaffe(prototxt_path, model_path)
- cap = cv2.VideoCapture(0)
- while True:
- _, image = cap.read()
- h, w = image.shape[:2]
- blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0))
- model.setInput(blob)
- output = np.squeeze(model.forward())
- font_scale = 1.0
- for i in range(0, output.shape[0]):
- confidence = output[i, 2]
- if confidence > 0.5:
- box = output[i, 3:7] * np.array([w, h, w, h])
- start_x, start_y, end_x, end_y = box.astype(np.int)
- cv2.rectangle(image, (start_x, start_y), (end_x, end_y), color=(255, 0, 0), thickness=2)
- cv2.putText(image, f"{confidence*100:.2f}%", (start_x, start_y-5), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255, 0, 0), 2)
- cv2.imshow("image", image)
- if cv2.waitKey(1) == ord("q"):
- break
- cv2.destroyAllWindows()
- cap.release()
原文链接:https://mp.weixin.qq.com/s/GLW19PdLIA5gdp75DSsghw
- python操作redis(Python获取Redis所有Key以及内容的方法)
- python pandas 匹配值(python 使用pandas计算累积求和的方法)
- python实现数据的预测(Python基于scipy实现信号滤波功能)
- python怎么抽取微信图片(Python 一键制作微信好友图片墙的方法)
- pythonmatplotlib怎么用(Python matplotlib画图与中文设置操作实例分析)
- python类中的数据封装(基于python生成器封装的协程类)
- python获取json结果保存文本(Python JSON格式数据的提取和保存的实现)
- python怎么查看函数的返回值(python在回调函数中获取返回值的方法)
- 使用python编辑个人名片(python实现名片管理系统项目)
- python的静态方法和类方法(深入解析python中的实例方法、类方法和静态方法)
- 在python中如何删除指定的行(Python删除n行后的其他行方法)
- python成绩判断系统(Python根据成绩分析系统浅析)
- opencv轮廓模糊识别(Opencv+Python实现图像运动模糊和高斯模糊的示例)
- 卷积神经网络python实现(Python通过TensorFlow卷积神经网络实现猫狗识别)
- python虚拟变量教程(Python中psutil的介绍与用法)
- python微信红包分配(PHP切割整数工具类似微信红包金额分配的思路详解)
- 魔兽争霸3自定义战役少年杰雷 2(魔兽争霸3自定义战役少年杰雷)
- 今日菜价 芥兰涨幅最高 1.33 ,花菜降幅最高 3.10(今日菜价芥兰涨幅最高)
- 今日菜价 椰菜涨幅最高 3.25 ,水空心菜降幅最高 2.58(今日菜价椰菜涨幅最高)
- 今日菜价 红三鱼涨幅最高 4.41 ,黄鳝降幅最高 5.06(红三鱼涨幅最高)
- 今日菜价 西生菜涨幅最高 6.19 ,生菜降幅最高 5.38(西生菜涨幅最高)
- 今日菜价 青豆角涨幅最高 0.70 ,菜心降幅最高 5.55(青豆角涨幅最高)
热门推荐
- css中最常用的选择符(CSS 类选择符和ID选择符的区别)
- 数据库知识点总结归纳(数据库日常练习题,每天进步一点点1)
- layui导航栏(使用layui实现左侧菜单栏及动态操作tab项的方法)
- vue的watch用法(Vue3中watch的用法与最佳实践指南)
- 在mysql中如何授权(MySQL 角色role功能介绍)
- dedecms增加导航内容(dedecms中将系统的data目录迁移到web以外目录)
- python类定义(浅谈python新式类和旧式类区别)
- docker 部署netcore(关于Jenkins + Docker + ASP.NET Core自动化部署的问题避免踩坑)
- dedecms列表栏目样式修改(在dedecms文章页中获取当前栏目字段如content字段)
- python获取微信用户(python-itchat 获取微信群用户信息的实例)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9