コード必要なし!2Dの顔画像を3D化するPythonコード(PRNet)

さてさて、この所LravelとVueの話題ばかりをお届けしていますが、たまには私のメインで使っているプログラミング言語・Pythonも触っておかないと使い方を忘れてしまうので今回はいつもと違いデスクトップでの作業をするお話にします。

以前からPythonはお仕事でも個人的にでも利用をしてきたので、Pythonに関わるニュースはできるだけ網羅するようにしているのですが、そんな中、Pythonと親和性の高い「機械学習」についてのニュースを見ることになりました。

それは、有名ニュースサイトGigazineさんの顔の特徴から3Dモデル生成&他人の顔に入れ替えることもできる「3D Face Reconstruction」というページです。

このページで何を紹介しているかというと、なんと通常の顔画像から3Dデータを構築できる、つまり、2Dの顔から右を向かせたり上を向かせることができるデータを作成できるということでした。

最近あまり個人的なプログラム活動はできていなかったのですが、少し時間ができたのでこの機械に実際にどの程度のものができるのかを試してみることにしました。今回はそのやり方の説明と実際に使ってみたレビューをお届けしたいと思います。

ぜひ学習の参考にしてみてくださいね。

開発環境: Python 2.7, Ubuntu 18.04

インストールする

PRNetをインストール

Gigazineで紹介されているのは、YadiraF/PRNetというプロジェクトでGitHubで無料で公開(※1)公開されています。

※1: Pythonコード自体はMITライセンスですが、学習済みのモデルはMITライセンスではないようで、非商用もしくはテストのためのみに利用ができるようです。詳しくはこちらをご覧ください。

そのため、適用なフォルダにコマンドラインで移動し、gitコマンドでプロジェクトのソースコードをローカルへコピーしましょう。

git clone https://github.com/YadiraF/PRNet

では、次に学習済みのモデルをダウンロードします。次のリンクのどちらかからダウンロードしてください。

ダウンロードしたら、ファイル256_256_resfcn256_weight.data-00000-of-00001をgitでコピーしたPRNetの中にあるData/net-dataへ移動させてください。

実行に必要なパッケージをインストール

cloneしたPythonコードを実行するには以下4つのパッケージが必要になります。

  • numpy>=1.14.3
  • scikit-image
  • scipy
  • tensorflow

そのため、必要に応じて以下のコマンドでpip(Pythonのパッケージ・マネージャ)にインストールしておきましょう。

※もし、pip自体がインストールされていない場合は以下のコマンドを実行してください。(Ubuntu 18.04の場合)

sudo apt install python-pip

pip --versionとコマンドを実行して以下のような表示がでればインストールは完了しています。

pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)

続いてPythonパッケージをインストールしてください。

numpy

pip install numpy

scikit-image

pip install scikit-image

scipy

pip install scipy

tensorflow

pip install tensorflow

dlib

dlibパッケージはなくても動くようですが、顔認証の精度はこちらの方が上なので今回はインストールして実行します。(なお、インストールは少し時間がかかります。)

pip install dlib

もしCMake must be installed to build the following extensions: dlibというエラーが出た場合はcmakeがインストールされていないことが原因です。以下の手順でcmakeをインストールしてから再度pipコマンドを実行してください。

sudo apt-get install build-essential cmake
sudo apt-get install libgtk-3-dev
sudo apt-get install libboost-all-dev

meshlabかMicrosoft 3D Builderをインストールする

後でつくる3D顔データをぐるぐる回して表示ができるソフトウェアです。今回はUbuntuで実行しているのでUbuntuソフトウェアからインストールしますが、説明によるとMicrosoft 3D Builderでも動くようです。

まずUbuntuソフトウェアを起動します。

次に「meshlab」でソフトウェアを検索します。

クリックして「インストール」ボタンをクリックします。

ではこれで準備はすべて完了です。
次の項目から実際に画像から3Dデータを作成してみましょう。

2D画像から3Dデータを抽出する

3Dデータを作る画像を用意する

まず3Dデータを作りたい画像を用意しなければ始まりません。また、作成した3Dデータを保存しておくフォルダも必要になってきますので、以下のように3dというフォルダを作り、その中に

  • model ・・・ 3Dデータ(モデル)の保存フォルダ
  • faces ・・・ 3Dデータを作る顔画像フォルダ

をつくっておきます。

では、このfacesフォルダの中にpixabayでダウンロードしてきた次の画像をコピーします。

↓↓↓facesへ保存する

画像から3Dデータを作成する

では、PRNetをインストールしたフォルダへコマンドで移動して次のコマンドを実行しましょう。

python demo.py -i /home/***/3d/faces -o /home/***/3d/models --isDlib True

このコマンドの意味は次のとおりです。

  • -i ・・・ インプットフォルダ。つまり今回は、顔画像があるfacesフォルダ。
  • -o ・・・ 作成した3Dデータをアウトプットするフォルダ。つまりmodelsフォルダ。
  • –isDlib ・・・ dlibを使うかどうか。使ったほうが顔認証の精度は高いです。

※ なお、環境によって以下のような表示が出る場合がありますが、気にしなくてOKです。

Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

3Dの顔データを表示して確認する

コマンドの実行が完了すると、modelsフォルダには以下のような.objファイルが作成されています。

では、この.objファイルを先ほどインストールしたmeshlabで開いてみましょう。

うまく3Dデータが取得できています。

では、もう少しmeshlabを操作して見え方を変更してみましょう。表示されたばかりの顔画像は明暗を表示してあったり、スムーズ表示にはなっていないので、メニューバーの以下の赤枠2ヶ所をクリックします。)

また、顔画像の前や周りに表示してある白い線はView > Trackball > Show Trackballをクリックすると消えます。

するとこのようにより元画像に近い画像が表示されるようになりました。

ではこの画像を我々から見て左方向を見ているように回転させてみましょう。やり方は顔の鼻あたりから左へドラッグ・アンド・ドロップするだけです。

どうでしょう。元画像は平面の画像でしたが、左を向いている顔画像を作ることができました。では、次にこのまま上を向いた顔画像にしてみましょう。

これもドラッグ・アンド・ドロップするだけでOKです。

顔を上に向いてもらいました。
これもうまくいっています。

では、最後の確認として遠近を変更してみましょう。
遠近を操作するにはShiftキーを押しながらマウスホイールを上下します。

今回は先ほどよりも視点が遠くからになった顔画像です。

このように3Dデータを作成すると色々な角度や遠近を指定することができますので、ぜひ興味のある人はやってみてくださいね。

画像を保存する

もし画像を保存したい場合は、保存したい方向に顔を回転、遠近設定した状態でメニューバーにあるカメラマークをクリックしてください。

すると次のようなダイアログボックスが表示されます。

Base nameCounterは保存するファイル名です。(この場合だとsnapshot00.pngになります)

また、Transparent Backgroundはこのままだと、背景が白くなり、チェックを外すと見たままの青いグラデーションの背景になります。(残念ながら透過にはなっていないようです)

実際に保存した画像2つはこうなりました。

(画像1)

(画像2)

おわりに

ということで、今回は少し趣向を変えて、Pythonを使った3D顔データの話題をお届けしました。

おそらくこういった技術はセキュリティカメラなどで利用されていくのでしょうが、やっぱり機械学習ってすごいなと感じずにはいられませんでした。

なお、今回試したPRNetは顔の部分だけですが、もしかすると今後は頭や全身の3Dデータを作ることができるようになるのかもしれません。以前ここのブログでコード必要なし!画像を高解像度化するPythonコード(RAISR)という記事を書いたときにも思いましたが、ホントに科学ってすごいですね!

ではでは〜。(久しぶりに「おわりに」を書きました ^^;)