如何利用Java实现 AI 人脸融合特效

news2024/11/16 16:02:03

Java实现AI人脸融合特效

    • 项目背景
    • AI 人脸融合特效的原理
    • 代码实现
      • 第一步:调用token接口
      • 人脸融合
      • 部分工具类
      • 最终效果图

项目背景

最近自从chat-gpt爆火以来,AI技术在人工智能领域持续迭代的创新,为人们的生活带来了许多震撼的应用。比如其中的,AI人脸融合特效,在各大抖音、B站等平台上,越来越火热,基于这,我也打算利用第三方开源的API,来实现一个自己的人脸融合。

AI 人脸融合特效的原理

AI人脸融合特效是一种基于深度学习和计算机视觉技术的创新应用,它能够将一个人的面部特征融入到另一个人的照片或视频中,实现惊人逼真的效果。不仅可以将名人、角色或者历史人物的面部特征与自己进行融合,还可以实现跨性别、跨年龄等不同身份的转换。

那么它的背后离不开深度神经网络的强大处理能力。首先,通过训练海量的人脸数据,网络能够准确地提取出每个人的面部特征,并将其编码为高维向量表示。接着,利用生成对抗网络(GAN)和自编码器等模型,将源图像的面部特征与目标图像进行高度精确地融合。最终,经过参数调整和优化,生成的图像在保持目标图像风格的同时,完美还原了源图像的面部特征。

这项技术的突破性之处在于其出色的真实感和可信度。通过AI人脸融合特效,用户可以轻松拥有一种超越现实的体验,感受到与自己所崇拜的名人亲近的乐趣。同时,它为影视娱乐产业带来了巨大的创新空间,演员们能够在不同角色之间自由切换,让观众看到更多富有想象力的作品。

代码实现

在开始之前,我个人私下里对比了几家第三方人脸融合特效的效果,比如百度智能云、阿里等等平台,最终对比之后,个人觉得还是百度智能云的效果更好些,因此,这次就借用百度智能云第三方API来实现人脸融合特效。

我们先注册一个账号,然后在控制台这里,我们可以搜索人脸识别,申请到部分免费的基础服务的资源,但今天我们要实现的人脸融合特效,是需要购买的,所以我们创建应用。创建成功后,平台将会分配给您此应用的相关凭证,主要为AppID、API Key、Secret Key。我们要记下这几个数值:分别是client_id 以及 client_secret,后面在调用 token接口的时候会用到。

在这里插入图片描述

第一步:调用token接口

public static String getToken() {
    String grant_type = "client_credentials";
    String client_id = "fasq35sadvsvqwr5q...";
    String client_secret = "fasq35sadvsvqwr5q...";
    String url = "https://aip.baidubce.com/oauth/2.0/token" + "?grant_type=" + grant_type + "&client_id=" + client_id + "&client_secret=" + client_secret;

    String result = HttpClient.doGet(url);
    
    System.out.println(result);
    return result;
}

当调用的时候,会获取到如下的一大串access_token:

在这里插入图片描述

人脸融合

利用刚刚获取到的token,我们可以去调用第三方API,路径为:
url = "https://aip.baidubce.com/rest/4.0/face/v1/merge"

 public static String faceMerge() {
        // 请求url
        String url = "https://aip.baidubce.com/rest/4.0/face/v1/merge";
        try {
            Map<String, Object> map = new HashMap<>();
            //模板图
            Map<String, Object> image_templateMap = new HashMap<>();
            image_templateMap.put("image", "sfasq35sadvsvqwr5q...");
            image_templateMap.put("image_type", "BASE64");
            image_templateMap.put("quality_control", "HIGH");
            map.put("image_template", image_templateMap);

            //目标图,用户自己上传的图片
            Map<String, Object> image_targetMap = new HashMap<>();
            image_targetMap.put("image", "sfasq35sadvsvqwr5q...");
            image_targetMap.put("image_type", "BASE64");
            image_targetMap.put("quality_control", "HIGH");
            map.put("image_target", image_targetMap);

            String param = GsonUtils.toJson(map);

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = "[调用鉴权接口获取的token]";

            String result = HttpUtil.post(url, accessToken, "application/json", param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

这边有几个注意事项:

  • 请求体格式化Content-Type为application/json,通过json格式化请求体。
  • Base64编码:请求的图片需经过Base64编码,图片的base64编码指将图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。需要注意的是,图片的base64编码是不包含图片头的,如data:image/jpg;base64,
  • 图片格式:现支持PNG、JPG、JPEG、BMP,不支持GIF图片

这个接口里主要包括两部分内容:

第一个就是模板图,模板图就是用户想要融合成的效果样子。这个是默认,比如我要和一个数字人图片融合,那么这个数字人就是模板图,我们可以把它的base64写死在i项目里即可。

第二个就是目标图,目标图就是用户上传的自拍图,这个就是动态的,不同的用户上传的不一样。这个同样也需要是base64转码的。

重要的请求参数:

其中也有几个比较重要的请求参数如下:

image_template 对象 :模板图信息,要求被融合的人脸;

该对象里有几个参数为:

image:模板图信息 图片的分辨率要求在1920x1080以下

image_type

图片类型
BASE64:图片的base64值;
URL:图片的 URL( 下载图片时可能由于网络等原因导致下载图片时间过长)
FACE_TOKEN::人脸标识

同理,target目标图参数也是如此:

在这里插入图片描述

部分工具类

public class GsonUtils {
    private static Gson gson = new GsonBuilder().create();

    public static String toJson(Object value) {
        return gson.toJson(value);
    }

    public static <T> T fromJson(String json, Class<T> classOfT) throws JsonParseException {
        return gson.fromJson(json, classOfT);
    }

    public static <T> T fromJson(String json, Type typeOfT) throws JsonParseException {
        return (T) gson.fromJson(json, typeOfT);
    }
}

最终效果图

在这里插入图片描述

整体来说,这次人脸融合特效实现下来,并不拿,一个下午就能从头到尾实现出来,整体的效果,还是挺令人满意的。

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

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

相关文章

C++刷题第六天 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

454. 四数相加 II 哈希表的经典题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 解题思路 这个…

【QT】——QChartView,QChart,QValueAxis类的使用,折线图,柱状图,饼状图的实现

目录 1.QChartView——视图 2.QChart——图表 3.QValueAxis类方法——坐标轴类 4.QAbstractSeries 5.折线图的实现 6.柱状图的实现 7.饼状图的实现 QChart主要由一下几个大类组成&#xff1a;QChartView类、QChart类、QAbstractSeries类、QValueAxis类 QChartView类 为视…

为什么Qt框架没有广泛流行起来?

Qt框架实际上是相当流行和广泛使用的框架之一&#xff0c;尤其在跨平台应用程序开发领域。然而&#xff0c;以下是一些可能解释为什么Qt框架没有在某些领域或某些地区广泛流行起来的原因&#xff1a; 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 缺乏…

【Java】一只小菜坤的编程题之旅【1】

文章目录 1.判断是否为回文字符串&#xff08;题号&#xff1a;牛客NC141 &#xff09;2、求平方根&#xff08;题号&#xff1a;牛客NC32 &#xff09;3.截断句子&#xff08;力扣&#xff09;4.删除有序数组中的重复项&#xff08;力扣&#xff09; 1.判断是否为回文字符串&a…

Simulink仿真模块 - Memory

Memory:输出上一个时间步的输入 在仿真库中的位置为:Simulink / Discrete HDL Coder / Discrete 模型为: 双击模型打开参数设置界面,如图所示: 说明 Memory 模块将其输入保持并延迟一个主积分时间步。当放置于迭代子系统中时,该模块将其输入保持并延迟一个迭代。…

聚焦前沿技术产业应用,文心大模型应用研讨会于广州顺利举办

当前&#xff0c;人工智能已经成为新一轮科技革命和产业变革的重要驱动力量&#xff0c;基于强算法、大算力和大数据的大模型成为人工智能发展的主流方向。 为进一步探索AI大模型的产业实践&#xff0c;2023年7月4日下午&#xff0c;由文心大模型和飞桨主办的“AI私享会-文心大…

STM32使用printf重定向到USART(串口)并打印数据到串口助手

STM32使用sprintf打印数据到串口助手 一.背景知识二. 重定向printf到USART1三.使用printf打印hello,world到串口助手3.1 usart.c3.2 usart.h3.3 main.c 四. 实验现象五.结语 一.背景知识 我们知道我们在进行编程的时候&#xff0c;遇到问题&#xff0c;经常通过打印信息进行调…

【MySQL】不允许你不会创建高级联结

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

浅谈一下 webpack 以及 loader 和 plugin

话说&#xff0c;前端练习时长也快两年了&#xff0c;但是关于 webpack 的东西好像也没怎么研究过 &#x1f605; &#x1f6a9;一是没有这方面的需求&#xff1a;回想一下&#xff0c;关于 webpack 的配置相关工作&#xff0c;也就只有自己配置过一次 loader「使用 svg-sprit…

5G工业路由器赋能无人驾驶技术发展,无线车联网应用方案

随着无人驾驶技术进入大众视野&#xff0c;5G技术已广泛应用在各行各业中&#xff0c;无人驾驶也成了汽车自动化发展的核心趋势。无人驾驶技术需要满足低时延、高效率、大带宽、稳定性等硬性要求&#xff0c;工业路由器IR2730采用5G网络快速接入&#xff0c;拥有广泛连接能力&a…

appium 笔记

配置相关信息查看 appium.io 初始化&#xff1a; desired_caps {} desired_caps["automationName"] "UiAutomator2" desired_caps["platformName"] "Android" # 操作系统类型 desired_caps["platformVersion"] "5…

[入门必看]数据结构6.2:图的存储及基本操作

[入门必看]数据结构6.2&#xff1a;图的存储及基本操作 第六章 图6.2 图的存储及基本操作知识总览6.2.1 邻接矩阵法6.2.2 邻接表法6.2.36.2.4 十字链表、邻接多重表6.2.5 图的基本操作 6.2.1 邻接矩阵法图的存储——邻接矩阵法邻接矩阵法存储带权图&#xff08;网&#xff09;邻…

OpenAI再建顶级团队,重金招聘核心岗成员,阻止超级AI的威胁!

“AI确实可能会杀死人类。”这并不是哪家自媒体为博人眼球而发表的谣言&#xff0c;而是ChatGPT之父、OpenAI CEO山姆奥尔特曼在今年3月与MIT研究科学家Lex Fridman对话时亲口所说的一句话。 如今&#xff0c;这位全世界最受瞩目的老板决定采取行动&#xff0c;以阻止自己的预…

【算法】AcWing算法基础课笔记 第一章 基础算法 Part 1

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;AcWing &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对你…

Python程序设计基础:列表与元组(一)

文章目录 一、列表的表示与访问1、列表的表示2、列表的访问 二、列表的元素操作1、元素的修改2、元素的增加3、元素的删除4、其他操作 三、列表操作1、列表的遍历2、列表的排序3、列表的切片4、列表的扩充5、列表的复制6、列表的删除 一、列表的表示与访问 1、列表的表示 列表…

自营外卖配送平台的商家如何对接第三方美饿的订单

自营外卖跑腿平台对接第三方美饿的好处 单说美团饿了么自身的流量优势&#xff0c;很多商家不能忽视&#xff0c;但是美团饿了么的高额配送成本与抽成&#xff0c;同样也不能忽视。很多商家希望选择自配送或者其他更划算的配送方式来节省成本。这时&#xff0c;区域性的自建外…

【Java】单例模式

单例模式 设计模式概述单例模式实现思路饿汉式懒汉式饿汉式 vs 懒汉式 设计模式概述 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我…

AttributeError: module ‘collections‘ has no attribute ‘Iterable‘

vitables 出现 AttributeError: module collections has no attribute Iterable错误修改如下图&#xff1a;

PCIE转PMC载板

描述 这是一款被动适配卡&#xff0c;它支持通过要转换为 PCIe x4 通道边缘连接器的 AMC 接头&#xff0c;来选择 TI EVM&#xff1b;因此它可被插入一个台式计算机或使用 PCIe 接头的任何位置。选定的 TI EVM 支持 DSP 上的本地 PCIe。此卡作为适配器&#xff0c;需要可与 AMC…

Linux与Windows:操作系统的比较与技巧分享

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…