传统的DeepFake 需要大量的原始数据,并且要经过好几天的训练才能达到高质量的效果。
黎颢团队提出,将DeepFake和他此前做的怕GAN结合到一起,做了一个新系统。不需要大量训练数据,也可以实时地渲染出合成图像。
paGAN弥补了DeepFake需要大量训练数据的不足,简单来说是把训练队的工作量都放到台下去做。
过去十年,深度学习领域出现了许多先进的新算法和突破性的研究,并且引入了新的计算机视觉算法。
这一切始于 2012 年的 AlexNet。AlexNet 是一个深度(卷积)神经网络,它在 ImageNet 数据集(拥有超过 1400 万张图片的数据集)上取得了很高的准确率。
人类是如何识别人脸的?
也许,人类大脑中的神经元首先识别场景中的人脸(从人的体形和背景),然后提取面部特征,并通过这些特征对人进行分类。我们已经在一个无限大的数据集和神经网络上进行了训练。
机器中的面部识别是以同样的方式实现的。首先,我们采用面部检测算法来检测场景中的人脸,然后从检测到的人脸中提取面部特征,最后使用算法对人进行分类。
人脸检测是物体检测的一个特化版本,特别之处在于,它只检测一种物体,即人脸。就像计算机科学里需要权衡时间和空间,机器学习算法也需要在推理速度和准确性之间进行权衡。现在有很多物体检测算法,不同算法对速度和准确性的取舍有所不同。
本文评估了如下几个最先进的物体检测算法:
为了构建一个强大的人脸检测系统,我们需要准确且快速的算法,以满足在 GPU 以及移动设备上实时运行的需要。
准确度
在流媒体视频的实时推理中,人们的面部可能有不同的姿势、遮挡和照明效果。因此,算法能在不同的光照条件和不同姿态下精确检测人脸非常重要。
OpenCV(Haar-ascade)
我们从 OpenCV 的 Haar-cascade 实现开始,它是一个用 C 语言编写的开源图像处理库。
优点: 由于这个库是用 C 语言编写的,所以它在实时系统中的推理速度非常快。
缺点: 这个实现的问题是它无法检测侧脸,而且在不同姿态和光照条件下表现欠佳。
MTCNN
这种算法基于深度学习方法。它使用深度级联卷积神经网络(Deep Cascaded Convolutional Neural Networks)来检测人脸。
优点: 它比 OpenCV 的 Haar-Cascade 方法准确性更高
缺点: 运行时间较长。
YOLOV3
YOLO(“You only look once”)是用于物体检测的最先进的深度学习算法。它由许多卷积神经网络组成,形成一个深度 CNN 模型 (深度意味着模型架构复杂性很高)。
原始的 YOLO 模型可以检测 80 个不同的物体类别,而且检测精度很高,而我们只需要用该模型检测一个物体——人脸。我们在 WiderFace(包含 393,703 个面部标签 的图像数据集)数据集上训练了这个算法。
YOLO 算法还有一个微型版本,即 Yolo-Tiny。Yolo-Tiny 需要的计算时间比较少,但却牺牲了一些准确性。我们用相同的数据集训练了一个 Yolo-Tiny 模型,其边界框(boundary box)结果并不一致。
优点: 非常准确,没有任何缺陷。比 MTCNN 更快。
缺点: 由于具有巨大的深度神经网络层,它需要的计算资源更多。因此,该算法在 CPU 或移动设备上运行地很慢。在 GPU 上,它的大型架构也需要耗费更多的 VRAM。
SSD
SSD(Single Shot Detector)也是一个类似 YOLO 的深度卷积神经网络模型。
优点: 良好的准确性。它可以检测各种姿势、光照和遮挡。良好的推理速度。
缺点: 比 YOLO 模型差。虽然推理速度较好,但仍不能满足在 CPU、低端 GPU 或移动设备上运行的要求。
BlazeFace
就像它的名字一样,它是由谷歌发布的速度极快的人脸检测算法。它接受 128x128 维的图像输入,推理时间是亚毫秒级,已优化到可以在手机中使用。它速度这么快的原因是:
YOLO 和 SSD 用来检测大量的类别,而 BlazeFace 不同,是一个专门的人脸检测器模型。因此 BlazeFace 的深度卷积神经网络架构比 YOLO 和 SSD 的架构小。
它采用的是深度可分离卷积层(Depthwise Separable Convolution),而不是标准的卷积层,这样就降低了计算量。
优点: 非常好的推理速度,且人脸检测的准确率高。
缺点: 这个模型的优化目标是对手机摄像头获取的图像进行人脸检测,因此它预期人脸会覆盖图像中的大部分区域,而当人脸尺寸较小时,它的识别效果就是很好。所以,当对闭路电视摄像机获取的(CCTV ,Closed Circuit Tele Vision)图像进行人脸检测时,它表现得并不理想。
Faceboxes
Faceboxes 是我们使用的最新的人脸检测算法。与 BlazeFace 类似,它是一个小型的深度卷积神经网络,只为检测一种类别——人脸而设计。它的推理时间可满足 CPU 上的实时检测需求。它的准确度可以与 Yolo 人脸检测算法相媲美,而且,不管图像中的人脸较大还是较小,它都可以精确地检测。
优点: 推理速度快,准确性好。
缺点: 评估仍在进行中。
在检测到图像中的人脸后,我们对人脸进行裁剪,并将其送入特征提取算法,该算法创建面部嵌入(face-embeddings)——一个代表人脸特征的多维(主要是 128 或 512 维)向量。我们使用 FaceNet 算法来创建面部嵌入。
嵌入向量代表一个人的面部特征。因此,同一个人的两个不同图像的嵌入向量之间的距离比较接近,而不同人的嵌入向量之间的距离比较远。其中,两个向量之间的距离采用的是欧氏距离。
在得到面部嵌入向量后,我们训练了一种分类算法,即 K- 近邻(K-nearest neighbor,KNN)算法,根据一个人的嵌入向量对其进行分类。
假设在一个组织中,有 1000 名员工。我们创建了所有员工的面部嵌入,并使用嵌入向量训练分类算法。该算法以面部嵌入向量作为输入,以人的名字作为输出返回。
在把图片放到网上前,用户可以采用过滤器修改图片中的特定像素。人眼无法察觉这些变化,但它会让面部识别算法觉得很困惑。—— ThalesGroup
当前,面部识别算法已经取得了巨大的进步。但这仅仅是技术革命的开始。可以想象一下,未来面部识别算法和聊天机器人技术的联合起来是多么强大。
代码:https://gitcode.net/mirrors/deepinsight/insightface
ArcFace论文:
论文:https%3A//arxiv.org/pdf/1801.07698.pdf
论文v1版本:https://arxiv.org/pdf/1801.07698v1.pdf
InsightFace框架介绍:InsightFace 是一个开源的 2D&3D 深度人脸分析工具箱,其中高效地实现了丰富多样的人脸识别、人脸检测和人脸对齐算法,并且针对训练和部署进行了优化,在多项算法测评、比赛获得优胜。
Insightface支持一键训练和一键推理,是近几年国内企业、高校开发人脸识别商业系统和开展学术研究的首选人脸识别训练平台。
insightface底层基于MXNet和PyTorch,实现了在CVPR-2019会议上提出的人脸识别算法ArcFace。
除MXNet /PyTorch本身提供的功能外,其还特别实现了单机多卡并行,多机多卡并行的人脸识别训练显存以及速度优化。使本最大支持50万ID训练的单机多卡服务器提升到能够无损训练300万ID的人脸识别数据量,同时支持线性扩展。(8*8卡分布式,2000万人ID,亿级图片数)
奖项荣誉
项目介绍
人脸识别项目
人脸检测项目:
人脸对齐项目:
--insightface
-- python-package
--insightface
--dist
...
在python-packeage路径下运行
pip install -U insightface
python setup.py build_ext -i
python setup.py install
pip install onnxruntime-gpu==1.9.0
刚开始安装onnxruntime 1.10.0版本具体信息如下
>>> import onnxruntime
>>> onnxruntime.get_device()
'GPU'
>>> onnxruntime.get_available_providers()
['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider']
>>> import onnxruntime
>>> import onnxruntime as on
>>> on.get_device()
'GPU'
>>> on.get_available_providers()
['CUDAExecutionProvider', 'CPUExecutionProvider']
版本不同TensorrtExecutionProvider并不一定的有,即并不一定会执行。
官网文档有提到。通过pip 安装的onnxruntime-gpu,只能用到CUDAExecutionProvider进行加速。只有从源码编译的onnxruntime-gpu才能用TensorrtExecutionProvider进行加速。
onnx 提供了一种定制的文件格式,一种由节点组成的计算图,节点本身由基本操作符组成。ONNX拥有大量与深度学习和机器学习相关的核心操作,还提供了使用定制操作的能力。
主要组件:
ONNX:提供图形格式和操作定义
ONNX Runtime:提供可用于在硬件上部署模型以进行推断的运行时环境。它包含ExecutionProviders,这使我们能够使用各种方法(如CPU、Cuda或TensorRT)加速操作。
ONNX Runtime Tools:提供对已转换的ONNX transformers模型执行额外优化的功能。我们不会在这里使用它,但请记住它是存在的!
按照python-packpage中的readme进行操作
首先:下载的模型buffalo_l 以文件夹形式存放在
/home/账户/.insightface/models/buffalo_l
然后运行实例 ,得到如下结果图:
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image
import os
from insightface.data import get_image_dir as ins_get_image_dir
import time
#############单张人脸图像检测detect face############
start = time.time()
app = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
#app = FaceAnalysis()
app.prepare(ctx_id=0, det_size=(640, 640))
img = ins_get_image('t1')
faces = app.get(img)
rimg = app.draw_on(img, faces)
end = time.time()
print("time",end-start)
cv2.imwrite("./t1_output.jpg", rimg)
能够检测出人脸,判别人脸属性即性别和年龄
检测模型指定默认,class FaceAnalysis: def __init__(self, name=DEFAULT_MP_NAME, root='~/.insightface', allowed_modules=None, **kwargs): #name 在..utils里的constant.py中的DEFAULT_MP_NAME = 'buffalo_l'
################循环读取图片
app=FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
for filename in os.listdir('./insightface/data/images/face'):
print(filename[:-4])
img = ins_get_image_dir(filename[:-4])
faces = app.get(img)
rimg = app.draw_on(img,faces)
cv2.imwrite('./result/'+str(filename[:-4])+'.jpg',rimg)
提取特征进行人脸识别
############Recognition Models###################
#先人脸检测再特征提取
#特征提取识别模型路径/home/账户/.insightface/models/antelope/scrfd_10g_bnkps.onnx
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image
app = FaceAnalysis(allowed_modules=['detection'],providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
img = ins_get_image('t1')
faces = app.get(img)
#print("faces::::", faces)
rimg = app.draw_on(img, faces)
cv2.imwrite("./ldh_output.jpg", rimg)
#handler = insightface.model_zoo.get_model('/home/账户/.insightface/models/antelope/scrfd_10g_bnkps.onnx', providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
handler = insightface.model_zoo.get_model('/home/账户/.insightface/models/buffalo_l/w600k_r50.onnx', providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
handler.prepare(ctx_id=0)
img = ins_get_image('t1')
feature = handler.get(img, faces[0])
print("size of feature:", len(feature))
print("feature:", feature)