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

考えた事

以前「レンズの歪曲収差と対応方法」の記事内ではFACE01にレンズ歪み回避のための機能を付与する予定はありませんと書きましたが、簡単な補正機能を呼び出し可能にするオプションをつけた方がフレンドリーかもしれないと思うに至り少し調べました。

前記事では予めインストールされたImageMagickをPythonから呼び出していました。ImageMagickをインストールしない別の方法はないかと調べてみました。ぱっと思いつくものでpipでインストールできるPillowとopenCVを調べましたが、Pillowにはレンズ歪みを再現する関数が存在しませんでした。openCVでも良いのですがチェスボードを使った方法はエンドユーザの方(とも限りませんが)に負担かな…と思うので後から考えたいところです。

今回は前回と同様ImageMagickがインストールされている状況下を想定して作っていきたいと思います。

Barrel Distortion

Barrel DistortionについてはBarrel Distortionを参照してください。ここで取り上げる引数の数値は
Rsrc = r * ( A*r3 + B*r2 + C*r + D )
で表されます。しかしながら簡便性のみの理由でCについてのみ変更することにしました。

元になる画像はこちらです。

# coding: utf-8
import decimal as d
import subprocess

## dstort_barrel_ブログ用.py
## オリジナル画像を任意の数値毎に歪ませた画像を生成します

## オリジナル画像
original_image='barrel_checks_D.png'
## アウトプット画像が入るフォルダ
output_folder='output'
## distortion する値
distortion_value='0.025'
## rotate の値
rotate = ' -rotate -0'


## ImageMagick を使った樽型歪画像を作成するクラス
class create_barrel_image_class:
	## 樽型歪画像を作成するメソッド
	def barrel_value_cmd(self, image, value):
		cmd = "convert {} ".format(image) + rotate
		barrel_value = " -distort barrel '0.0 0.0 {}'".format(value)
		output_image = ' ' + output_folder + "/{}.png".format(value)
		cmd = cmd + barrel_value +  output_image
		res = subprocess.run([cmd], shell=True)
		print(res)
	
	def create_animation_gif():
		cmd = 'convert -layers optimize -loop 0 -delay 10 ' + output_folder + '/*.png ' + output_folder + '/anim.gif'
		# ~ print(cmd)
		res = subprocess.run([cmd], shell=True)
		print('★', res)


if __name__ == '__main__':
	## 小数点の配列 value_C_list の作成
	value_C_list = []
	num = d.Decimal('0.5')
	for i in range( 40 ):
		num -= d.Decimal(distortion_value)
		value_C_list.append(float(num))
	
	## barrel_value_cmd メソッドを複数回呼び出し
	barrel = create_barrel_image_class()
	for value in value_C_list:
		barrel.barrel_value_cmd( original_image, value )
	
	## animation gif画像を作成する
	create_barrel_image_class.create_animation_gif()
作成された樽型歪画像のアニメーション

以下のように数値を変えて顔画像に適用してみます。

distortion_value='0.005'
num = d.Decimal('0.1')
元画像(分かりやすいように黒枠をつけています)
作成された樽型歪を適用した画像

うまい具合に樽型歪みを表現できました。

評価用画像を水増しする

キャリブレーションは

  • サンプルとなる顔画像を撮影したカメラのレンズ
  • 認証のために顔を撮影するカメラのレンズ

の両方がキャリブレーションされていないと意味がありません。
片方だけがキャリブレーションされていたり両方キャリブレーションされていなかったりすると、レンズ由来の画像の歪みによって顔パーツ同士のメトリックが正しく測れなくなります。

両方キャリブレーションされている事が重要ですが、現場では必ずしもこの様な厳密性を期待できない事がしばしば発生します。このような「厳密性を期待できない現場」ではそもそもキャリブレーションという手間を惜しみます。

その様な場合のオプションとして、サンプルにレンズの歪みを適用してデータを水増しする方法を提案します。このオプションをオンにするかどうかはプログラムの起動時に選べるようにしておきます。

元画像と水増しされた画像

また顔認証に使うカメラのレンズの歪み具合を調べるためだけに使う方法も考えられます。

顔認証に使ってみる

実際にレンズ歪みを模した画像を作成して顔認証を行ってみます。
元画像とそれを元に自動作成されるレンズ歪みを模した画像を下に載せます。

元画像
レンズ歪みさせた画像(gif化)
元のファイル名_歪み係数_アルファベット

pictures_of_people_i_knowフォルダ内は下のようになりました。ここでは実験であるので他の人物のレンズ歪みまでは実施していません。

pictures_of_people_i_knowフォルダ

検証結果

殆どの場合で未加工の人物画像ファイル以外がヒットした結果になりました。特に数値は「-0.09」が多い印象です。

安倍晋三_-0.09 99.33% output/安倍晋三_-0.09_99.33%_2021,04,20,14,35,33,573931_0.34.jpeg
安倍晋三_-0.09 99.46% output/安倍晋三_-0.09_99.46%_2021,04,20,14,35,33,696359_0.3.jpeg
安倍晋三_-0.09 99.33% output/安倍晋三_-0.09_99.33%_2021,04,20,14,35,33,732965_0.34.jpeg
安倍晋三_-0.09 99.41% output/安倍晋三_-0.09_99.41%_2021,04,20,14,35,33,769437_0.31.jpeg
安倍晋三_-0.09 99.51% output/安倍晋三_-0.09_99.51%_2021,04,20,14,35,33,804116_0.28.jpeg
安倍晋三_-0.09 99.48% output/安倍晋三_-0.09_99.48%_2021,04,20,14,35,33,838981_0.29.jpeg
安倍晋三_-0.09 99.47% output/安倍晋三_-0.09_99.47%_2021,04,20,14,35,33,874194_0.3.jpeg
安倍晋三_-0.09 99.37% output/安倍晋三_-0.09_99.37%_2021,04,20,14,35,33,910020_0.32.jpeg
安倍晋三_0.045 99.21% output/安倍晋三_0.045_99.21%_2021,04,20,14,35,33,942505_0.37.jpeg
安倍晋三_-0.09 99.01% output/安倍晋三_-0.09_99.01%_2021,04,20,14,35,33,976258_0.42.jpeg
安倍晋三_-0.09 99.1% output/安倍晋三_-0.09_99.1%_2021,04,20,14,35,34,008716_0.4.jpeg
安倍晋三_-0.09 99.22% output/安倍晋三_-0.09_99.22%_2021,04,20,14,35,34,040870_0.37.jpeg
安倍晋三_-0.09 99.3% output/安倍晋三_-0.09_99.3%_2021,04,20,14,35,34,073238_0.35.jpeg
安倍晋三_-0.09 99.37% output/安倍晋三_-0.09_99.37%_2021,04,20,14,35,34,105768_0.33.jpeg
安倍晋三_-0.09 99.37% output/安倍晋三_-0.09_99.37%_2021,04,20,14,35,34,140593_0.33.jpeg
安倍晋三_-0.09 99.31% output/安倍晋三_-0.09_99.31%_2021,04,20,14,35,34,174104_0.34.jpeg
安倍晋三_-0.09 99.35% output/安倍晋三_-0.09_99.35%_2021,04,20,14,35,34,206838_0.33.jpeg
安倍晋三_-0.09 99.34% output/安倍晋三_-0.09_99.34%_2021,04,20,14,35,34,240094_0.33.jpeg
安倍晋三_-0.09 99.3% output/安倍晋三_-0.09_99.3%_2021,04,20,14,35,34,274255_0.35.jpeg
安倍晋三_-0.035 99.35% output/安倍晋三_-0.035_99.35%_2021,04,20,14,35,34,307002_0.33.jpeg
安倍晋三_-0.075 99.27% output/安倍晋三_-0.075_99.27%_2021,04,20,14,35,34,340003_0.35.jpeg
安倍晋三_-0.075 99.32% output/安倍晋三_-0.075_99.32%_2021,04,20,14,35,34,375142_0.34.jpeg
安倍晋三_-0.005 99.35% output/安倍晋三_-0.005_99.35%_2021,04,20,14,35,34,407442_0.33.jpeg
安倍晋三_-0.075 99.4% output/安倍晋三_-0.075_99.4%_2021,04,20,14,35,34,439747_0.32.jpeg
安倍晋三_-0.075 99.4% output/安倍晋三_-0.075_99.4%_2021,04,20,14,35,34,473175_0.32.jpeg
安倍晋三_-0.075 99.43% output/安倍晋三_-0.075_99.43%_2021,04,20,14,35,34,505053_0.31.jpeg
安倍晋三_-0.09 99.44% output/安倍晋三_-0.09_99.44%_2021,04,20,14,35,34,538532_0.3.jpeg
安倍晋三_-0.005 99.38% output/安倍晋三_-0.005_99.38%_2021,04,20,14,35,34,570952_0.32.jpeg
安倍晋三_-0.09 99.35% output/安倍晋三_-0.09_99.35%_2021,04,20,14,35,34,606203_0.33.jpeg
安倍晋三_-0.075 99.33% output/安倍晋三_-0.075_99.33%_2021,04,20,14,35,34,640504_0.34.jpeg
安倍晋三_-0.09 99.24% output/安倍晋三_-0.09_99.24%_2021,04,20,14,35,34,672975_0.36.jpeg
安倍晋三_-0.09 99.19% output/安倍晋三_-0.09_99.19%_2021,04,20,14,35,34,705970_0.38.jpeg
安倍晋三_-0.09 99.33% output/安倍晋三_-0.09_99.33%_2021,04,20,14,35,34,739473_0.34.jpeg
安倍晋三_-0.09 99.25% output/安倍晋三_-0.09_99.25%_2021,04,20,14,35,34,771832_0.36.jpeg
安倍晋三_-0.09 99.47% output/安倍晋三_-0.09_99.47%_2021,04,20,14,35,34,804568_0.3.jpeg
クロップされた顔画像ファイル

考察

この様にデータに補正をかけるのは簡単ですが、一人分なら良いとして自分以外の多くの人の顔データを補正することは認証としてありえません。しかしながらシステムを用意する上で事前に全てのカメラにキャリブレーションをかけておき、その後で従業員の方全ての方の顔写真データを撮り直すのは運用先を選ぶような気がします。FACE01シリーズのようなライブラリ製品が使用されるシステム環境を考えるならば厳密なキャリブレーションを求めつつ次善策を用意する必要性を感じます。