这个技术让我毛骨悚然后背发凉!

2024-01-19 10:32

本文主要是介绍这个技术让我毛骨悚然后背发凉!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前几天,AI 换脸这条新闻你关注了吗?


说的是一位博主将 1994 年版《射雕英雄传》里朱茵的脸换成了杨幂的脸。因为该视频涉及到版权问题已被下架,但大家可以看看图片对比来感受一下“移花接木”效果:


640?wx_fmt=jpeg


是不是足够可以以假乱真了!这样的视频用一款实时视频仿真软件 Face2Face 就可以达到,在软件中输入一个说话的人脸录像,通过算法生成对应的人脸模型,套用这个模型就可以创造 DeepFakes。最恐怖的是,这个逼真的效果看起来毫无违和感。


让我们一起来看看 AI 换脸背后的原理:

人脸检测 → 多人脸区域分别做面部关键点检测 → 面部区域分割 → 图像线性融合


顺着这个思路,我们可以看到 AI 换脸里最重要的一环就是人脸检测,要进行人脸识别,得经过这么几个过程:


人脸检测 → 人脸对齐 → 提取特征编码 → 编码比对


人脸检测:就是定位一张图片中人脸的位置。

人脸对齐:就是根据人脸中五个特征点位置(两个眼睛、两个嘴角、鼻子)将人脸缩放到一定的尺寸。

提取特征编码:通过训练一个人脸识别模型来提取人脸特征编码。

编码比对:将某个人脸的编码与编码库中的编码进行对比,得出距离或相似度。


01

实现 AI 换脸的第一步


以下关于人脸检测、人脸对齐均使用基于 Tensorflow 的 MTCNN 模型,生成特征编码使用基于 Mxnet 的 Insightface 模型。


图为人脸搜索整体架构设计:

640?wx_fmt=png


首先,我们会下载 Insightface 源码及其训练好的模型文件,在这个源码的基础上,我们开发一个 API 程序,程序调用模型进行人脸检测、人脸对齐、生成特征编码,然后完成人脸入库、人脸搜索功能。


该程序主要使用 Flask 来进行 API 开发,使用 Annoy 来进行人脸特征向量搜索。在部署上,使用 Docker 容器部署 Python 环境,让 API 程序运行在 Docker 容器中,使用 Gunicorn 来启动 Flask 程序。


另外,使用 Nginx 部署一个图片服务器,用于前端的图片展示,也是运行在 Docker 容器中。最后,我们再提供一个简单 Web 页面,该页面允许用户进行入库、搜索操作(调用后端的人脸入库、搜索 API )。


最终的 Web 页面展示如下:

640?wx_fmt=png


02

人脸搜索实现


首先你得有一个 Linux 环境,可以通过 VMware 构建一个 Ubuntu 16.04 的环境, iso 文件为 ubuntu-16.04.5-desktop-amd64.iso 。


考虑到方便大家照着做,而且大家可能没有 GPU 环境,所以以下构建环境我均使用 CPU 。


1. 克隆项目并修改相关源码
 

cd /opt
git clone https://github.com/deepinsight/insightface.git

将 /opt/insightface/src/api/face_model 第 61 行

 

self.model.ctx = mx.gpu(args.gpu)

改为

 

self.model.ctx = mx.cpu()

将第 34 行

 

for idx in xrange(data.shape[0]):

改为:

 

for idx in range(data.shape[0]):

下载作者训练好的模型文件。


将模型文件解压至 /opt/insightface/models ,目录结构如下:

640?wx_fmt=png


2. 编写人脸入库、搜索 API 程序

这里我们利用训练好的模型文件,使用 Flask 编写一个人脸特征编码入库、搜索 API 。我们将入库的特征编码存于程序中的一个数组里面。


首先,我们先创建用于图片入库及图片搜索的目录。


然后编码 API 程序,在 /opt/insightface/src/api 创建 app_flask.py 。

代码详见 Github。


3. 安装 Docker

安装软件,我一般从官网去获取安装操作说明,让自己在安装过程中少走些弯路。


4. 构建 Docker Nginx 图片服务器镜像

我们要做人脸搜索系统,在前端页面就是要上传一张图片,然后点击“搜索”按钮,在页面上显示人脸库中与该图片相似度最高的 top6 图片,所以我们要用到图片服务器,使用 url 进行图片展示。

我们首先要创建一个图片根目录。


 

mkdir /opt/images

然后使用 Docker 拉取一个 Nginx 镜像。


然后我们就可以启动容器了:

docker run --name image-server -itd -p 8082:8080  -v /opt/insightface/src/api/conf/nginx.conf:/etc/nginx/nginx.conf  -v /opt/images:/opt/images nginx


通过浏览器访问 http://192.168.247.128:8082/

640?wx_fmt=png

5. 构建 Docker Insightface 镜像

我们从一个基础镜像 python:3.5 来构建我们的 Insightface 镜像

docker pull python:3.5

然后我们使用 Dockerfile 来构建 Insightface 镜像,主要是进行 Python 库环境的安装,比如 Tensorflow、Mxnet 。


最后,让我们连续入库 5 张梁静茹和 1 张陈慧娴的照片,然后用第 6 张梁静茹的照片来搜索,效果图如下:

640?wx_fmt=png

最后,以上并非完整全文,提示大家如果有 Gpu 环境的话,可以使用 Gpu 来进行模型推理,以上操作我均使用 root 用户。本文所提到的代码都上传到我的 Github 上了。


扫描下方二维码查看完整全文

获取源码 Github 地址

开始你的 AI 换脸实践

640?wx_fmt=png


点击阅读原文,直达原文,上手 AI 换脸操作!

这篇关于这个技术让我毛骨悚然后背发凉!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622142

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m

嵌入式技术的核心技术有哪些?请详细列举并解释每项技术的主要功能和应用场景。

嵌入式技术的核心技术包括处理器技术、IC技术和设计/验证技术。 1. 处理器技术    通用处理器:这类处理器适用于不同类型的应用,其主要特征是存储程序和通用的数据路径,使其能够处理各种计算任务。例如,在智能家居中,通用处理器可以用于控制和管理家庭设备,如灯光、空调和安全系统。    单用途处理器:这些处理器执行特定程序,如JPEG编解码器,专门用于视频信息的压缩或解压。在数字相机中,单用途