python+人脸识别+opencv实现真实人脸驱动的阿凡达(上)

news2024/10/6 12:25:57

目录

  • 一、前言
  • 二、技术路线
  • 三、主要技术点分析
    • (1) 人脸识别模块特征点的漂移
    • (2) 柔性运动与刚性运动的处理
      • setp1 基于人脸特征点的三角剖分
      • setp2 基于三角映射的仿射变换
    • (3) 正脸转侧脸的处理
  • 四、小结

一、前言

我们在此前的名叫python+opencv实现人脸微整形博文里已经简单地实现了人脸图像的微形变,为人脸驱动一个虚拟人脸提供了一些基础,但是运行性能上面需要优化,因为要想用人脸特征点实时驱动,需要非常快速的响应时间。目前国内外高等院校利用深度学习、生成神经网络等技术取得了较大的进展,由于神经网络需要耗费大量的算力,动则需要1万元以上的显卡3块并训练3个星期,不是个人能玩得,本篇试图利用简单图像处理原理继续深入探究人脸驱动应用,作一下入门级研究,目标是基于人脸识别出的特征点(如眉毛、眼睛、嘴唇)并计算相机的相对于人脸的朝向,简单实现真人脸微表情驱动一张虚拟人脸,虚拟人脸可以是一个二次元人脸、一个卡通脸或者是另一个AI生成的真人脸。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、技术路线

在这里插入图片描述
如上图所示,主要技术路线是:首先,通过摄像头实时捕捉人脸,并通过人脸识别软件模块获取真实人脸得特征点(如下图):
在这里插入图片描述
然后将特征点映射至数字人得对应特征点上,形成运动的主从运动映射(即,主动特征点产生偏移dx、dy,那么从动点也使得发生偏移),这样就实现了人脸驱动的功能,如下图的人眼球运动,通过人脸检测,获取眼球的位置点作为驱动点,当眼球发生偏移,数字人从动点眼睛也发生变化了。
在这里插入图片描述

三、主要技术点分析

虽然以上的技术路线看起来比较简单,但是我们通过前期的测试发现,要可靠的运行,还存在一些比较底层的问题需要优化或者解决,主要包括:

(1) 人脸识别模块特征点的漂移

人脸识别模块我们可以通过多种开源程序获得,这里我们使用的是python库——face_recognition,识别较为准确,但是识别出的特征点存在飘逸,如果直接将模块识别出的特征点映射到阿凡达从动点,会出现随机微小的抖动,显得非常的不自然。
我们主要采用设置时间窗口,并进行均值计算,在不牺牲实时性的前提下用平均值代替瞬时值,起到了一定的滤波效果。后续再碰到此来问题,还将尝试其它消除稳定性的算法,本次代码部分如下:

    if firstloop and ticktak<6:  #时间周期设为5个循环时间       
        rig_center_xs0.append(rig_center_x)
        rig_center_ys0.append(rig_center_y)
        
    if firstloop and ticktak>=6:#大于5个周期,为下一个间隔数据  
        rig_center_xs.append(rig_center_x)
        rig_center_ys.append(rig_center_y)         
        
    if ticktak>10:
        ticktak=0
        screen.blit(bg_img, (0, 0))
        
        count=0
        while len(rig_center_xs0):#计算k-1间隔平均值
            count+=1
            rig_center_x0=rig_center_x0+rig_center_xs0.popleft() 
            rig_center_y0=rig_center_y0+rig_center_ys0.popleft()            
        rig_center_x0=int(rig_center_x0/count)            
        rig_center_y0=int(rig_center_y0/count)
        count=0
        while len(rig_center_xs):#计算k间隔平均值
            count+=1
            rig_center_x1=rig_center_x1+rig_center_xs.popleft() 
            rig_center_y1=rig_center_y1+rig_center_ys.popleft()            
        rig_center_x1=int(rig_center_x1/count)            
        rig_center_y1=int(rig_center_y1/count)
        #计算两个窗口期的偏移量,用于驱动数字人对应从动点
        deyesx=rig_center_x1-rig_center_x0
        deyesy=rig_center_y1-rig_center_y0        

(2) 柔性运动与刚性运动的处理

同一视角下,人脸的运动点可以认为是刚性运动+柔性运动的组合结果。所谓的刚性运动,是运动部位不产生自身的形变,人脸上眼球、牙齿、鼻子、耳朵等的运动可以认为是刚性的运动;所谓柔性运动,这里指的是运动的部位产生了形变、弯曲、拉扯等,如表情中眉毛的微微变形、嘴巴的张大缩小、眼睛的睁大等。
在此前的博文中我们采用“控制点位置变化来影响周边的像素点的变化”的原理来实现局部的变形,但是由于需要便利所有的像素点计算量比较大,实际生成应用存在一定的性能瓶颈。受到linve2d技术(一种应用于电子游戏的绘图渲染技术)的启发,可以应用可自定义的三角剖分,加上局部仿射变换进行所控图像的任意柔性变形!主要解决的思路如下:

setp1 基于人脸特征点的三角剖分

首先我们根据人脸识别模块获得正面人脸的特征点,并利用三角剖分算法对人脸进行三角分割:
在这里插入图片描述
然后在数字人中自定义映射点,并根据所得到的剖分也进行三角形分割。
在这里插入图片描述
在这里插入图片描述
这样就实现了一一对应,当然这个工作需要做细致,并进行反复的调试。

setp2 基于三角映射的仿射变换

这一步是要根据所得到的三角,对每个三角部分进行前后帧的仿射变换,我们可以利用opencv自带的工具进行计算,先计算仿射变换矩阵,再利用cv2.warpAffine进行变换:

        # 计算仿射阵        
        WMat = cv2.getAffineTransform( np.float32(tri1), np.float32(tri2) )              
        # 根据仿射阵计算目标图像
        img2Cropped = cv2.warpAffine( img1, WMat, (r2[2], r2[3]), None, flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_REFLECT_101 )

这样将所有的三角块都遍历一遍,就完成了整个人脸的柔性变形!

(3) 正脸转侧脸的处理

由于我们入门级的数字人只是一个二维的正脸图像,没有三维的信息,如何让她动起来(左右微微摇头),从而产生更加仿真的结果。这块未经过测试,在本篇先不予以说明,待测试完后在后续博文中发出。

四、小结

上篇就到此浅尝则至了,以上所描述的技术我们一步一步敲代码,运行测试调试,用python已经写到了730行,这可能仅仅只是开始,过程非常耗时间,当完成一个初步应用后,我们打算把这个程序开源,希望得到更多人的助力。

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

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

相关文章

Java GUI图形编程 使用awt和swing 制作简易计算器的工具包含源码和讲解 / java练习项目

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录系列文章目录前言一、常规配置1. 设置窗口大小2. 获取当前屏幕的尺寸3. 窗口居中4. 设置窗口名称5. 添加监听器&#xff0c;关闭窗口6. 设置窗口可见性7. 设置文本框不可编辑8. 设置文本框提示9. 设…

OpenGL原理与实践——核心模式(六):光照贴图、光源分类以及多光源场景主要源码实现

本章主要以代码为主&#xff0c;理论理解即可。详细分析代码 目录 光照贴图 光源分类 平行光 点光源 shader——点光源 聚光灯 聚光灯边缘优化——光强递减 源码解析 main 全局变量、句柄 main函数主体逻辑 createModel() createTexture(const char* _filename) …

骨感传导蓝牙耳机怎么样,骨感传导耳机对于我们耳道是否有保护

在现在数码产品普及生活的时代&#xff0c;耳机也成为了我们每天的标准&#xff0c;以往佩戴的都是入耳式的耳机&#xff0c;但长时间佩戴下会出现耳朵疼痛&#xff0c;严重的更会导致听力障碍的问题发生&#xff0c;针对这一现象&#xff0c;一种新型的骨感传导耳机来到了我们…

后台默默付出的劳动者,四大组件之服务(Service)

后台默默付出的劳动者&#xff0c;四大组件之服务Service前言十、后台默默付出的劳动者&#xff0c;四大组件之服务&#xff08;Service&#xff09;10.1 服务是啥&#xff1f;10.2 Android异步消息处理机制10.2.1 Android异步消息处理机制介绍10.2.2 基于Android异步消息处理机…

Packet Tracer - 排除多区域 OSPFv2 故障

地址分配表 设备 接口 IP 地址 子网掩码 默认网关 ISP GigabitEthernet0/0 209.165.200.17 255.255.255.240 不适用 ASBR GigabitEthernet0/0 209.165.200.18 255.255.255.240 不适用 Serial0/0/0 10.1.1.2 255.255.255.252 不适用 Serial0/0/1 10.2.2…

制作一个企业网站——html华为官网购物商城项目的设计与实现

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

【Redis】使用 Java 客户端连接 Redis

一、三种客户端比较 Jedis : 学习成本低&#xff0c;以 Redis 命令作为方法名称&#xff0c;但是其线程不安全 lettuce&#xff1a;基于 Netty 实现&#xff0c;支持同步、异步、响应式编程&#xff08;SpringBoot&#xff09;&#xff0c;并且线程安全。支持 Redis 的哨兵模…

【附源码】计算机毕业设计JAVA幼儿健康管理系统

【附源码】计算机毕业设计JAVA幼儿健康管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA my…

Nacos入门

文章目录一、安装nacos二、nacos项目环境配置一、安装nacos 压缩包下载地址&#xff1a; https://github.com/alibaba/nacos/releases 压缩包解压&#xff1a; nacos 中修改端口(8848 端口被占用需要修改)&#xff1a; 进入 conf 进入 application.properties 端口位置 启…

【springboot进阶】摆脱 if/else 的高级应用 - 策略模式

目录 一、策略模式的介绍 二、策略模式的使用场景 三、策略模式的应用 1、入参和出参类 2、策略接口 3、策略具体实现 4、策略测试 三、一些使用技巧 四、总结 对于一个逻辑相对复杂的功能应用中&#xff0c;难免需要做很多的逻辑判断&#xff0c;需要写一堆的 if/els…

Flink常用Sink(elasticsearch(es)Sink、RedisSink、KafkaSink、MysqlSink、FileSink)

flink输出到es、redis、mysql、kafka、file 文章目录配置pom文件公共实体类KafkaSInkElasticsearchSink(EsSink)RedisSinkMysqlSink(JdbcSink)FileSink自己先准备一下相关环境 配置pom文件 <properties><maven.compiler.source>8</maven.compiler.source>&l…

【概率论与数理统计】第四章知识点复习与习题

思维导图 基础知识 数学期望 定义 数学期望其实很好理解&#xff0c;就是均值&#xff0c;当然这里并不是直接计算样本的均值&#xff0c;而是考虑到样本对应的概率。我们分离散和连续两类来讨论数学期望。 离散型 对随机变量X的分布律为 若级数 绝对收敛&#xff0c;则称该…

BaGet搭建Nuget私仓(window10docker)

文章目录一、搭建背景二、框架简介三、私仓搭建1、环境2、win10上部署2.1安装SDK2.2下载和解压BaGet包2.3运行项目2.4类库项目2.5将包发布到私有Nuget中2.6使用BaGetFirstLib2.7使用密码增加安全性3、Docker上部署3.1创建相关文件3.2拉取镜像3.3运行3.4访问四、结束一、搭建背景…

微服务入门

文章目录一、微服务大概认识二、单体架构架构和分布式架构三、微服务架构特征四、微服务技术对比五、SpringCloud 与 SpringBoot版本兼容关系如下&#xff1a;一、微服务大概认识 二、单体架构架构和分布式架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&…

“加密上海·喜玛拉雅Web3.0数字艺术大展”落幕,AIGC和数字艺术衍生品是最大赢家?...

图片来源&#xff1a;由无界版图 AI 绘画工具生成11月11日&#xff0c;为期一个月的第一届“加密上海喜玛拉雅3eb3.0数字艺术大展”在喜玛拉雅美术馆拉开帷幕。这无疑是当下中国最盛大、最集中的一次数字艺术展览。艺术展吸引了像Soul 、小红书、网易星球、bilibili、酷天下、无…

mysql实战操作总结

1、问题描述 关于mysql操作&#xff0c;记录下&#xff1b; 2、问题说明 1.停止正在执行的sql 数据量太大&#xff0c;数据库没反应&#xff0c;用的navicat&#xff0c;就在查询页面&#xff0c;执行&#xff1a; show processlist;---会显示对应的查询sql找到最前面是id…

vue js实现文件上传压缩优化处理

vue js实现文件上传压缩优化处理 两种方法 &#xff1a; 第1种是借助canvas的封装的文件压缩上传第2种&#xff08;扩展方法&#xff09;使用compressorjs第三方插件实现 目录 vue js实现文件上传压缩优化处理 借助canvas的封装的文件压缩上传 1.新建imgUpload.js 2.全局引…

高清免费壁纸网站推荐

本期内容&#xff0c;为大家整理了6个相当不错的免费壁纸网站&#xff0c;访问量极大、活跃度极高。 无需登录、注册&#xff0c;打开右键就可以下载&#xff0c;而且壁纸图片的尺寸大小&#xff0c;可以选择&#xff0c;从手机、平板、再到电脑壁纸&#xff0c;全部都是高清。…

Windows/Ubuntu安装frida和objection

​Windows/Ubuntu安装frida和objection 1.Windows环境使用管理员权限安装frida,Ubuntu使用普通或Root权限安装均可 https://github.com/frida/frida (1).安装frida(Python2.7.8及以上版本) pip install numpy matplotlib -i https://mirrors.aliyun.com/pypi/simplepip insta…

imx6ull pro BSP 工具链

BSP&#xff0c;Board Support Package&#xff0c;指板级支持包&#xff0c;是构建嵌入式操作系统所 需的引导程序(Bootload)、内核(Kernel)、根文件系统(Rootfs)和工具链 (Toolchain)。 每种开发板的 BSP 都不一样&#xff0c;并且这些源码都非常庞大。我们把这些源码都 放在…