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);
}
}
最终效果图
整体来说,这次人脸融合特效实现下来,并不拿,一个下午就能从头到尾实现出来,整体的效果,还是挺令人满意的。