基于深度学习mediapipe的人脸打码人脸模糊教程pyqt5界面附源码

news2024/11/17 9:48:16

一、人脸识别

人脸识别是一门比较成熟的技术。

它的身影随处可见,刷脸支付,信息审核,监控搜索,人脸打码等。

更多的时候,它是方便了我们的生活,足不出户,就可以实现各种 APP 的实名认证,信息审核。

一些公司,也都有对内部员工开放的刷脸支付系统,不用带手机,不用带工卡,带着一张或美丽或帅气的脸庞,就可以在公司内部「买买买,刷刷刷」。

二、人脸打码

除了这些常规操作,还可以对视频里的特定人物进行打码。

对于视频,人工后期的逐帧处理,打码任务无疑是个「体力活」。

但如果结合脸识别技术,那这个任务就会简单很多。

本文从原理出发,讲解人脸识别技术的视频打码应用。

过滤视频的敏感人物,就这么简单!

三、人脸识别技术

人脸识别技术包涵了多种算法,整个流程大致如下:

    使用检测技术,检测出人脸位置。
    使用 landmark 技术,检测出人脸关键点。
    根据人脸位置和人脸关键点,裁剪出人脸区域,并根据关键点将人脸图片进行矫正,得到「标准脸」。
    计算「标准脸」的人脸特征向量。
    与「人脸库」的人脸特征向量比对,计算向量的距离,找到最接近的人,输出人脸识别结果。


1、人脸检测

输入:原始的可能含有人脸的图像。

输出:人脸位置的 bounding box。

这一步一般我们称之为“人脸检测”(Face Detection),人脸检测算法,可以使用的库有很多,例如 OpenCV、dlib、face_recognition、RetianFace、CenterFace 等等。

太多了,数不过来。

当然,自己用 yolo 、ssd 这类经典的检测算法,自己实现一个也是可以的。
2、人脸裁剪及矫正

输入:原始图像 + 人脸位置 bounding box。

输出:“校准”过的只含有人脸的图像。

这一步需要使用 landmark 算法,检测人脸中的关键点,然后根据这些关键点对人脸做对齐校准。

所谓的关键点,就是下图所示的绿色的点,通常是眼角的位置、鼻子的位置、脸的轮廓点等等。

有了这些关键点后,我们就可以把人脸“校准”,或者说是“对齐”。

解释就是原先人脸可能比较歪,这里根据关键点,使用仿射变换将人脸统一“摆正”,尽量去消除姿势不同带来的误差。这一步我们一般叫 Face Alignment 。
3、人脸特征

输入:校准后的单张人脸图像。

输出:一个向量表示。

这一步就是使用深度卷积网络,将输入的人脸图像,转换成一个向量的表示。这个向量就是人脸的特征,例如:

这密密麻麻的 128 维的向量,就是一张人脸的特征,你也可以叫做人脸的编码。

提取特征这种事,卷积神经网络很在行。

举个例子,VGG16 是深度学习中一个比较简单的基本模型。

输入卷积神经网络的是图像,经过一系列卷积后,全连接分类得到类别概率。

整个过程是这样的:

其实,卷积神经网络不断的进行卷积,下采样,这就是一个提取特征的过程,最后通过全链接层得到类别概率。

人脸特征提取,我们也可以这么操作。我们可以去掉全连接层,用计算的特征(一般就是卷积层的最后一层,e.g. 图中的conv5_3)来当作提取的特征进行计算。

与分类任务不同的是,最后使用的 loss 损失函数是不同的。

在理想的状况下,我们希望“向量表示”之间的距离就可以直接反映人脸的相似度:

    对于同一个人的人脸图像,对应的向量的欧几里得距离应该比较小。
    对于不同人的人脸图像,对应的向量之间的欧几里得距离应该比较大。

所以,每个人脸的类别中心,应该尽可能远一些,这样才能用于区别不同的人。

人脸常用的 loss 有 center loss 、 arcface loss 等。

人脸识别类似于,细粒度的分类。

训练过分类任务的,应该都知道。

训练人和猪的二分类,很好训练,因为人和猪的特征差别很明显。

但训练男人和女人的二分类,就要难一些,因为男人和女人的特征很相近。

为了更好区分男人和女人,就需要使用类别中心间距大的损失函数。

人脸识别,更是一种细粒度的区分,都是人,但你要区分出张三、李四、王二麻。

4、人脸识别

人脸识别,一般是需要建立一个「检索库」。

简单解释一下,我们要识别张三、李四、王二麻。

那么,我们就要选张三、李四、王二麻每个人的 10 张(自己定)图片。

然后使用我们训练好的人脸特征模型,提取每个人的人脸特征。

这样每个人,就都有 10 个人脸特征了,这就是一个「检索库」。

需要识别的图片,提取人脸特征后,依次与检索库已有的人脸特征去比对,投票选出最接近的人。

四、人脸打码

人脸识别技术原理清楚了,我们就可以使用这个技术,给仝卓打码。

可以看到,人脸识别技术涉及到的算法较多,自己依次实现是需要时间的。

但这,难不倒身为优秀「调包侠」的我。

开源的第三方库有很多,比如 mediapipe

里面集成了人脸检测、人脸识别等接口。

使用人脸识别技术,对这一小段视频,给人脸进行打码。

整理一下思路:

首先,我们使用 opencv 这类的程序处理视频,只能处理画面,不能处理声音。

所以,需要先将音频保存,再将处理好的视频和音频进行合成,这样既保证了画面打码,又保证了声音还在。

这块可以使用mediapipe实现。

视频演示:

基于Python的人脸跟踪打码程序pyqt5界面

import cv2
import mediapipe as mp


class FaceDetector:
    def __init__(self):
        self.mp_face_detection = mp.solutions.face_detection
        self.mp_drawing = mp.solutions.drawing_utils

    def rectangle(self, image, mosaic_level):
        success = False
        cv2.imwrite('middle_pic/before_handle.jpg', image)
        with self.mp_face_detection.FaceDetection(
                min_detection_confidence=0.5) as face_detection:

            # Flip the image horizontally for a later selfie-view display, and convert
            # the BGR image to RGB.
            # image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            # To improve performance, optionally mark the image as not writeable to
            # pass by reference.
            image.flags.writeable = False
            results = face_detection.process(image)

            # Draw the face detection annotations on the image.
            image.flags.writeable = True
            image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
            if results.detections:
                for detection in results.detections:
                    h, w, c = image.shape

                    xmin = int(detection.location_data.relative_bounding_box.xmin * w)
                    ymin = int(detection.location_data.relative_bounding_box.ymin * h)
                    width = int(detection.location_data.relative_bounding_box.width * w)
                    height = int(detection.location_data.relative_bounding_box.height * h)
                    xmax = xmin + width
                    ymax = ymin + height
                    if xmax > w:
                        width = w - xmin
                    if ymax > h:
                        height = h - ymin

                    self.do_mosaic(image, xmin, ymin, width, height, int(mosaic_level * 0.2 * width))
                    # 画矩形框
                    # image = cv2.rectangle(image, (xmin, ymin), (xmin + width, ymin + height), (0, 255, 0), 2)
                    success = True
                    cv2.imwrite('middle_pic/after_handle.jpg', image)

            return image, success

    # 正规马赛克
    def do_mosaic(self, img, x, y, w, h, neighbor):
        """
        :param rgb_img
        :param int x :  马赛克左顶点
        :param int y:  马赛克左顶点
        :param int w:  马赛克宽
        :param int h:  马赛克高
        :param int neighbor:  马赛克每一块的宽
        """
        for i in range(0, h, neighbor):
            for j in range(0, w, neighbor):
                rect = [j + x, i + y]
                color = img[i + y][j + x].tolist()  # 关键点1 tolist
                left_up = (rect[0], rect[1])
                x2 = rect[0] + neighbor - 1  # 关键点2 减去一个像素
                y2 = rect[1] + neighbor - 1
                if x2 > x + w:
                    x2 = x + w
                if y2 > y + h:
                    y2 = y + h
                right_down = (x2, y2)
                cv2.rectangle(img, left_up, right_down, color, -1)  # 替换为为一个颜值值

        return img

后续又加入登陆注册功能:

项目下载:https://download.csdn.net/download/babyai996/87731913

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

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

相关文章

格式化数据恢复怎么做?超实用的3种方法在这!

案例:格式化数据怎么恢复 【我的电脑前段时间中病毒了,无奈之下我只能将其格式化,但是很多重要的文件和图片之类的也一起被删除了,有什么方法可以恢复这些格式化的数据吗?非常着急!】 格式化数据恢复&…

1390:食物链【NOI2001】

1390:食物链【NOI2001】 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动…

安全常见基础名词概念

一、域名 1、域名:相当网站的名字,互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。 2、网域名系统(Domain Name System)有时也简称为域名(DNS),是互…

Sametime 12.0.1 FP1发布以及Notes中的SwiftFile使用

大家好,才是真的好。 上周,HCL推出了Sametime 12.0.1FP1FP1更新包程序,包含不少新功能以及很多修复程序。虽然Sametime组件现在不需要运行在Domino服务器上,但毕竟Sametime通常会使用Domino目录或Domino中的LDAP目录服务&#xf…

陆奇最新演讲高清PPT下载;AI 绘画20+工具体验汇总;我愿称MOSS为全球开源界最强;思否AIGC黑客马拉松北京站 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『陆奇罕见公开演讲「新范式 新时代 新机会」』高清PPT和视频可直接下载 ShowMeAI知识星球资料编号:R054 奇绩创坛创始人兼…

ChatGPT实现命名实体识别(NER, named entity recognization)和词性归类

语义分析词格分类 命名实体识别(NER, named entity recognization)和词性归类是 NLP 技术中的关键一环。过去 NLP 领域有不少流行的开源项目专注在这个领域,如 Spacy、NLTK 等等。我们来试试 ChatGPT 在这方面的表现情况如何。我们从"四渡赤水"的百度百科…

故障预测与健康管理PHM如何做可解释性研究?

首先,故障预测与健康管理PHM基于先进传感器技术获取复杂设备的运行状态信息,借助智能算法实现复杂工程系统的故障诊断、健康状态预测与管理。基于机器学习的PHM技术能够充分挖掘多源异构数据的信息,提高故障诊断、健康状态预测以及剩余寿命估…

uniapp微信小程序连接蓝牙打印机 打印文字、图片

首先感谢几位的文章分享 https://blog.csdn.net/guairena/article/details/127941515 https://blog.csdn.net/qq_37970097/article/details/119148707 效果图: 使用的是 芝柯cc3 蓝牙打印机, 我这里没有存储蓝牙设备相关信息。所以每次打印都会重新初始化并搜索设…

Undefined symbol解决方法

1.初级错误 (1)C中未定义 (2)H中未引用 (3)未包含含有该类型的.H文件 (4)在keil中未添加.C或.H文件到工程 2.C和C代码混合调用引起的未定义错误 1.一般情况下,Error: L6218E: Undefined symbol 若是由于未定义引起的错误,可以根据错误提示定位到相应的…

大模型时代,RPA的冰与火之歌|产业特稿

从市场趋势来看,RPA属性正在逐渐淡化,一些厂商都已瞄准更高阶的智能机器人。可能未来5~10年,随着AI语言模型的发展,RPA的产品逻辑会彻底改变,RPA厂商也会进化到更智能的阶段。 作者|思杭 编辑|皮爷 出…

C#开发的OpenRA的游戏侧边界面

C#开发的OpenRA的游戏侧边界面 OpenRA游戏开始之后,会在右边提供一个游戏侧边界面, 通过这个游戏界面,可以查看游戏状态、执行一些特殊的命令,以及雷达显示, 还有创建各种需要的建筑物,以及生产各种兵种,飞机等等。 这个游戏界面,就是给玩家提供一个操作平台,因此它…

年轻不乏野心,想做年薪40万+的软件测试工程师?写给长途漫漫中的你...

本人从事自动化测试10年多,之前在猪场工作,年薪突破40W,算是一个生活过得去的码农。(仅代表本人) 目前从事自动化测试的薪资待遇还是很不错的,所以如果朋友们真的对自动化感兴趣的话可以坚持学下去&#xf…

开放式蓝牙耳机排行,列举几款值得推荐的开放式蓝牙耳机

开放式耳机是通过人的颅骨振动将声音转换成声波,不通过耳膜,可以听到外界的声音,可以保护耳朵,也可以保护听力。并且大部分的开放式耳机都是采用挂耳式的佩戴设计,即使是长时间佩戴也不会让耳朵感到疲劳,下…

线性回归模型(7大模型)

线性回归模型(7大模型) 线性回归是人工智能领域中最常用的统计学方法之一。在许多不同的应用领域中,线性回归都是非常有用的,例如金融、医疗、社交网络、推荐系统等等。 在机器学习中,线性回归是最基本的模型之一&am…

Cortex-A7中断详解(一)

STM32中断系统回顾 中断向量表NVIC(内嵌向量中断控制器)中断使能中断服务函数 中断向量表 中断向量表是一个表,表里面存放的是中断向量。 中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量,因此中断向量表是一系…

电脑开机memory management错误蓝屏了怎么办?

电脑开机memory management错误蓝屏了怎么办?windows系统出现不兼容问题之后,很容易出现电脑蓝屏的情况。最近有用户遇到了上述的蓝屏错误情况,不知道怎么去进行解决。今天我们就一起来看看以下的解决方法分享吧。 准备工作: 1、U…

yolov5半自动打标签(opencv版本),识别目标画框并将坐标信息保存在xml中

文章目录 1.yolov5预训练模型推理2. opencv边缘检测结果展示 yolov5训练数据集时,需要对数据进行打标签,可以通过两种方法进行半自动化打标签。 1.yolov5预训练模型推理 yolov5预训练模型:将待打标签的图片输入预训练模型中进行推理&#xf…

实现PXE批量网络装机及kickstrat无人值守安装(富士山终究留不住欲落的樱花)

一、PXE概述和部署PXE批量装机 1.PXE简介 PXE(预启动执行环境,在操作系统之前运行)是由Intel公司开发的网络引导技术,c/s架构,允许客户机通过网络从远程服务器下载引导镜像,并加载安装文件或者整个操作系统…

2023_8.0.33版windows版MySql安装_配置远程连接_修改设置初始密码---MySql工作笔记0001

MySQL :: Download MySQL Community Server https://dev.mysql.com/downloads/mysql/ 首先去下载mysql 可以看到这里下载第一个就可以了,最新版的8.0.33 这里点击仅仅下载 just start my download 然后解压到一个文件夹,然后配置一下环境变量 然后新建一个my.ini文件 然后把…

ubuntu22.04下挂载第二块硬盘

文章目录 一、查看硬盘情况二、找到nvme1n1三、挂载四、修改分区文件 一、查看硬盘情况 首先要查看一下系统识别出来的设备。也就是说,我希望知道,ubuntu到底发现了几块硬盘。用命令:lsblk 显示结果如下: 有两块硬盘&#xff1a…