Java が AI 顔融合特殊効果を実装
プロジェクトの背景
最近、chat-gpt が普及して以来、人工知能分野における AI テクノロジーの継続的な反復革新により、人々の生活に多くの衝撃的なアプリケーションがもたらされました。例えば、DouyinやBilibiliなどの大手プラットフォームではAI顔フュージョンの特殊効果が増えてきているので、それを踏まえてサードパーティのオープンソースAPIを利用して独自の顔フュージョンを実現することも考えています。
AI顔融合特殊効果の原理
AI フェイス フュージョン特殊効果は、ディープ ラーニングとコンピューター ビジョン テクノロジーに基づいた革新的なアプリケーションで、ある人の顔の特徴を別の人の写真やビデオに統合して、驚くほどリアルな効果を実現できます。有名人、キャラクター、歴史上の人物の顔の特徴を自分と統合できるだけでなく、トランスジェンダーやトランスエイジなどのさまざまなアイデンティティの変容を実現することもできます。
そして、それはディープ ニューラル ネットワークの強力な処理能力と切り離すことができません。まず、大量の顔データをトレーニングすることにより、ネットワークは各人の顔の特徴を正確に抽出し、それらを高次元のベクトル表現にエンコードできます。次に、敵対的生成ネットワーク (GAN) やオートエンコーダーなどのモデルを使用して、ソース画像の顔の特徴とターゲット画像を高精度で融合します。最後に、パラメーターの調整と最適化の後、生成された画像は、ターゲット画像のスタイルを維持しながら、ソース画像の顔の特徴を完全に復元します。
このテクノロジーを画期的なものにしているのは、その卓越したリアリズムと信憑性です。AI顔融合特殊効果により、ユーザーは手軽に超現実的な体験をすることができ、憧れの有名人に近づく喜びを感じることができます。同時に、映画やテレビのエンターテインメント業界に巨大な革新の余地をもたらし、俳優が異なる役を自由に切り替えることができるため、観客はより想像力豊かな作品を見ることができます。
コード
始める前に、Baidu Smart Cloud、Ali、その他のプラットフォームなど、いくつかのサードパーティの顔融合特殊効果の効果を個人的に比較しましたが、最終的な比較の後、個人的には Baidu Smart Cloud の効果が優れていると思います。 、今回はBaidu Smart CloudのサードパーティAPIを借用するだけで、顔フュージョンの特殊効果を実現できます。
まずアカウントを登録し、次にコンソールで顔認識を検索し、無料の基本サービス リソースを申請します。ただし、今日は実現したい顔融合の特殊効果を購入する必要があるため、アプリケーションを作成します。 。作成が成功すると、プラットフォームはこのアプリケーションに関連する資格情報 (主に AppID、API キー、秘密キー) を割り当てます。これらの値をそれぞれ書き留める必要があります:client_id
と。これらの値client_secret
は、後でトークン インターフェイスを呼び出すときに使用されます。
ステップ 1: トークン インターフェイスを呼び出す
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_tokens 文字列が取得されます。
フェイスフュージョン
取得したトークンを使用して、サードパーティ 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 画像はサポートしていません
このインターフェイスには主に 2 つの部分が含まれています。
1 つ目はテンプレート画像で、ユーザーがマージしたいエフェクトです。これがデフォルトです。たとえば、デジタル ヒューマンの画像と結合したい場合、このデジタル ヒューマンはテンプレート画像であり、その Base64 を i プロジェクトに書き込むことができます。
2 番目はターゲット画像です。ターゲット画像はユーザーがアップロードした自撮り画像です。これは動的であり、ユーザーごとにアップロード方法が異なります。これもbase64トランスコーディングである必要があります。
重要なリクエストパラメータ:
次のような重要なリクエスト パラメーターもいくつかあります。
image_template
オブジェクト: テンプレート画像情報、融合する必要がある顔。
このオブジェクトにはいくつかのパラメータがあります。
image
:テンプレート画像情報画像の解像度は1920x1080以下である必要があります。
image_type
:
画像タイプ
BASE64
: 画像の Base64 値;
URL
: 画像の URL (ネットワークやその他の理由により、画像のダウンロードに時間がかかりすぎる場合があります)
FACE_TOKEN
:: 顔の識別
同様に、ターゲットのターゲット グラフ パラメーターにも同じことが当てはまります。
いくつかのツール
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日で最初から最後まで実現でき、全体的な効果としてはかなり満足できるものでした。