Pythonで画像処理してみたいです。
このような要望にお応えします。
人の成長過程予測
人が将来どのように成長していくか、あるいは過去にどのように見えていたかを予測することができるのであれば興味深いですよね。人の成長、老化現象には、パターンが存在するのでしょうか。
最近、ロシア発の画像加工アプリ「FaceApp」がSNSで流行したそうです。
- 日本人が超ハマる「FaceApp危険説」は本当か(https://toyokeizai.net/articles/-/359018)
- 老け顔アプリ「FaceApp」への過剰反応は、“もっと大きな危険”を覆い隠すことになる(https://wired.jp/2019/07/20/faceapp-privacy-backlash-facebook/)
例えば、FaceAppではAIを用いて、写真上の人物を若返らせたり、老化させたり等の加工ができます。つまり、AIを用いて人の成長過程を予測することができるということですね。
多くの人が成長過程予測に興味があるということでしょうか?
FaceApp以前にも成長過程を予測するような様々なアプリ、手法などが提案されているようですので興味深いのですかね。
例えば、2014年?にワシントン大学の研究者の方達は、幼い子供の顔が映った写真が1枚あれば、年齢につれて変化する様子を80歳まで自動的に生成できるソフトウェアを開発したそうです。
- 写真1枚で「未来の顔」を自動生成するソフトウェア (https://wired.jp/2014/04/18/ageing-faces/)
- Automated age-progression software lets you see how a child will age (https://www.washington.edu/news/2014/04/09/see-what-a-child-will-look-like-using-automated-age-progression-software/)
そして2020年、AI技術を用いて、写真上の人物の年齢進行と過去の状態について予測することが行われています。
Lifespan_Age_Transformation_Synthesis
- https://github.com/royorel/Lifespan_Age_Transformation_Synthesis
今回は、上記の手法を試してみたいと思います。
既存の加齢法の多くは質感の変化に限定されており、人間の老化や成長過程で生じる頭部の形状の変化を見落としています。
そのため、今回試す手法では、学習された潜在空間が連続的な双方向の老化過程をGANベースでモデル化したネットワークアーキテクチャを提案されています。このネットワークは年齢、性別、意味的セグメンテーションのラベル付けを行ったFFHQデータセットを用いて学習されているそうです。
この研究では、主に以下の貢献がなされているとのことです。詳しくは、論文を参照ください。
- 寿命年齢合成のための形状変換とテクスチャ変換の両方を可能にしたこと
- 新しいマルチドメイン画像変換GANアーキテクチャの提案
- ラベル付きFFHQデータセットをコミュニティで共有すること
論文:Lifespan Age Transformation Synthesis
- https://arxiv.org/pdf/2003.09764.pdf
それでは、人の成長過程を予測してみましょう。
人の成長過程予測のためのAIツールは、以下を参考にさせていただきました。
- https://github.com/royorel/Lifespan_Age_Transformation_Synthesis
実行環境は、colaboratoryを用いています。下記を参考にさせていただきました。
- https://colab.research.google.com/github/royorel/Lifespan_Age_Transformation_Synthesis/blob/master/LATS_demo.ipynb
人の成長過程予測ツールの使用
Google Colaboratoryの準備
・Googleのアカウントを作成します。
・Googleドライブにアクセスし、「新規」→「その他」から「Google Colaboratory」の順でクリックします。そうすると、Colaboratoryが起動します。
・Colaboratoryが起動したら、以下のコマンドをCoalboratoryのセルに入力し実行します。
そうすることで、Googleドライブをマウントします。
1 2 |
from google.colab import drive drive.mount('/content/drive') |
・実行後、認証コードの入力が促されます。このとき、「Go to this URL in a browser」が指しているURLにアクセスしgoogleアカウントを選択すると、認証コードが表示されますので、それをコピーしenterを押します。これでGoogleドライブのマウントが完了します。
成長過程予測モデルの準備
Google Colaboratoryの「ランタイム」→「ランタイムのタイプ変更」でGPUを選択します。
ツールをダウンロードする場所に移動します。 本記事では、マイドライブにツールをダウンロードします。
1 |
cd drive/My\ Drive |
gitからツールをダウンロードします。
1 |
!git clone https://github.com/royorel/Lifespan_Age_Transformation_Synthesis |
ダウンロードしたフォルダまで移動します。
1 |
cd Lifespan_Age_Transformation_Synthesis/ |
ツール実行に必要となるライブラリをインストールします。
1 |
!pip install -r requirements.txt |
学習済みモデルをダウンロードします。
1 |
!python download_models.py |
ツール実行時に必要となるパラメータを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import os from collections import OrderedDict from options.test_options import TestOptions from data.data_loader import CreateDataLoader from models.models import create_model import util.util as util from util.visualizer import Visualizer opt = TestOptions().parse(save=False) opt.display_id = 0 # do not launch visdom opt.nThreads = 1 # test code only supports nThreads = 1 opt.batchSize = 1 # test code only supports batchSize = 1 opt.serial_batches = True # no shuffle opt.no_flip = True # no flip opt.in_the_wild = True # This triggers preprocessing of in the wild images in the dataloader opt.traverse = True # This tells the model to traverse the latent space between anchor classes opt.interp_step = 0.05 # this controls the number of images to interpolate between anchor classes data_loader = CreateDataLoader(opt) dataset = data_loader.load_data() visualizer = Visualizer(opt) |
予測モデルを構築します。
1 2 3 |
opt.name = 'females_model' # change to 'females model' if you're trying the code on a female image model = create_model(opt) model.eval() |
予測したい画像をgoogle driveにアップロードします。
1 2 3 4 5 6 |
# upload your image (the code supports only a signle image at a time) from google.colab import files uploaded = files.upload() for filename in uploaded.keys(): img_path = filename print('User uploaded file "{name}"'.format(name=filename)) |
下記を実行することで、入力画像に写る人物の成長過程を予測することができます。
1 2 3 4 5 6 |
data = dataset.dataset.get_item_from_path(img_path) visuals = model.inference(data) os.makedirs('results', exist_ok=True) out_path = os.path.join('results', os.path.splitext(img_path)[0] + '.mp4') visualizer.make_video(visuals, out_path) |
下記を実行することで、出力結果がmp4ファイルとして保存されます。
該当ファイルは、resultsフォルダに保存されています。(本稿では、chromeブラウザを使用しています。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
use_webm = False # For some unknown reason the mp4 video is not displayed on chrome # If you have chrome, uncomment the following lines to convert the # result to webm for display purposes !pip3 install webm webm_out_path = os.path.join('results', os.path.splitext(img_path)[0] + '.webm') !webm -i $out_path $webm_out_path use_webm = True from IPython.display import HTML from base64 import b64encode video_path = webm_out_path if use_webm else out_path video_type = "video/webm" if use_webm else "video/mp4" mp4 = open(video_path,'rb').read() data_url = "data:video/mp4;base64," + b64encode(mp4).decode() HTML(""" <video width={0} controls> <source src="{1}" type="{2}"> </video> """.format(opt.fineSize, data_url, video_type)) |
出力結果
出力結果は、以下になります。
今回は、GANベースの人の成長過程予測モデルを試してみました。
人の成長過程の予測については、今回手法の論文のrelated worksにもあるように様々な研究がありますので、それらについて試してみるのもいいですね。
以下を参考にさせていただきました。
- https://github.com/royorel/Lifespan_Age_Transformation_Synthesis
- https://arxiv.org/pdf/2003.09764.pdf
- https://grail.cs.washington.edu/projects/lifespan_age_transformation_synthesis/
- https://colab.research.google.com/github/royorel/Lifespan_Age_Transformation_Synthesis/blob/master/LATS_demo.ipynb