AIGC专栏7

您所在的位置:网站首页 retinaface改进mobilev3 AIGC专栏7

AIGC专栏7

2023-12-03 21:58| 来源: 网络整理| 查看: 265

AIGC专栏7——EasyPhoto 人像训练与生成原理详解 学习前言源码下载地址为什么是LoraEasyPhoto的训练流程1、数据的预处理a、人像排序i、人脸特征向量提取过程ii、人脸偏移角度计算iii、人像排序 b、人像分割与修复i、人像分割ii、图像修复与超分处理 2、Lora模型训练a、训练的基线b、Lora模型融合 EasyPhoto预测流程1、初步重建a、人脸融合b、人脸裁剪与仿射变换c、Stable Diffusion重建 + 颜色转移 2、边缘完善a、人脸融合b、Stable Diffusion重建 3、后处理

学习前言

如何训练一个高品质的人像Lora与应用高品质Lora的链路对于写真生成而言非常重要。 在这里插入图片描述

源码下载地址

WebUI插件版本:https://github.com/aigc-apps/sd-webui-EasyPhoto Diffusers版本:https://github.com/aigc-apps/EasyPhoto

麻烦各位朋友点个Star,这对我来讲还是很重要的!

为什么是Lora

由《LoRA: Low-Rank Adaptation of Large Language Models》 提出的一种基于低秩矩阵的对大参数模型进行少量参数微调训练的方法,广泛引用在各种大模型的下游使用中。

目前对超过数十亿以上参数的具有强能力的大模型针对下游任务进行微调中会呈现出巨大开销。 LoRA 建议冻结预训练模型的权重并在每个自注意力部分通过全连接的方式注入可训练层。因为不需要为所有的权重计算梯度,仅需要为一些全连接层计算梯度,大大减少了需要训练参数的数量并且降低了 GPU 的内存要求。

Stable Diffusion的整个模型的微调既缓慢又困难,使用 LoRA,在自定义数据集上微调模型要容易得多。市面上有很多优秀的Lora模型,如墨心:

在这里插入图片描述 Lora普遍地用于训练某个角色、某个特征、某个风格。在AI真人写真领域中,我们需要保证最后生成的图像和我们想要生成的人是相像的,这就需要我们使用Lora 技术,对输入的少量图片,进行一个快速的训练,从而使得我们可以得到一个小的指定人像的模型。

EasyPhoto的训练流程

在这里插入图片描述

1、数据的预处理

EasyPhoto的数据预处理流程可以分为:

人像得分排序与Top-k个人像选取;显著性分割与图像修复。 a、人像排序

人像排序流程需要结合人脸特征向量、图像质量评分与人脸偏移角度。但因为图像质量评分会引入一部分计算压力,所以WebUI插件中暂时没有使用,原理解析中我们依然使用到。

其中人脸特征向量 用于 选出最像本人的图片,因为每个人在不同时期的相片是不一样的,我们选出 当前所有图片中,最像自己的那些照片进行训练。

图像质量评分 用于 判断图片的质量,选出质量最低的一些进行超分,提升图片质量。

人脸偏移角度 用于 选出最正的人像,这个最正的人像会在预测中作为参考人像进行使用,进行人脸融合。

下面解析每个技术细节:

i、人脸特征向量提取过程

人脸特征向量计算是一个比较复杂的过程,需要先进行检测,然后对人脸进行对齐,使其成为一张标准的人脸;最后使用一个人脸识别模型,提取出这个人脸的特征向量。 因此,在经过人脸特征向量的提取后,我们可以通过一个 定长的一维矩阵 表示人脸。

算法流程如下所示: 利用Retinaface我们可以获得一张图片中人脸的位置,但是我们截取下来的人脸是这样的: 在这里插入图片描述 我们可以很明显的看出来人脸是歪着的,我们如果人脸可以正过来,那么将对人脸的特征提取非常有好处。 在这里插入图片描述 对齐后的人脸使用CurricularFace提取特征向量。这个特征向量就是这个人脸的特征集合,通过对特征向量之间的比对,就可以判断人脸之间的相似程度。

人脸特征向量提取的过程是相对比较复杂的,全都写在代码里面,代码量就会比较大,我们用modelscope进行了封装,方便调用。

# jpg list jpgs = os.listdir(inputs_dir) # ---------------------------FaceID score calculate-------------------------- # face_id_scores = [] face_angles = [] copy_jpgs = [] selected_paths = [] for index, jpg in enumerate(tqdm(jpgs)): try: if not jpg.lower().endswith(('.bmp', '.dib', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff')): continue _image_path = os.path.join(inputs_dir, jpg) image = Image.open(_image_path) h, w, c = np.shape(image) retinaface_boxes, retinaface_keypoints, _ = call_face_crop(retinaface_detection, image, 3, prefix="tmp") retinaface_box = retinaface_boxes[0] retinaface_keypoint = retinaface_keypoints[0] # get key point retinaface_keypoint = np.reshape(retinaface_keypoint, [5, 2]) # get angle x = retinaface_keypoint[0,0] - retinaface_keypoint[1,0] y = retinaface_keypoint[0,1] - retinaface_keypoint[1,1] angle = 0 if x==0 else abs(math.atan(y/x)*180/math.pi) angle = (90 - angle)/ 90 # face size judge face_width = (retinaface_box[2] - retinaface_box[0]) / (3 - 1) face_height = (retinaface_box[3] - retinaface_box[1]) / (3 - 1) if min(face_width, face_height)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3