レンズの歪曲収差と対応方法(6)

前回(第5回)まで、光学歪みのある写真をImageMagickとopenCVを用いた補正を行いつつ関連した解説を行いました。

第6回となる今回はFACE01の次期アップデートとなるv.1.4.11にて実装予定となるutils.distort_barrel()について解説したいと思います。(2023年1月21日GitHubに公開されました)

データ拡張

深層学習モデルを作成する際、通常もとになるデータを増やすためにデータ拡張処理を行います。PyTorchなどのフレームワークにはこのデータ拡張機能がもともと備わっています。

Illustration of transforms

上記画像は主なデータ拡張の例になります。みたとおり、様々な画像処理を行ってデータを水増ししていることが分かります。

さてレンズの歪曲収差と対応方法(1)〜(5)でご紹介しましたとおり、カメラレンズを通した顔は歪曲収差します。

通常発生する複数の収差はキャリブレーションによって修正するのが主流です。しかしながら現場を見る限り(強い顔認証を除いて)キャリブレーションされていないことが「普通」です。通常のmodelを使う限り、これは大きな精度低下をもたらします。

歪曲収差とは

歪曲収差はレンズにより発生する収差のうちの1種類です。スマホでのカメラやノートPC上のカメラでよく発生する収差です。上記レンズの歪曲収差と対応方法(1)〜(5)でわかりやすく取り上げています。詳細はこちらをご覧ください。

[mathjax]

$$R_{src} = r * ( A*r^3 + B*r^2 + C*r + D )$$

上記の式のうち$C$の値だけを変更します。

データ拡張のためのメソッド utils.distort_barrel()

utilsクラスのdistort_barrel()メソッドはデータ拡張 (データ水増し)(Data Augmentation) に用います。

今回元画像として使わせて頂く画像はぱくたそ様からダウンロードいたしました。

example code

"""Example of to distort images.

Summary:
    In this example, you can learn how to get distorted images.
    
Args:
    path (str): Directory path where images containing faces exist
    size (int, optional): Specify the number of px for the extracted face image with an integer. Default is 200.

Usage:
    >>> python3 example/distort_barrel.py path size

"""

# Operate directory: Common to all examples
import os.path
import sys

dir: str = os.path.dirname(__file__)
parent_dir, _ = os.path.split(dir)
sys.path.append(parent_dir)

from typing import Dict

from face01lib.Initialize import Initialize
from face01lib.utils import Utils


# Initialize
CONFIG: Dict =  Initialize('DEFAULT', 'info').initialize()
utils = Utils(CONFIG['log_level'])


def main(path: str, size: int = 200) -> None:
    """Simple example.

    This simple example script takes a path which contained png, jpg, jpeg files in the directory, 
    distort barrel and saves them.
    
    Args:
        path (str): absolute path
        size (int, optional): Width and height. Defaults to 200.
        initial_value (float): Initial value. Default is -0.2.
        closing_value (float): Closing value. Default is 0.2.
        step_value (float): Step value. Default is 0.01.

    Return:
        None

    Note:
        ImageMagick must be installed on your system.
        - See[ImageMagick](https://imagemagick.org/script/download.php)
    """
    utils.distort_barrel(path, size)


if __name__ == '__main__':
    args: list = sys.argv
    main(args[1], size=200)

example codeの概略

顔領域を切り取り回転

画像中心にBarrel distortion処理

最初にアライメントした顔画像を以下のように配置

これらに対して中心にBarrel distortion

それぞれから顔だけクロップしアライメント

例えば

  • initial_value (float): -0.2.
  • closing_value (float): 0.2.
  • step_value (float): 0.1.

として処理を走らせると以下のようなimageが得られます。2枚の元画像から42枚の画像を得られました。

step_valueを0.01など細かくしたりinitial_valueとclosing_valueの幅を広げる(狭める)などすると非常に多くの歪曲収差をエミュレートしたアライメント済み顔画像が得られます。

通常のデータ拡張に加えてutils.distort_barrel()メソッドによる処理を行うことにより、カメラレンズに起因する歪曲収差のロバスト性を大きく確保することができると考えています。

まとめ

FACE01はmodelとしてDlibを使用しています。弱い顔認証システムの範疇ではTripret lossとResNetを用いたdlibモデルで十分役割を果たします。

しかしながらこの分野の進歩は凄まじく、より軽くよりスピーディーな処理のためのネットワークが次々と提唱されています。

東海顔認証ではDlibモデルより軽量で特に日本人に適したモデルの開発をしています。

たくさんの会社様とのコミュニケーションの中で、キャリブレーションを行えないことのほうが多いと感じました。それならばはじめからモデルに組み込んでしまおうと作業を進めています。

この記事でご紹介させていただいたユーティリティも、そのようなモデル作成の副産物として生まれたものです。

JAPANESE FACE V1が誕生しました。Dlibの学習モデルに比べて日本人に特化しており、日本人の顔認証スコアでDlibを超えました。
詳しくはこちらをご覧ください。

最後までお読み頂きありがとうございました。