关于人脸检测和人脸关键点检测的详解(涉及Opencv 和Dlibd)

news2024/11/15 15:49:23

关于人脸识别,大家入门opencv,最常见的是用opencv级联分类器器里面的函数进行人脸的识别(当然里面包含很多各种物体的分类器,大家可以一一测试),今天我们来练一下关于人脸识别的级联器。

1,opencv +Haar Cascade(人脸检测)

①首先要找到人脸检测级联器的xml文件,打开你的电脑,在你安装的python-opencv的库里面,打开data文件,就可以看到很多级联器的xml文件,选择自己要用的文件,给复制到python文件的同一目录下:

 ②运行脚本文件.py进行人脸检测(摄像头或者视频下检测)

import cv2
video=cv2.VideoCapture(0)#打开摄像头
face_fea=cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')#用级联器打开人脸特征识别算法
while True:#while True 语句中一定要有结束该循环的break语句,否则会一直循环下去的。
    open,image=video.read()
    if not open:
        print('视频结束')
        break
        #图片灰度化
    gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    face=face_fea.detectMultiScale(gray)
    for x,y,w,h in face:
        cv2.rectangle(image,pt1=(x,y),pt2=(x+w,y+h),color=[0,0,255],thickness=2)
    frame = cv2.flip(image, 1)  # 摄像头是和人对立的,将图像左右调换回来正常显示。
    cv2.imshow('image',frame)
    key=cv2.waitKey(1000//24)
    if key==ord('q'):#q的啊克斯吗
        print('用户达到自己的需要')
        break
cv2.destroyAllWindows()
video.release()#释放摄像头资源

就可以检测到人脸图像:

 ③当然也可以检测图片上的人脸了,运行脚本:

import cv2
image=cv2.imread('222.jpg')
image=cv2.resize(image,(600,800))
face_fea=cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')#用级联器打开人脸特征识别算法
 #图片灰度化
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
face=face_fea.detectMultiScale(gray)
for x,y,w,h in face:
    cv2.rectangle(image,pt1=(x,y),pt2=(x+w,y+h),color=[0,0,255],thickness=2)
cv2.imshow('image',image)
cv2.waitKey(0)

运行结果:

 2,opencv+DNN(结合了深度学习,backbone是resnet-10网络),其实算法源自于一篇SSD论文,有兴趣的可以去拜阅。

里面的权重文件下载地址:

https://github.com/61a6d591-1197-4b21-8b78-bce27de63399

OpenCV/opencv_3rdparty at dnn_samples_face_detector_20180205_fp16 (github.com)icon-default.png?t=M85Bhttps://github.com/opencv/opencv_3rdparty/tree/dnn_samples_face_detector_20180205_fp16

①实现对图片的检测

import numpy as np
import cv2, os
def show_detections(image, detections):
    h, w, c = image.shape
    #里面包含了人脸框的信息,还有置信度,分类等指标
    for i in range(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > 0.6:#置信度
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")
            y = startY - 10 if startY - 10 > 10 else startY + 10
            cv2.rectangle(image, (startX, startY), (endX, endY),(0, 255, 0), 1)
            cv2.putText(image, "{:.2f}%".format(confidence * 100), (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)
    return image
def detect_img(net, image):
    # 对图像进行预处理,减均值,图像缩小为(300,300),通道处理
    blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)
    #输入给网络模型,进行一次前向传播
    net.setInput(blob)
    detections = net.forward()
    return show_detections(image, detections)
#图片
def test_file(net, filepath):
    img = cv2.imread(filepath)
    showimg = detect_img(net, img)
    cv2.imshow("img", showimg)
    cv2.waitKey(0)
net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")
test_file(net,'R-C.jpg')

运行结果:

 ②实现对视频的人脸检测:(可以选取自己喜欢的视频放进去检测)

import numpy as np
import cv2, os
def show_detections(image, detections):
    h, w, c = image.shape
    #里面包含了人脸框的信息,还有置信度,分类等指标
    for i in range(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > 0.6:#置信度
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")
            y = startY - 10 if startY - 10 > 10 else startY + 10
            cv2.rectangle(image, (startX, startY), (endX, endY),(0, 255, 0), 1)
            cv2.putText(image, "{:.2f}%".format(confidence * 100), (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)
    return image
def detect_img(net, image):
    # 对图像进行预处理,减均值,图像缩小为(300,300),通道处理
    blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0), False, False)
    #输入给网络模型,进行一次前向传播
    net.setInput(blob)
    detections = net.forward()
    return show_detections(image, detections)
#视频或者摄像头
def test_camera(net,filepath):
    cap = cv2.VideoCapture(filepath)
    while True:
        ret, img = cap.read()
        if not ret:
            break
        showimg = detect_img(net, img)
        cv2.imshow("img", showimg)
        cv2.waitKey(1)
net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")
test_camera(net,'20220919214835.mp4')

3,Dlib人脸检测,并返回68个坐标点。

权重文件:http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

#这个代码负责把图片进行68个特征点的提取,然后将关键点制作成txt文件。
import numpy as np
import cv2
import dlib
#DLIB官网下载的68个特征点的训练模型文件
#人脸检测模型
detector=dlib.get_frontal_face_detector()
#正脸68个关键点检测模型
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
#face_descriptor=dlib.face_recognition_model_v1('dlib_face_recognition_resnet_model_v1.dat')
# cv2读取图像
img = cv2.imread("223.jpg")
print(img)
# 取灰度
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# 人脸数rects
rects = detector(img_gray, 1)
for i in range(len(rects)):
    landmarks = np.matrix([[p.x, p.y] for p in predictor(img,rects[i]).parts()])#对坐标进行遍历
    for idx, point in enumerate(landmarks):
        # 68点的坐标
        pos = (point[0, 0], point[0, 1])
        print(idx,pos)
        #利用cv2.circle给每个特征点画一个圈,共68个
        cv2.circle(img, pos, 2, color=(0, 255, 0))
        #利用cv2.putText输出1-68
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, str(idx+1), pos, font, 0.8, (0, 0, 255), 1,cv2.LINE_AA)
cv2.namedWindow("img", 2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果;

 

如果做人脸特征点检测,需要训练自己的人脸数据,不想手动标注文件这么麻烦的话,我觉得可以用这个dlib的68关键点检测对自己的数据进行打标处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据仓库(DW)、数据湖、数据中台的关系

一句话说明:数据中台是一套体系,既不是工具又不是存储,它可以包含数据湖和数据仓库。 数据仓库 数据仓库是一个面向主题的、集成的、随时间变化但信息本身相对稳定的数据集合,用于支持管理决策过程。其本质就是完成从面向业务过程…

[附源码]Python计算机毕业设计Django-菜篮子系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

一文学会jenkins pipline自动化构建

01 Pipeline流水线基本语法 首先创建 在jenkins上创建一个pipeline的流水线任务 新建ITEM–>选择流水线 基本pipeline脚本结构 pipeline {//agent 表示要执行的节点,any表示任意节点 agent any //stages表示任务执行时的所有步骤集合 stages { /…

企业销售CRM的主要优势是什么?

民营企业商品销售CRM的主要就竞争优势是什么? 新一代研究说明,由于差劲的顾客新体验,或内公司每月经济损失750亿元。为了更快地介绍您的顾客,您须要两个智能化的顾客管理工作系统。因而,您能提供更多直接影响您的商品销售的高质…

Python调用C++

1 背景 python被称为胶水语言,其优势是能够粘结各种不同的语言。同时,python有着更大的“亲民性”,很容易进行开发。但是,python最大的问题就是计算速度不够。通常可以用CUDA或者C对一个python程序进行加速,加速策略如…

【LeetCode】单词搜索 II [H](前缀树)

212. 单词搜索 II - 力扣(LeetCode) 一、题目 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。 单词必须按照字母顺序,通过 相邻的单元格 内的字母构成&am…

QT系列第2节 QT中元对象系统

QT是在标准C上进行了扩展,所以就有自己的特性,其中元对象系统就是其一。元对象系统有点类似于java和go语言中的反射,让我们在编程时解决问题多了些方法和思路,关于元对象可以简单总结出以下内容项。 目录 一.元对象要点总结 二…

Linux转发性能评估与优化之——转发瓶颈分析与解决方案

线速问题 很多人对这个线速概念存在误解。认为所谓线速能力就是路由器/交换机就像一根网线一样。而这,是不可能的。应该考虑到的一个概念就是延迟。数据包进入路由器或者交换机,存在一个核心延迟操作,这就是选路,对于路由器而言&…

软件工程复习简略

软件工程复习简略1.什么是软件生存周期?通常可划分为哪些阶段?2.简述需求分析要经过哪些步骤,每个步骤的作用。3.详细设计有哪些常用工具?(注意Pad图的画法)4.软件测试的目的和原则是什么?5.测试…

pythonselenium自动化测试实战项目(完整、全面)

前言 之前的文章说过, 要写一篇自动化实战的文章, 这段时间比较忙再加回家过11一直没有更新博客,今天整理一下实战项目的代码共大家学习。(注:项目是针对我们公司内部系统的测试,只能内部网络访问,外部网络…

【SpringCloud负载均衡】【源码+图解】【三】LoadBalancer的工作原理

【SpringCloud负载均衡】【源码图解】【二】LoadBalancer配置 目录3. LoadBalancer的工作原理3.1 创建LoadBalancerRequest3.2 创建上下文3.2.1 properties3.2.2 configurations3.2.3 contexts3.3 获取ReactiveLoadBalancer3.4 获取ServiceInstance3.5 向serviceInstance请求结…

Java要学到什么程度才可以找工作?

Java为不同的集合提供了一个集合框架。集合基于数据结构,比如常见的:列表、数组、集合、哈希图等等。因此,在研究集合时,最好了解一点数据结构的相关知识。 主要副题: List Set Map ArrayList LinkedList Queue…

web3:智能合约-虚拟机(EVM、HVM、WASM、MOVE)

在区块链上,用户通过运行部署在区块链上的合约,完成需要共识的操作。而为智能合约提供运行环境的便是对应的虚拟机。 目录EVM基础概念技术细节EVM的存储模型交易在EVM的执行普通转账交易智能合约的创建或者调用EVM机器语言与现有的虚拟机科技作比较EVM的…

Java中类的复用

类的复用(组合与继承) 第一种方法:只需在新类中产生现有类的对象,新类由现有类组成,也称为组合,该方法只是复用了现有程序代码的功能; 第二种方法:按现有类来创建新类,…

m基于LPF-VMD和KELM的鸟群优化算法的风速预测算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 1).使用 LPF-VMD 对风速时间序列进行分解, 得到一个低频的趋势分量以及 n 个由 VMD 分解得 到的 BIMF。 2).对 LPF-VMD 分解得到的各分量分别建立 KELM 预测模型,采用 B…

【进阶】C语言第二课:升级你的指针(1)

目录 🤩前言🤩: 一、字符指针🤯: 1.字符指针的使用🦝: 2.常量字符串🦊: 3.相关面试题分析🐣: 二、指针数组🧐: 三、数…

vue+nodejs公益图书借阅捐赠管理系统

公益图书捐赠管理系统 用户信息:id、用户名、密码、捐书数量(管理员端可以点击跳转查看详情)、上传电子书数量(管理员端可以点击跳转查看详情)、借阅图书数量(管理员端可以点击跳转查看详情)&am…

利用全长转录组多重阵列测序检测同源异构体

哈佛大学和麻省理工学院近期发表了“High-throughput RNA isoform sequencing using programmable cDNA concatenation.”研究论文中,将 cDNA 串联成可用于长读长测序最佳的单分子的技术应用于肿瘤浸润 T 细胞的单细胞 RNA 测序,提高了寻找可变剪接基因的准确度&…

秒懂:JCTool 的 Mpsc 高性能无锁队列 (史上最全+10W字长文)

文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

C# 修饰符

一 访问控制符 二 static 1 static 的字段、方法、属性是属于整个类的 ① static方法中,不能访问实例变量; ② 调用static方法时,直接用类名访问 Console.Write();Math.Sqrt(); Convert.ToDateTime();DateTime.Parse String.Copy(a);Strin…