Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

 

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

本文 GitHub https://github.com/Jack-Cherish/PythonPark 已收录,有技术干货文章,整理的学习资料,一线大厂面试经验分享等,欢迎 Star 和 完善。

一、人脸识别

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

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

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

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

二、人脸打码

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

仝卓自爆高考作弊,可谓"教科书"级别的"仝"归于尽的坑爹教程。

为避免风险,《快乐大本营》反应迅速,对仝卓出现的画面进行了打码处理。

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

这「任性」的打码方式,简单粗暴。

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

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

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

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

三、人脸识别技术

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

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

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

1、人脸检测

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

输出:人脸位置的 bounding box。

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

太多了,数不过来。

当然,自己用 yolo 、ssd 这类经典的检测算法,自己实现一个也是可以的。

2、人脸裁剪及矫正

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

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

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

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

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

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

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

3、人脸特征

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

输出:一个向量表示。

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

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

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

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

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

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

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

整个过程是这样的:

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

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

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

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

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

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

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

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

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

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

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

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

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

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

4、人脸识别

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

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

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

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

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

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

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

四、人脸打码

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

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

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

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

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

我们先看下今天的任务(打开链接观看视频):

https://cuijiahua.com/wp-content/uploads/2020/07/cut.mp4

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

整理一下思路:

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

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

这块可以使用 ffmpeg 实现。

安装好 ffmpeg 并配置好环境变量。

ffmpeg 下载地址:https://ffmpeg.zeranoe.com/builds/

编写如下代码:

import subprocess
import os
from PIL import Imagedef video2mp3(file_name):"""将视频转为音频:param file_name: 传入视频文件的路径:return:"""outfile_name = file_name.split('.')[0] + '.mp3'cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_namesubprocess.call(cmd, shell=True)def video_add_mp3(file_name, mp3_file):"""视频添加音频:param file_name: 传入视频文件的路径:param mp3_file: 传入音频文件的路径:return:"""outfile_name = file_name.split('.')[0] + '-f.mp4'subprocess.call('ffmpeg -i ' + file_name+ ' -i ' + mp3_file + ' -strict -2 -f mp4 '+ outfile_name, shell=True)

视频转音频,视频加音频的函数写好了,接下来,我们写视频自动打码的程序。

首先,安装 face_recognition。

python -m pip install face_recognition

face_recognition 有详细的 API 文档:

https://face-recognition.readthedocs.io/en/latest/face_recognition.html

我们先将要处理的视频保存到本地:

https://cuijiahua.com/wp-content/uploads/2020/07/cut.mp4

然后就可以使用 opencv 读取视频检测画面的每一张人脸。

import cv2
import face_recognition
import matplotlib.pyplot as plt
# %matplotlib inline # 在 jupyter 中使用的时候,去掉注释cap = cv2.VideoCapture('cut.mp4')
ret, frame = cap.read()
if ret:face_locations = face_recognition.face_locations(frame)for (top_right_y, top_right_x, left_bottom_y,left_bottom_x) in face_locations:cv2.rectangle(frame, (left_bottom_x,top_right_y), (top_right_x, left_bottom_y), (0, 0, 255), 10)plt.imshow(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR))plt.show()

运行效果:

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

这样,对画面中检测到的每张人脸,进行人脸识别,是仝卓,那就打码。

打码图片,咱也用个简单粗暴的。

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

打码图片下载地址:

https://cuijiahua.com/wp-content/uploads/2020/07/mask.jpg

将 mask.jpg 保存到本地。

再截取一张仝卓的人脸图片,作为对比库,当然多张也是可以的,这里用一张就够了。

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

我们选择这张图片,图片下载地址:

https://cuijiahua.com/wp-content/uploads/2020/07/tz.jpg

将图片下载到本地,编写如下代码,就可以提取人脸的特征。

import face_recognition
known_image = face_recognition.load_image_file("tz.jpg")
biden_encoding = face_recognition.face_encodings(known_image)[0]
print(biden_encoding)

运行结果:

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

可以看到使用几行代码,就可以提取 128 维的人脸特征。

整体流程是:

  • 使用 ffmpeg 保存音频
  • 处理视频,给仝卓打码。
  • 为处理好的视频添加音频。

直接看代码。

# Author : Jack Cui
# Website: https://cuijiahua.com/
import cv2
import face_recognition
import matplotlib.pyplot as plt
# %matplotlib inline # 在 jupyter 中使用的时候,去掉注释import subprocess
import os
from PIL import Imagedef video2mp3(file_name):"""将视频转为音频:param file_name: 传入视频文件的路径:return:"""outfile_name = file_name.split('.')[0] + '.mp3'cmd = 'ffmpeg -i ' + file_name + ' -f mp3 ' + outfile_nameprint(cmd)subprocess.call(cmd, shell=True)def video_add_mp3(file_name, mp3_file):"""视频添加音频:param file_name: 传入视频文件的路径:param mp3_file: 传入音频文件的路径:return:"""outfile_name = file_name.split('.')[0] + '-f.mp4'subprocess.call('ffmpeg -i ' + file_name+ ' -i ' + mp3_file + ' -strict -2 -f mp4 '+ outfile_name, shell=True)def mask_video(input_video, output_video, mask_path='mask.jpg'):# 打码图片mask = cv2.imread(mask_path)# 读取视频cap = cv2.VideoCapture(input_video)# 读取视频参数,fps、width、heigthCV_CAP_PROP_FPS = 5CV_CAP_PROP_FRAME_WIDTH = 3CV_CAP_PROP_FRAME_HEIGHT = 4v_fps = cap.get(CV_CAP_PROP_FPS)v_width = cap.get(CV_CAP_PROP_FRAME_WIDTH)v_height = cap.get(CV_CAP_PROP_FRAME_HEIGHT)# 设置写视频参数,格式为 mp4size = (int(v_width), int(v_height))fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')out = cv2.VideoWriter(output_video,fourcc, v_fps, size)# 已知人脸known_image = face_recognition.load_image_file("tz.jpg")biden_encoding = face_recognition.face_encodings(known_image)[0]# 读取视频cap = cv2.VideoCapture(input_video)while(cap.isOpened()):ret, frame = cap.read()if ret:# 检测人脸face_locations = face_recognition.face_locations(frame)# 检测每一个人脸for (top_right_y, top_right_x, left_bottom_y,left_bottom_x) in face_locations:unknown_image = frame[top_right_y-50:left_bottom_y+50, left_bottom_x-50:top_right_x+50]unknown_encoding = face_recognition.face_encodings(unknown_image)[0]# 对比结果results = face_recognition.compare_faces([biden_encoding], unknown_encoding)# 是仝卓,就将打码贴图。if results[0] == True:mask = cv2.resize(mask, (top_right_x-left_bottom_x, left_bottom_y-top_right_y))frame[top_right_y:left_bottom_y, left_bottom_x:top_right_x] = mask# 写入视频out.write(frame)else:breakif __name__ == '__main__':# 将音频保存为cut.mp3video2mp3(file_name='cut.mp4')# 处理视频,自动打码,输出视频为output.mp4mask_video(input_video='cut.mp4', output_video='output.mp4')# 为 output.mp4 处理好的视频添加声音video_add_mp3(file_name='output.mp4', mp3_file='cut.mp3')

程序有详细的注释,最终生成的视频会保存为 output-f.mp4,让我们看下效果吧(打开链接播放)。

https://cuijiahua.com/wp-content/uploads/2020/07/output-f-1.mp4

效果还不错吧?

五、最后

face_recognition 无论是检测还是识别的效果一般,想实现更强大、更稳定的自动打码效果,就需要自己有针对的优化订制了。

PS:文中出现的所有代码,均可在我的 github 上下载,欢迎 Follow、Star:点击查看

本文 GitHub https://github.com/Jack-Cherish/PythonPark 已收录,有技术干货文章,整理的学习资料,一线大厂面试经验分享等,欢迎 Star 和 完善。

欢迎评论,点赞支持~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里自爆十万字Java面试手抄本

金九银十就要来了,近两年企业越来越不好做,导致面试时对程序员的要求越来越高,越来越挑剔,除了掌握扎实的专业技能之外,你还需要一份Java程序员面试题汇总,才能在万千面试者中杀出重围,成功拿下…

玻璃绝缘子自爆图像数据集(3k多张,无标签)

下载地址: 玻璃绝缘子自爆图像数据集(3k多张,无标签)

2-9自报家底相关函数以及应用

1.自报家底 我们本篇文章,将讨论什么是自报家底,相关的函数又有哪些,它的基本使用是怎么样的,为什么自爆家底能够把所有能暴露的都暴露出来,它的原理是什么,我们又如何把用户名、数据库名,甚至…

【虚幻引擎】UE4/UE5科大讯飞文字合成语音

一、链接地址 链接:https://pan.baidu.com/s/15Qoc48x3DLpw4eW1qHXInQ 提取码:jqpx B站视频链接:https://space.bilibili.com/449549424?spm_id_from333.1007.0.0 二、案例介绍 第一步:首先进入讯飞开放平台注册一个账号&…

虚幻引擎C++开发学习(三)

这一章,我们要实现一个俯视视角的坦克小游戏,玩家可以操作坦克在地图中移动。敌人是固定的,但是具备一定的AI,可以瞄准玩家,并且在玩家进入攻击范围后,对玩家进行攻击。如果玩家被摧毁,则游戏结…

在虚幻引擎中创建大气的HIMIL电影作品

今天瑞云渲染小编给大家带来了关于电影制片人Tiziano Fioriti展示了《H I M I L》项目背后的工作流程,解释了人工智能是如何用于细节的,并谈到了设置火光的问题。 介绍 大家好,我叫Tiziano Fioriti,是来自意大利的自由电影制作人…

颠覆游戏开发,虚幻引擎 UE5 正式发布

整理 | 章雨铭 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 4月6日,UE5正式发布! 体验完UE5的新功能后,3D游戏狂热爱好者感叹:“惊呆了,老铁!”美工直呼:”工作量…

虚幻4引擎将至!从虚幻看游戏引擎发展

3D游戏引擎是个什么玩意 泡泡网显卡频道5月23日 在某游戏中的一个场景中,玩家控制的角色躲藏在屋子里,敌人正在屋子外面搜索玩家。突然,玩家控制的是一个穿迷彩服的士兵,突然碰倒了桌子上的一个杯子,杯子坠地发出破碎…

UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明

目录 CreateMqttClient Connect Subscribe UnSubscribe Publish Disconnect BindConnectedDelegate BindConnectionLostDelegate BindMessageDelegate CreateMqttClient 创建一个Mqtt客户端对象 Connect 链接Mqtt服务器Subscribe 订阅消息频道UnSubscribe 取消订阅频道…

Unreal Engine 虚幻引擎 接入第三方SDK

前言 虚幻引擎对SDK接入有着一套专门的方式,本文主要描述了如何给使用虚幻引擎开发的项目接入第三方SDK,并分享了接入微信SDK的分享等基础功能的实践过程,还涉及到调试和提高整合SDK效率的一些方法。 SDK意义 SDK 广义是指Software Development Kit 即 应…

虚幻引擎UE4中的Tick事件

虚幻引擎UE4中的Tick事件是程序运行中每一帧刷新一次,例如在通常每秒60帧的游戏运行中,Tick事件就每秒执行了60次。这个事件相当于Unity中的Update和LateUpdate函数一样的性质,(同理在JS中就是animate()函数)。 在UE4里…

虚幻与Unity引擎 之 ✨ 为什么国内那么多开发者喜欢用虚幻或者Unity?

为什么国内那么多开发者喜欢用虚幻或者Unity? 虚幻第一版1998年问世,Unity第一版2005年面世 简单介绍 首先,使用哪一款游戏引擎去制作一款游戏,并不是根据使用者的喜好来制定的。 开发者们的喜好千奇百怪,但最终能在技术选型中影响到结果的,往往是技术积累以及引擎本身的…

【唐老狮】Unity和UE4两大游戏引擎,你该如何选择?

经常被想进入游戏行业的同学问这样一个问题:Unity和UE4学哪个更好?当我面对这样的问题,往往都会先问清楚对方对哪个更感兴趣,然后就引导他学习哪个,投其所好的回答对方的问题! 你心里肯定在想,你…

UE4虚幻引擎开发手机游戏

该文章来自用户转载 点击阅读原文 UE4虚幻引擎作为游戏开发引擎之一,在很多项目中都会使用到。下面就给大家分享下如何使用UE4开发高品质的手机游戏。 作者介绍 大纲 •介绍 •UE4 针对3A级手游的渲染管线和特征集 •使用ES3.1, Vulkan, Meta…

虚幻引擎在游戏之外可以做什么呢?

虚幻引擎 4 的跨界表演获得了“家装”引擎,VR 引擎,电影引擎等众多称号,那么在这些新领域的正确玩法是什么? 不玩不知道,一玩吓一跳。 -------又玩到新玩具的老陶 一个趁手的工具在开发者手里,你永远不会猜…

学习虚幻引擎UMG的基础

内容概括 对于UMG,之前我没有相关的经验,今天学习了下其基础知识。因此记录了一些自己感兴趣的内容。 本篇主要参考的教程是:UMG UI设计器快速入门 | 虚幻引擎文档。 但是我排除了一些关联度不高的、过于基础的、重复的内容。增添了一些自己…

虚幻引擎4中的实时GI技术

video: http://v.youku.com/v_show/id_XNDEwMDEwNTg4.html UE4中的realtime GI是基于这个researcher: http://blog.icare3d.org/ 主要的paper: http://perso.telecom-paristech.fr/~eisemann/publications/Crassin2011VoxelGlobalPG/Vox…

用 UE 虚幻引擎做个捏脸小功能~~

最近在学习 UE 相关的使用,正好看到一篇文章讲解用 Control Rig 实现简单捏脸功能,这种小而美的完整案例挺适合来练手的,涉及到了 UI、蓝图、动画、骨骼等方面,值得推荐一下。 从这个小功能出发,在学习其他内容时如果有…

Unreal Engine 虚幻引擎,性能分析,优化(一)

目录 一、Frame 帧 二、理想情况下,做性能分析时,当寻找游戏存在的瓶颈时,游戏的运行环境越接近目标硬件和目标平台,获得的数据越准确。 三、线程 四、Analysis of a frame ,“CPU”线程,“Game”线程 怎…

UE4 虚幻引擎 GitSourceControl源码解析

效果功能图 背景与目标 资产的工作量很大,并不是个人在短时间内可以独自完成的,需要大量美术人员长时间的进行团队合作完成的,并且完成一版之后,后续也还有更新维护的需求。所以UE的Editor也提供了对资产版本管理的功能&#xff…