InsightFaceで顔の入れ替え(Faceswap)

目次

1. はじめに
2. InsightFace
3. Faceswap
4. 実験(コード)
4. まとめ

1. はじめに

顔の入れ替え、あるいはFaceSwapと呼ばれる技術は、最近のコンピュータビジョンと深層学習の進歩により、ますます人気が高まっています。この技術は、画像や動画の中の顔を交換するために使用され、エンターテイメント、プライバシーの保護、教育、研究などのさまざまな分野で応用されています。本記事では、InsightFaceという顔認識ライブラリを使用して顔の入れ替え(FaceSwap)を行う方法について説明します。

 

2. InsightFace

InsightFace(インサイトフェイス)は、2Dおよび3Dの顔の分析のための統合されたPythonライブラリです。InsightFaceは、顔認識、顔検出、および顔の位置合わせの最先端のアルゴリズムを効率的に実装しており、これらはトレーニングとデプロイの両方に最適化されています。研究機関や産業組織は、InsightFaceライブラリから利益を得ることができます。このプロジェクトは18,000以上のスターを獲得しています。

ライセンス

InsightFaceのコードはMITライセンスの下で公開されています。学術的な利用と商業利用の両方に制限はありません。

注釈を含むトレーニングデータ(およびこれらのデータでトレーニングされたモデル)は、非商業研究の目的でのみ利用可能です。

 

開発者は多くの賞を受賞しています。

https://insightface.ai/

 

3. FaceSwap

FaceSwapは、InsightFaceと同様に顔認識技術を利用したプロジェクトの一部であり、顔の入れ替えを実現するために開発されました。このツールは、2つの異なる顔の画像から、顔の特徴を抽出し、それらを交換することで、リアルな顔の入れ替えを実現します。

 

4. 実験(コード)

さて、実際にInsightFaceとFaceSwapを使用して顔の入れ替えを行う手順を以下に示します。

実行の環境は Google colabです。

 

Google driveを接続します。

from google.colab import drive

drive.mount(‘/content/drive’)

 

ライブラリのインストール

%%capture

!pip install onnxruntime

!pip install insightface

 

ライブラリのインポート

import os

import glob

import numpy as np

 

import cv2

import matplotlib.pyplot as plt

import insightface

from insightface.app import FaceAnalysis

print(“insightface”,insightface.__version__)

insightface 0.7.3

 

顔認識

モデルをロードします。

app = FaceAnalysis(name=’buffalo_l’)

app.prepare(ctx_id=0, det_size=(640, 640))

 

Githubから、私の顔の写真をダウンロードします。

!wget https://upload.wikimedia.org/wikipedia/commons/7/71/Tom_Cruise_avp_2014_4.jpg

画像の確認

my_img = cv2.imread(“Tom_Cruise_avp_2014_4.jpg”)

plt.imshow(my_img[:,:,::-1])

plt.axis(“off”)

plt.show()

顔認証します。

my_face = app.get(my_img)

 

source_face = my_face[0]

bbox = source_face[“bbox”]

bbox = [int(b) for b in bbox]

plt.imshow(my_img[bbox[1]:bbox[3], bbox[0]:bbox[2],::-1])

plt.axis(“off”)

plt.show()

結果は dict型です。顔の場所だけだわなくて、性別、年齢などの情報も取れます。

my_face[0].keys()

dict_keys([‘bbox’, ‘kps’, ‘det_score’, ‘landmark_3d_68’, ‘pose’, ‘landmark_2d_106’, ‘gender’, ‘age’, ’embedding’])

 

下記のような結果です。

print(“bbox:”, my_face[0].bbox)

print(“kps:”, my_face[0].kps)

print(“det_score:”, my_face[0].det_score)

print(“pose:”, my_face[0].pose)

print(“gender:”, my_face[0].gender)

print(“age:”, my_face[0].age)

bbox: [150.00177  64.14928 303.9562  279.5352 ]

kps: [[182.51361 148.43512]

[257.00348 150.25749]

[213.50298 191.23099]

[184.23116 223.63794]

[250.52095 225.82053]]

det_score: 0.9015023

pose: [-0.03506483 -7.086247    2.1340802 ]

gender: 1

age: 43

 

では、サンプル画像を読み込みます。

from insightface.app.mask_renderer import ins_get_image

 

img = ins_get_image(“t1”)

plt.imshow(img[:,:,::-1])

plt.axis(“off”)

plt.show()

6人の顔を認証しました。

faces = app.get(img)

print(len(faces))

6

各の顔を確認します。

img = ins_get_image(“t1”)

fig ,axs = plt.subplots(1, 6, figsize=(12,5))

 

for i, face in enumerate(faces):

bbox = face[‘bbox’]

bbox = [int(b) for b in bbox]

axs[i].imshow(img[bbox[1]:bbox[3], bbox[0]:bbox[2],::-1])

axs[i].axis(“off”)

Faceswap

ライブラリはモデルweightをダウンロードできませんので、hugging faceで共有されているファイルをダウンロードします。

!wget https://huggingface.co/jingwora/inswapper_128/resolve/main/inswapper_128.onnx

 

モデルを読み込みます。

swapper = insightface.model_zoo.get_model(‘inswapper_128.onnx’,

download=True,

download_zip=True)

 

Faceswapを行います。結構いい結果ができました。

res = img.copy()

for face in faces:

res = swapper.get(res, face, source_face, paste_back=True)

 

fig, ax = plt.subplots()

plt.imshow(res[:,:,::-1])

plt.axis(“off”)

plt.show()

各顔を確認すると、確かにそれぞれが交換されていることがわかります。

result = app.get(img)

 

fig ,axs = plt.subplots(1, 6, figsize=(12,5))

 

for i, face in enumerate(result):

bbox = face[‘bbox’]

bbox = [int(b) for b in bbox]

axs[i].imshow(res[bbox[1]:bbox[3], bbox[0]:bbox[2],::-1])

axs[i].axis(“off”)

まとめ

この記事では、顔の入れ替え技術、特にFaceSwapについて紹介しました。FaceSwapは、最近のコンピュータビジョンと深層学習の進歩により、ますます注目されている技術であり、画像や動画の中の顔を交換するために幅広く利用されています。InsightFaceという顔認識ライブラリを使用することで、FaceSwapの品質と精度が向上することができます。

また、実際にInsightFaceとFaceSwapを用いて顔の入れ替えを行う手順をGoogle Colab環境で示しました。これにより、実際のコードを利用して顔の入れ替えを行う準備が整いました。顔の入れ替え技術は今後も進化し、様々な用途で活用されることが期待されます。

 

参照:

– ページ:https://insightface.ai/

– github:https://github.com/deepinsight/insightface

担当者:HM

香川県高松市出身 データ分析にて、博士(理学)を取得後、自動車メーカー会社にてデータ分析に関わる。その後コンサルティングファームでデータ分析プロジェクトを歴任後独立 気が付けばデータ分析プロジェクトだけで50以上担当

理化学研究所にて研究員を拝命中 応用数理学会所属