日本人顔認識のための新たな学習モデルを作成 ~ EfficientNetV2ファインチューニング ~

この記事は、Zennに投稿した内容に、加筆・修正を加えたものです


アイキャッチ画像

ℹ️ Note

結論

  1. 転移学習で日本人用顔認証学習モデルを開発しました。
  2. Dlib学習モデルと比較して、日本人の顔認証精度が大幅に向上しました。
  3. 学習モデルをFACE01_trained_models で公開しました。

はじめに

顔認識技術は、スマートフォンのロック解除から空港のシステムまで、私たちの生活のあらゆる面で使用されています。しかしOSSの既存顔認識モデルであるDlibdlib_face_recognition_resnet_model_v1.datは、白人の顔に対する精度は高いものの、それ以外の人種、特に日本人の顔に対する精度が低いという問題があります。

この問題を解決するために、この記事では日本人専用の顔認識システム用学習モデルの開発について説明します。効率的な学習モデルであるEfficientNetV2-Sarcface損失関数を組み合わせることで、日本人の顔認証の精度を向上させることを目指しました。

FACE01 (顔認証システムを簡単に構築できるライブラリ) で採用している顔認識モデルのdlib_face_recognition_resnet_model_v1.datは、LFW (Labeled Faces in the Wild) データセットにおいて99.38%の精度を達成しています。しかしこのモデルは白人に対する精度は高いものの、それ以外の人種、特に日本人に対する精度は低いという問題がありました。そのため、これまでは認識精度を向上させるためにしきい値を調整するなどの対策が必要でした。またしきい値を調整してもなおFalse Positive (偽陽性)が一定値存在する問題が残っていました。


Dlibが偽陽性を出す例

そこで、日本人の顔データセット(2623ids, 271,875枚)を使用して新たな顔認識モデルを開発することにしました。データセットが小さいため、大規模な画像データセットであるImageNetで事前学習されたEfficientNetV2をベースにファインチューニングを行いました。

結果として新たに開発した学習モデルは26MBと、既存のdlibモデル(22.5MB)よりわずかに大きいサイズとなりましたが、同等の計算リソースでより高精度な日本人の顔認証が可能となりました。また、今回は時間の制約上簡易的な検証ですが、学習データセットにない日本人に対し98.9%の精度を達成しました。特にDlibの学習モデルがFalse Positive (偽陽性)を出しやすい日本人に対して、False Positive0に抑えることができました。

今後の展望としては、MobileFaceNetsを使用してゼロから学習することでモデルの軽量化を目指します。これによりさらに効率的な顔認証システムの開発を進めていく予定です。

また今回学習されたモデルは、次期バージョンのFACE01の顔認証システムに採用する予定です。

方法

大規模な画像データセットであるImageNetで事前学習されたEfficientNetV2をベースに、日本人の顔データセットでファインチューニングを行いました。また、学習時の損失関数としてArcFaceを採用しました。これにより、特徴空間での顔の分離を改善し、日本人の顔認識精度を大幅に向上できました。

実装

今回の実装では、EfficientNetV2-SArcFaceを組み合わせた新たなモデルを開発します。以下にその詳細を示します。

まず、必要なライブラリをインポートします。

import matplotlib.pyplot as plt
import numpy as np
import pytorch_metric_learning
import timm  # timmをインポート
import torch.nn as nn
import torch.onnx  # ONNXをインポート
import torchvision
import umap  # UMAPをインポート
from pytorch_metric_learning import losses, regularizers, samplers
from sklearn.model_selection import StratifiedShuffleSplit
from torch.utils.data import DataLoader
from torch.utils.tensorboard.writer import \
    SummaryWriter  # tensorboardのSummaryWriterをインポート
from torchvision import datasets, transforms

次に、乱数シードを固定します。これにより、実験の再現性が確保されます。

def fix_seed(seed):
    # random
    random.seed(seed)
    # numpy
    np.random.seed(seed)
    # pytorch
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False

次に、EfficientNetV2-SArcFaceLossを組み合わせた新たなモデルを定義します。

class CustomModel(nn.Module):
    def __init__(self, embedding_dim=embedding_size):
        super(CustomModel, self).__init__()

        # EfficientNet V2の事前学習済みモデルを取得し、trunkとして定義
        self.trunk = timm.create_model('tf_efficientnetv2_b0', pretrained=True)
        num_features = self.trunk.classifier.in_features  # `_fc`属性を使用する

        # trunkの最終層にembedding_size次元のembedder層を追加
        self.trunk.classifier = nn.Linear(num_features, embedding_dim)

    def forward(self, x):
        return self.trunk(x)

最後に、学習ループを定義します。ここでは、各エポックでの訓練と検証、モデルの保存、早期終了の処理などを行います。

for epoch in range(epoch, num_epochs):
    # 省略: 訓練フェーズのコード

    # 検証フェーズ
    val_loss = evaluate(val_dataloader, model, criterion, device)
    print(f'Epoch [{epoch + 1}/{num_epochs}], Val Loss: {val_loss}')
    writer.add_scalar("Loss/val", val_loss, epoch)

    # 追加: 早期終了の処理
    if val_loss < best_loss:
        best_loss = val_loss
        early_stopping_counter = 0
        # 保存するモデルのパスを設定
        model_path = "best_model.pth"
        torch.save(model.state_dict(), model_path)
    else:
        early_stopping_counter += 1
        print(f"Early stopping counter: {early_stopping_counter}")
        if early_stopping_counter >= patience:  # 指定した回数連続で改善しなかったら、学習を停止
            print("Early stopping")
            break

    # 各エポックごとにモデルを保存(チェックポイント)
    save_checkpoint(model, optimizer, epoch, loss, "checkpoint.pth")

UMAPによる可視化結果
UMAPによる可視化結果

日本人顔画像データセット

MicroSoftによるMS-Celeb-1Mが非公開になったことは顔認証に関わる方なら記憶にあることと思います。顔データセットは肖像権やプライバシーと無関係ではないため、データセットの公開には慎重な対応が必要です。
ですのでここでは手法と実際のコードについて説明します。

顔領域の切り出し

FACE01ライブラリのUtilsクラスを用います。

# `sys.path`に`FACE01`ライブラリのパスを追加
sys.path.append('FACE01')
from face01lib.utils import Utils  # type: ignore
Utils_obj = Utils()

# `crop_face`関数を定義
def crop_face(file_path):
    Utils_obj.align_and_resize_maintain_aspect_ratio(
        path=file_path,
        padding=0.4,
        size=224
    )
# 並行処理
max_workers = 4
with concurrent.futures.ProcessPoolExecutor(max_workers=max_workers) as executor:
    executor.map(crop_face, crop_file_path_list)

実際にはCPU温度が高くなりすぎてしまうため、Utilsクラスのtime_sleep関数を用いてCPU温度を監視し、指定時間処理を停止させる処理を適宜はさみます。

# CPU温度が72度を超えていたら待機
Utils_obj.temp_sleep()

別人画像の削除

FACE01ライブラリのUtils, load_preset_image, Dlib_apiクラスを用います。

sys.path.insert(1, 'FACE01')
from face01lib import load_preset_image
from face01lib.api import Dlib_api
from face01lib.utils import Utils

Dlib_api_obj = Dlib_api()
Utils_obj = Utils()

処理のキモ

  • 顔画像から顔特徴量を抽出します。
known_face_encodings_list, known_face_names_list = \
    load_preset_image.load_preset_image(
        RootDir=dir_folder_path,
        preset_face_imagesDir=dir_folder_path,
        upsampling=0,
        jitters=0,
        mode='hog',
        model='small'
    )
  • 別人の顔画像を検索して削除します。
pairs = itertools.product(default_datas.items(), other_datas.items())
threshold_same_person: float = 0.4  # 任意
for pair in pairs:
    # CPU温度チェック
    Utils_obj.temp_sleep()
    cp_distance = cp.linalg.norm(
        pair[0][1] - \
        pair[1][1],
        ord=2, axis=None
        )
    if cp_distance < threshold_same_person:  # 同一人物と判定
        continue
    elif cp_distance > threshold_not_person:  # 意味のない写真や画像と判断
        # ファイルを削除
        try:
            os.remove(os.path.join(dir_folder_path, pair[1][0]))
        except Exception as e:
            print(f"error: {e}")
            traceback.print_exc()
    else:  # 顔が写っているが、別人と判断
        print(pair[0][0])
        print(pair[1][0])
        os.rename(
            os.path.join(dir_folder_path, pair[1][0]),
            os.path.join(dir_folder_path, 'not_me', pair[1][0])
          )

cupyライブラリがキモです。cupynumpyと同じように使えるGPU対応のライブラリです。cupy.linalg.norm関数はnumpy.linalg.norm関数と同じですが、GPUを使用して計算を行うことができます。cupy.linalg.norm関数を使用することで、顔画像の顔特徴量を抽出する処理をCPUで行うよりも高速に処理することができます。

  • 同一顔画像を検索して ‘same_face’フォルダに隔離します。
def distances_per_pair(all_datas, dir_folder_path, threshold_same_person) -> None:
    # CPU温度チェック
    Utils_obj.temp_sleep()

    combination = itertools.combinations(all_datas.keys(), 2)
    print(
        f'Search for combinations of {len(list(combination))} pairs.'
    )
    print('Calculating distances between pairs...')
    for pair in tqdm(list(itertools.combinations(all_datas.keys(), 2))):
        cp_distance = cp.linalg.norm(
            all_datas[pair[0]] - \
            all_datas[pair[1]],
            ord=2, axis=None
            )
        if cp_distance > 0.1:
            continue
        else:
            try:
                # pair[0]が文字列`default`を含まない場合、'same_face'フォルダに移動
                if 'default' not in pair[0]:
                    os.rename(
                        os.path.join(dir_folder_path, pair[0]),
                        os.path.join(dir_folder_path, 'same_face', pair[0])
                    )
            except Exception as e:
                print(f"error: {e}")
                traceback.print_exc()
    # 'same_face'フォルダの中に'default'文字列を含むファイルがあれば、'dir_folder_path'フォルダに移動
    same_face_dir_path = os.path.join(dir_folder_path, 'same_face')
    same_face_dir_files = os.listdir(same_face_dir_path)
    for same_face_dir_file in same_face_dir_files:
        if 'default' in same_face_dir_file:
            os.rename(
                os.path.join(same_face_dir_path, same_face_dir_file),
                os.path.join(dir_folder_path, same_face_dir_file)
            )
    # 処理が終わったことを示すファイルを作成
    with open(os.path.join(dir_folder_path, 'finished.txt'), mode='w') as f:
        f.write('finished')
    filename = str(threshold_same_person) + '.txt'
    with open(os.path.join(dir_folder_path, filename), mode='w') as f:
        f.write('finished')
    return

# same_face処理
distances_per_pair(all_datas, dir_folder_path, threshold_same_person)

ディレクトリの逐次削除

スクレイプ直後は4000ids程度あったデータセットですが、別人顔画像の削除をした結果1ディレクトリあたり80枚を満たないディレクトリは削除することで最終的に2000ids程度のデータセットになりました。

import os
import shutil

number = 80
root_dir = "スクレイプ終了"

for subdir in os.listdir(root_dir):
    subdir_path = os.path.join(root_dir, subdir)
    if os.path.isdir(subdir_path):
        # もし`noFace`ディレクトリならばスキップ
        if subdir == "noFace":
            continue
        png_count = len([name for name in os.listdir(subdir_path) if name.endswith(".png")])

        not_me_dir = os.path.join(subdir_path, "not_me")
        if os.path.exists(not_me_dir):
            png_count += len([name for name in os.listdir(not_me_dir) if name.endswith(".png")])

        if png_count < number:
            # ディレクトリを削除する
            shutil.rmtree(subdir_path)

exit()

結果と評価

評価用データセット

LWFデータセットを用いて既存のモデルと新たに開発したモデルの性能を比較してもよいのですが、LWFデータセットには日本人以外の顔画像がより多く含まれているため今回の主旨にはあいません。そこで、日本人の顔画像を含むデータセットを用いて、既存のモデルと新たに開発したモデルの性能を比較することにします。この時、学習に用いたデータセットとは異なるデータセットを用いることで、モデルの汎化性能を評価することができます。

本来であればそれ用にスクレイピングした日本人の顔画像を含むデータセットを作成し、日本人の顔認識の精度を評価しするところですが、ここでは時間の都合上、学習データセットにない20ids, 20枚の顔画像を用いて評価を行います。これらの全組み合わせは190組あります。この190組の顔画像のうち、同一人物の顔画像の組み合わせは20組あります。この20組の顔画像の組み合わせを同一人物と判断できるかどうか(その逆も)を評価します。

推論コード

時間の関係上、以下の推論コードは前処理などがベタ書きしてあります。

import os
from itertools import combinations

import numpy as np
import onnx
import onnxruntime as ort
import torchvision.transforms as transforms
from PIL import Image

model_name = 'efficientnetv2_arcface.onnx'
optimal_threshold = 0.4

# 画像の前処理を定義
mean_value = [0.485, 0.456, 0.406]
std_value = [0.229, 0.224, 0.225]
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(
        mean=mean_value,
        std=std_value
    )
])

# ONNXモデルをロード
onnx_model = onnx.load(model_name)
ort_session = ort.InferenceSession(model_name)

# 署名表示
for prop in onnx_model.metadata_props:
    if prop.key == "signature":
        print(prop.value)

# 入力名を取得
input_name = onnx_model.graph.input[0].name

# 推論対象の画像ファイルを取得
image_dir = "predict_test"
image_files = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith('.png')]

# 類似度判断の関数
def is_same_person(embedding1, embedding2, threshold):
    embedding1 = embedding1.flatten()
    embedding2 = embedding2.flatten()
    cos_sim = np.dot(embedding1, embedding2) / (np.linalg.norm(embedding1) * np.linalg.norm(embedding2))
    return cos_sim >= threshold, cos_sim

# 百分率の計算
def percentage(cos_sim):
    return round(-23.71 * cos_sim ** 2 + 49.98 * cos_sim + 73.69, 2)

# 画像を読み込み、前処理を行い、モデルで推論を行う
embeddings = []
for image_file in image_files:
    image = Image.open(image_file).convert('RGB')
    image = transform(image)
    image = image.unsqueeze(0)  # バッチ次元を追加
    image = image.numpy()
    embedding = ort_session.run(None, {input_name: image})[0]
    embeddings.append(embedding)

# すべての画像ペアの類似度を計算
for (file1, embedding1), (file2, embedding2) in combinations(zip(image_files, embeddings), 2):
    similarity, cos_sim = is_same_person(embedding1, embedding2, optimal_threshold)
    print(f"{file1}, {file2}, {similarity}, {percentage(cos_sim)}%")

閾値と百分率

コサイン類似度
$y = -23.71x^2 + 49.98x + 73.69$ として閾値を設定すると、以下のようになります。横軸がコサイン類似度(この場合は閾値)、縦軸が百分率です。閾値が0.4の時に、スコア90%以上の顔画像ペアが同一人物と判断されるようにしました。

結果

精度 (Accuracy): 98.9

$Accuracy = 98.9$ となりました。20組のうち、2組のみ誤判定となりました。
この2組はFalse Negativeとなっており、同一人物の顔画像ペアを異なる人物と判断 (それぞれ86%, 87%) しています。具体的には以下のとおりです。

predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   86%
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   87%

全ての組み合わせ結果を以下に示します。

predict_test/田村淳_2.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   68%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   69%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/関根勤_1.png_align_resize_default.png    FALSE   69%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   69%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   70%     
predict_test/柳原可奈子_2.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   71%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   71%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   71%     
predict_test/田村淳_2.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   71%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/エッグ矢沢_1.png_align_resize_default.png  FALSE   71%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/小倉弘子_1.png_align_resize_default.png   FALSE   71%     
predict_test/枡田絵理奈_2.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   71%     
predict_test/枡田絵理奈_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   71%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/柳原可奈子_1.png_align_resize_default.png  FALSE   72%     
predict_test/小倉弘子_2.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   72%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/田村淳_2.png_align_resize_default.png    FALSE   72%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/小倉弘子_1.png_align_resize_default.png   FALSE   72%     
predict_test/枡田絵理奈_2.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   72%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   72%     
predict_test/おぎやはぎ小木_1.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   72%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   72%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   72%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/エッグ矢沢_2.png_align_resize_default.png  FALSE   72%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   73%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   73%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   73%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   73%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   73%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   73%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   73%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   73%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/柳原可奈子_1.png_align_resize_default.png  FALSE   73%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   73%     
predict_test/枡田絵理奈_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   73%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   73%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   73%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/大塚愛_2.png_align_resize_default.png    FALSE   73%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   73%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   73%     
predict_test/おぎやはぎ小木_1.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   73%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   73%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   73%     
predict_test/田村淳_2.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   73%     
predict_test/柳原可奈子_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   73%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/田村淳_2.png_align_resize_default.png    FALSE   74%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   74%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   74%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/田村淳_2.png_align_resize_default.png    FALSE   74%     
predict_test/田村淳_1.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   74%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   74%     
predict_test/荻野目洋子_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   74%     
predict_test/大塚愛_1.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   74%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   74%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   74%     
predict_test/荻野目洋子_1.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   74%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   74%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   74%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   74%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   74%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   74%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/小倉弘子_1.png_align_resize_default.png   FALSE   74%     
predict_test/おぎやはぎ小木_2.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   74%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   74%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/柳原可奈子_1.png_align_resize_default.png  FALSE   74%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/草野マサムネ_1.png_align_resize_default.png FALSE   74%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   74%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   74%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   74%     
predict_test/枡田絵理奈_2.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   74%     
predict_test/小倉弘子_2.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   74%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   74%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/草野マサムネ_1.png_align_resize_default.png FALSE   74%     
predict_test/小倉弘子_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   74%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   74%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/柳原可奈子_1.png_align_resize_default.png  FALSE   75%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/エッグ矢沢_1.png_align_resize_default.png  FALSE   75%     
predict_test/おぎやはぎ小木_1.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   75%     
predict_test/関根勤_2.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   75%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   75%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   75%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   75%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   75%     
predict_test/大塚愛_1.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   75%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/柳原可奈子_1.png_align_resize_default.png  FALSE   75%     
predict_test/荻野目洋子_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   75%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   75%     
predict_test/関根勤_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   75%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/大塚愛_2.png_align_resize_default.png    FALSE   75%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/大塚愛_2.png_align_resize_default.png    FALSE   75%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   75%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/柳原可奈子_1.png_align_resize_default.png  FALSE   75%     
predict_test/大塚愛_1.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   75%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   75%     
predict_test/荻野目洋子_1.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   75%     
predict_test/枡田絵理奈_2.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   75%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/大塚愛_2.png_align_resize_default.png    FALSE   75%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/大塚愛_2.png_align_resize_default.png    FALSE   75%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   75%     
predict_test/大塚愛_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   75%     
predict_test/大塚愛_1.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   75%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   75%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   75%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/荻野目洋子_2.png_align_resize_default.png  FALSE   76%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   76%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   76%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   76%     
predict_test/荻野目洋子_1.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   76%     
predict_test/大塚愛_1.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   76%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   76%     
predict_test/柳原可奈子_2.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   76%     
predict_test/関根勤_2.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   76%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   76%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   76%     
predict_test/荻野目洋子_1.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   76%     
predict_test/荻野目洋子_1.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   76%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   76%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   76%     
predict_test/関根勤_2.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   76%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/草野マサムネ_1.png_align_resize_default.png FALSE   76%     
predict_test/大塚愛_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   76%     
predict_test/田村淳_2.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   76%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/田村淳_2.png_align_resize_default.png    FALSE   77%     
predict_test/田村淳_2.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   77%     
predict_test/関根勤_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   77%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   77%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   77%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/田村淳_2.png_align_resize_default.png    FALSE   77%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/田村淳_2.png_align_resize_default.png    FALSE   77%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   77%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/草野マサムネ_1.png_align_resize_default.png FALSE   77%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   77%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/小倉弘子_1.png_align_resize_default.png   FALSE   77%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/草野マサムネ_1.png_align_resize_default.png FALSE   77%     
predict_test/関根勤_2.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   77%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   77%     
predict_test/荻野目洋子_1.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   77%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/田村淳_2.png_align_resize_default.png    FALSE   77%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   77%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   78%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/田村淳_2.png_align_resize_default.png    FALSE   78%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/関根勤_1.png_align_resize_default.png    FALSE   78%     
predict_test/荻野目洋子_1.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   78%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   78%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   78%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   78%     
predict_test/田村淳_2.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   78%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   78%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/小倉弘子_1.png_align_resize_default.png   FALSE   78%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/草野マサムネ_1.png_align_resize_default.png FALSE   78%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   78%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   78%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   78%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   79%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   79%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   79%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   79%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/荻野目洋子_2.png_align_resize_default.png  FALSE   79%     
predict_test/田村淳_2.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   79%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   79%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/荻野目洋子_2.png_align_resize_default.png  FALSE   79%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   79%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  FALSE   80%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    FALSE   80%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/柳原可奈子_1.png_align_resize_default.png  FALSE   80%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   80%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/草野マサムネ_1.png_align_resize_default.png FALSE   80%     
predict_test/田村淳_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_1.png_align_resize_default.png    FALSE   80%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/荻野目洋子_2.png_align_resize_default.png  FALSE   80%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/大塚愛_2.png_align_resize_default.png    FALSE   80%     
predict_test/小倉弘子_2.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   81%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/枡田絵理奈_2.png_align_resize_default.png  FALSE   81%     
predict_test/おぎやはぎ小木_2.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   81%     
predict_test/枡田絵理奈_2.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  FALSE   81%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/田村淳_2.png_align_resize_default.png    FALSE   81%     
predict_test/田村淳_2.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   81%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    FALSE   82%     
predict_test/エッグ矢沢_1.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   82%     
predict_test/おぎやはぎ小木_1.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    FALSE   84%     
predict_test/草野マサムネ_1.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   84%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    FALSE   84%     
predict_test/荻野目洋子_2.png_align_resize_default.png     predict_test/荻野目洋子_1.png_align_resize_default.png  FALSE   86%     
predict_test/小倉弘子_1.png_align_resize_default.png     predict_test/小倉弘子_2.png_align_resize_default.png   FALSE   87%     
predict_test/大塚愛_2.png_align_resize_default.png     predict_test/大塚愛_1.png_align_resize_default.png    TRUE    90%     
predict_test/エッグ矢沢_2.png_align_resize_default.png     predict_test/エッグ矢沢_1.png_align_resize_default.png  TRUE    94%     
predict_test/田村淳_2.png_align_resize_default.png     predict_test/田村淳_1.png_align_resize_default.png    TRUE    94%     
predict_test/おぎやはぎ小木_1.png_align_resize_default.png     predict_test/おぎやはぎ小木_2.png_align_resize_default.png    TRUE    94%     
predict_test/柳原可奈子_1.png_align_resize_default.png     predict_test/柳原可奈子_2.png_align_resize_default.png  TRUE    95%     
predict_test/枡田絵理奈_2.png_align_resize_default.png     predict_test/枡田絵理奈_1.png_align_resize_default.png  TRUE    95%     
predict_test/関根勤_1.png_align_resize_default.png     predict_test/関根勤_2.png_align_resize_default.png    TRUE    95%     
predict_test/草野マサムネ_2.png_align_resize_default.png     predict_test/草野マサムネ_1.png_align_resize_default.png TRUE    98% Accuracy    0.989473684210526

dlib学習モデルとの比較

dlib_face_recognition_resnet_model_v1.datを用いた場合全て同一人物と判断されてしまう例 (不正解) を、新しく作成した学習モデルで検証しました。新しいモデルでは全て別人と判断 (正解) されました

dlib_predict.py

import glob
import os
import sys
from itertools import combinations

import numpy as np

sys.path.append('FACE01')
from face01lib.Calc import Cal
from face01lib.utils import Utils

Utils_obj = Utils()
Cal_obj = Cal()

# 画像の読み込みと類似度の計算
image_dir = "predict_test"
# 画像ファイルのパスを取得
image_paths = glob.glob(os.path.join(image_dir, "*.png"))
embeddings = []

for image_path in image_paths:
    embedding = Utils_obj.get_face_encoding(image_path)
    embeddings.append(embedding)

# 類似度の計算
pairs = list(combinations(range(len(embeddings)), 2))
for i, j in pairs:
    distance = np.linalg.norm(embeddings[i] - embeddings[j])
    percent = round(Cal_obj.to_percentage(distance), 2)
    print(f'{image_paths[i]}, {image_paths[j]}, {percent}%')

実行結果

新井浩文, 大森南朋

  • 新しい学習モデル (efficientnetv2_arcface.onnx)
    • predict_test/新井浩文.png_align_resize.png, predict_test/大森南朋.png_align_resize.png, False, 87.98%
    • 判定; 別人 (正解⭕)
  • 既存の学習モデル (dlib_face_recognition_resnet_model_v1.dat)
    • predict_test/新井浩文.png_align_resize.png, predict_test/大森南朋.png_align_resize.png, 98.97%
    • 判定: 同一人物 (不正解❌)

新川優愛, 内田理央

  • 新しい学習モデル (efficientnetv2_arcface.onnx)
    • predict_test/新川優愛.png, predict_test/内田理央.png, False, 81.46%
    • 判定; 別人 (正解⭕)
  • 既存の学習モデル (dlib_face_recognition_resnet_model_v1.dat)
    • predict_test/内田理央.png_align_resize.png, predict_test/新川優愛.png_align_resize.png, 99.27%
    • – 判定: 同一人物 (不正解❌)

金正恩, 馬場園梓

  • 新しい学習モデル (efficientnetv2_arcface.onnx)
    • predict_test/金正恩.png_align_resize.png, predict_test/馬場園梓.png_align_resize.png, False, 79.87%
    • 判定; 別人 (正解⭕)
  • 既存の学習モデル (dlib_face_recognition_resnet_model_v1.dat)
    • predict_test/金正恩.png_align_resize.png, predict_test/馬場園梓.png_align_resize.png, 99.44%
    • – 判定: 同一人物 (不正解❌)

池田清彦, 西村康稔

  • 新しい学習モデル (efficientnetv2_arcface.onnx)
  • predict_test/池田清彦.png_align_resize.png, predict_test/西村康稔.png_align_resize.png, False, 72.26%
  • 判定; 別人 (正解⭕)
  • 既存の学習モデル (dlib_face_recognition_resnet_model_v1.dat)
    • predict_test/池田清彦.png_align_resize.png, predict_test/西村康稔.png_align_resize.png, 98.87%
    • – 判定: 同一人物 (不正解❌)

金正恩, 畑岡奈紗

  • 新しい学習モデル (efficientnetv2_arcface.onnx)
    • predict_test/金正恩.png_align_resize.png, predict_test/畑岡奈紗.png_align_resize.png, False, 77.82%
    • 判定; 別人 (正解⭕)
  • 既存の学習モデル (dlib_face_recognition_resnet_model_v1.dat)
    • predict_test/金正恩.png_align_resize.png, predict_test/畑岡奈紗.png_align_resize.png, 99.37%
    • – 判定: 同一人物 (不正解❌)

有働由美子, 椎名林檎

  • 新しい学習モデル (efficientnetv2_arcface.onnx)
    • predict_test/有働由美子.png_align_resize.png, predict_test/椎名林檎.png_align_resize.png, False, 82.17%
    • 判定; 別人 (正解⭕)
  • 既存の学習モデル (dlib_face_recognition_resnet_model_v1.dat)
    • predict_test/有働由美子.png_align_resize.png, predict_test/椎名林檎.png_align_resize.png, 99.16%
    • – 判定: 同一人物 (不正解❌)

波瑠, 入山杏奈

  • 新しい学習モデル (efficientnetv2_arcface.onnx)
    • predict_test/波瑠.png_align_resize.png, predict_test/入山杏奈.png_align_resize.png, False, 81.46%
    • 判定; 別人 (正解⭕)
  • 既存の学習モデル (dlib_face_recognition_resnet_model_v1.dat)
    • predict_test/波瑠.png_align_resize.png, predict_test/入山杏奈.png_align_resize.png, 99.07%
    • – 判定: 同一人物 (不正解❌)

浅田舞, 浅田真央

  • 新しい学習モデル (efficientnetv2_arcface.onnx)
    • predict_test/浅田舞.png_align_resize.png, predict_test/浅田真央.png_align_resize.png, False, 83.06%
    • 判定; 別人 (正解⭕)
  • 既存の学習モデル (dlib_face_recognition_resnet_model_v1.dat)
    • predict_test/浅田舞.png_align_resize.png, predict_test/浅田真央.png_align_resize.png, 99.27%
    • – 判定: 同一人物 (不正解❌)

まとめ

この記事では日本人の顔認識の精度を向上させるために、EfficientNetV2ArcFaceを用いた新たなモデルの開発について説明しました。既存のモデルが抱える問題を解決するために日本人の顔データセットを使用し、大規模な画像データセットであるImageNetで事前学習されたEfficientNetV2をベースにモデルをファインチューニングしました。また学習時の損失関数としてArcFaceLossを使用し、特徴空間での顔の分離を改善しました。

この新たなモデルは日本人の顔認識において、既存のモデル( dlib_face_recognition_resnet_model_v1.dat) よりも優れた性能を示しました。これにより顔認識技術がさらに多様なシチュエーションに対応できるようになり、その応用範囲が広がることが期待されます。