[Lifespan Age Transformation Synthesis]AIで顔画像の年齢を変えてみる

2021年10月31日日曜日

Artificial Intelligence

本記事では、Lifespan Age Transformation Synthesisと呼ばれる機械学習手法を使って人の顔の年齢を自然に変更してみたいと思います。

アイキャッチ

Lifespan Age Transformation Synthesisとは

Lifespan Age Transformation Synthesisとは、人の顔が過去どのような顔であったのか、また、未来ではどのような顔になるのかを予測するgenerative adversarial network architecture(GAN)です。

従来技術が顔のテクスチャの予測に留まっていたのに対し、本手法では頭の形状の予測も可能となっています。
これによって従来手法が成人の頭の形状に、予測された幼児のテクスチャが生成されたものが、
本手法では、幼児の頭の形状に、予測された幼児のテクスチャが生成されるため、より自然な質の高い出力が得られるようになります。

出力結果例
出典: https://github.com/royorel/Lifespan_Age_Transformation_Synthesis

上図はLifespan Age Transformation Synthesisの出力結果です。
幼児期には、頭が小さく予測され自然な出力結果が得られていることが分かります。

Lifespan Age Transformation Synthesisの導入手順

セットアップ

それでは早速、開発環境にLifespan Age Transformation Synthesisをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

それでは、Lifespan Age Transformation Synthesisをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

# python version 3.7のconda環境を作成
$ conda create -n lats python=3.7

# 作成した環境をアクティベート
$ conda activate lats
$ cd lats

# gitからコードをclone
$ git clone https://github.com/royorel/Lifespan_Age_Transformation_Synthesis.git
$ cd Lifespan_Age_Transformation_Synthesis

# 関連するライブラリをインストール
# https://pytorch.org/get-started/previous-versions/ でバージョン確認
$ conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=10.1 -c pytorch
$ pip3 install -r requirements.txt
# Proxy配下の場合は下記
$ pip3 install -r requirements.txt --proxy=http://"username":"password"@proxy:port

以上で、セットアップは完了です。

年齢変換

年齢の変換を行っていきます。
はじめに学習済みモデルをダウンロードします。

$ cd Lifespan_Age_Transformation_Synthesis
$ python3 download_models.py

# Proxy配下の場合download_models.pyに以下を追加
import util.util as util

import os
os.environ["http_proxy"] = "http://"username":"password"@proxy:port"
os.environ["https_proxy"] = "http://"username":"password"@proxy:port"

/Lifespan_Age_Transformation_Synthesis/checkpointsにmodelがダウンロードされます。

次に顔画像を用意します。
本記事では、ロイヤリティフリーの画像を使って顔周辺を256x256ピクセルに切り出した以下の2画像を使用します。

年齢変換対象画像

この2画像を任意のディレクトリに格納します。
その後Lifespan_Age_Transformation_Synthesis直下にmales_image_list.txtfemales_image_list.txtを作成し
先ほど格納したファイルのパスを以下のように記述します。

# males_image_list.txtの記述例
origin_datasets/resize_image_male.png

最後に以下のコマンドで年齢変換を実行します。

# 男性を年齢変換する場合
CUDA_VISIBLE_DEVICES=0,1 \
python test.py --name males_model \
--which_epoch latest \
--display_id 0 \
--traverse \
--interp_step 0.05 \
--image_path_file males_image_list.txt \
--make_video --in_the_wild --verbose

# 女性を年齢変換する場合
CUDA_VISIBLE_DEVICES=0,1 \
python test.py --name females_model \
--which_epoch latest \
--display_id 0 \
--traverse \
--interp_step 0.05 \
--image_path_file females_image_list.txt \
--make_video --in_the_wild --verbose

もしRuntimeError: CUDA out of memory.が発生する場合は、
--interp_step 0.05--interp_step 0.06に変更してください。

年齢変換結果女性
年齢変換結果男性

いかがでしょうか?
欧米の方のような出力結果ですね。これは提供されている学習済みモデルがFFHQ-Aging Datasetを元に学習されているモデルのため欧米の方に寄っていってしまっていると考えられます。
このため、より自然に変換するためには人種ごとにモデルを生成した方が精度が向上すると考えられます。

まとめ

本記事では、Lifespan Age Transformation Synthesisで顔画像の年齢変換する方法を紹介しました。
GANの画像生成技術は視覚的にはっきりとした結果が出力されるため楽しさが増しますね。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1. 論文 - Lifespan Age Transformation Synthesis

2. GitHub - royorel/Lifespan_Age_Transformation_Synthesis

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology