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


    项目背景

    最近自从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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    当调用的时候,会获取到如下的一大串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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    这边有几个注意事项:

    • 请求体格式化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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    最终效果图

    在这里插入图片描述

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

  • 相关阅读:
    第二十七章HTML.CSS综合案例(二)
    SW的stp文件转成CAD格式文件学习笔记
    帧内预测中的initPredIntraParams()函数 (负参考方向处在跑代码时再看一遍)
    KY199 查找
    IOS面试题object-c 146-150
    【萌新向】Sql Server保姆级安装教程-图文详解手把手教你安sql
    瑞萨e2studio(27)----使用EZ-CUBE3烧录
    什么是“path”环境变量?path的作用是什么?
    【记录一个问题】hexo+butterfly+自定义CSS格式浏览器无法识别报错为(text/html)
    基于 http-flv 的抖音直播端到端延迟优化实践
  • 原文地址:https://blog.csdn.net/weixin_44427181/article/details/131640101