目次
1. はじめに
2. InsightFace
3. Faceswap
4. 実験(コード)
4. まとめ
1. はじめに
顔の入れ替え、あるいはFaceSwapと呼ばれる技術は、最近のコンピュータビジョンと深層学習の進歩により、ますます人気が高まっています。この技術は、画像や動画の中の顔を交換するために使用され、エンターテイメント、プライバシーの保護、教育、研究などのさまざまな分野で応用されています。本記事では、InsightFaceという顔認識ライブラリを使用して顔の入れ替え(FaceSwap)を行う方法について説明します。
2. InsightFace
InsightFace(インサイトフェイス)は、2Dおよび3Dの顔の分析のための統合されたPythonライブラリです。InsightFaceは、顔認識、顔検出、および顔の位置合わせの最先端のアルゴリズムを効率的に実装しており、これらはトレーニングとデプロイの両方に最適化されています。研究機関や産業組織は、InsightFaceライブラリから利益を得ることができます。このプロジェクトは18,000以上のスターを獲得しています。
ライセンス
InsightFaceのコードはMITライセンスの下で公開されています。学術的な利用と商業利用の両方に制限はありません。
注釈を含むトレーニングデータ(およびこれらのデータでトレーニングされたモデル)は、非商業研究の目的でのみ利用可能です。
開発者は多くの賞を受賞しています。
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以上担当
理化学研究所にて研究員を拝命中 応用数理学会所属