近年、たくさんの高性能な写真加工アプリがアプリストアに並ぶようになりました。我々女子とって加工アプリを使って、目を大きくし、顔を小さくし、肌をなめらかにし…というのは、もはや化粧をするのと変わらないくらい日常。さらには、「無加工風加工」と呼ばれる加工の方法まで出現しています。 そんな加工技術が進歩すればするほど、加工されていない写真との見分けがつかなくなっていきそうです。特に写真加工アプリを使う機会が少ない人の中には、もう既にどの写真が加工されていて、加工されていないのかが全くわからないという方も多いのではないでしょうか。 そこで今回は、Googleによって開発された機械学習のソフトウェアライブラリ「TensorFlow」を使って、「顔面補正してる」写真と「顔面補正していない」写真を分類できるのかを試してみました。
TensorFlowとは?
「顔面補正してる」写真か「顔面補正していない」写真かを判定するために、Googleが2015年に開発した機械学習のソフトウェアライブラリ「TensorFlow(テンソルフロー)」を使います。TensorFlowはオープンソースで公開されており、個人・商用を問わず誰でも無料で使用することができます。
“TensorFlow”.2017.Google LLC.
https://www.tensorflow.org/
このTensorFlowはデータフローグラフを利用して数値計算処理を行っている点が特徴です。これにより柔軟性が高くなり、CPUやGPUをはじめ、さまざまなハードウェアやプラットフォームでの実行が可能です。また、研究レベルからプロダクトの開発まで幅広く扱えるため、TwitterやSnapchat、airbnb、Dropboxなど既に多くの企業で導入されており、現在 非常に注目が集まっているライブラリです。
「顔面補正してる」写真か「顔面補正していない」写真かを判定してみる
環境構築
まず、TensorFlowをWindows10で使うために必要な環境を準備していきます。
今回はTensorFlowをインストールするために「Anaconda」を使用します。「Anaconda」はAnaconda社が提供するPythonディストリビューションです。科学計算に必要なライブラリやさまざまなユーティリティが使用できたり、Pythonの仮想環境の構築・切り替えができます。
Anacondaは下記のAnaconda公式サイトからダウンロードできます。
“Anaconda Python/R Distribution – Anaconda”.2019.Anaconda, Inc.
https://www.anaconda.com/download/
現在(2019年1月)は、Python3.7版とPython2.7版がダウンロードできます。Python2.7については2020年にサポートが終了してしまうので、Python2.7を使用する理由がなければPython3.7版をインストールしてください。
インストールが完了したら、Pythonの仮想環境を作成します。
Anaconda Navigatorを立ち上げて、「Enviroments」から「Create」をクリックします。
「Create new enviroments」で仮想環境に名前を付け、Pythonのバージョンは3.6を選択します。また、現在TensorFlowのpipパッケージがまだPython3.7に対応できていないため、3.7を選択してしまうとうまくインストールできない場合があります。
「▶︎」から「Open Terminal」をクリックすると、コマンドプロンプトが立ち上がります。
コマンドプロンプトから下記のコマンドでTensorFlowをインストールしていきます。
インストール方法については、TensorFlow公式サイトにも書かれているので参考にしてみてください。
“Install TensorFlow”.2017.Google LLC.
https://www.tensorflow.org/install
> pip install --ignore-installed --upgrade tensorflow
特にエラーがでなければ、これでインストールは完了です。
ちゃんとインストールできているかを確認するには、対話モードでPythonを起動します。
> python
下記の「Hello, TensorFlow!」が出力されるコードを実行します。
import tensorflow as tf hello = tf.constant('Hello, TensorFlow!') sess = tf.Session() print(sess.run(hello))
こちらもエラーが出ず、「Hello, TensorFlow!」が出力されれば問題なくインストールされていることが確認できます。
また、TensorFlowの公式チュートリアルを行うために必要なライブラリもここでインストールしておきます。
> pip install tensorflow-hub
これで環境の準備は完了です。
データの準備
次に学習に使うデータを準備します。今回はクラウドソーシングを利用し、写真加工アプリなどを使用して「顔面補正してる写真」と「顔面補正していない写真」をそれぞれ100枚ずつ準備しました。
インターネットにある画像を使いたい場合
Googleから画像を一括でダウンロードできるツール「google-images-download」がオススメです。
下記のようにpipを使用して簡単にインストールできます。
> pip install google_images_download
インストールが完了すると、コマンドプロンプト上から使用できるようになります。使用方法もシンプルで、例えば「ツインテール 女子」の画像を一括ダウンロードしたい場合は下記のコマンドを使用します。
> googleimagesdownload --keywords "ツインテール 女子"
コマンドを実行すると、実行したディレクトリ内に「downloads」というフォルダが作成され、その中にダウンロードした画像が格納されます。
デフォルトの設定では、100枚の画像がダウンロードされます。ダウンロードしたい画像の数やフォーマット、色、サイズなどさまざまなオプションを使用することができます。
「google-images-download」については下記で公開されているGitHubなども参考にするとよいでしょう。
“hardikvasa/google-images-download”.2018.Hardik Vasa. / GitHub, Inc.
https://github.com/hardikvasa/google-images-download/
OpenCVを使って顔の部分を切り出す
今回学習データとして使用する画像は100枚ずつとかなり少ないため、少しでも精度を上げやすくするために、画像の中の顔の部分のみを切り出します。(切出さなくても学習させることはできます)
合計200枚なので、手動で切り出すこともできなくはないのですが、今回は「OpenCV(Open Source Computer Vision Library)」という画像認識ライブラリを使用して、顔を認識して切り出しました。(OpenCVを使用して認識できなかった画像については手動で切り出しました)
TensorFlowの公式チュートリアルを使って学習させる
今回、「顔面補正してる写真」か「顔面補正していない写真」かを分類するために下記のTensorFlowの公式チュートリアル(Image Recognition)で用意されている再学習用のチュートリアル(Image Retraining)を使用します。下記の公式サイトやチュートリアルの進め方を日本語で解説している記事などもたくさんあるので、一度チュートリアル通りに画像分類を行ってみるとより理解しやすくなると思うのでオススメです!
“Image Recognition”.2019.Google LLC.
https://www.tensorflow.org/tutorials/images/image_recognition
“How to Retrain an Image Classifier for New Categories”.2018.Google LLC.
https://www.tensorflow.org/hub/tutorials/image_retraining
まず、下記のgithubで公開されている「retrain.py」のソースコードをダウンロードします。
“hub/retrain.py at master”.2015.tensorflow. / GitHub, Inc.
https://github.com/tensorflow/hub/blob/master/examples/image_retraining/retrain.py
先ほど準備した画像ファイルと下記のように配置にします。(画像のファイル名は綺麗に揃っている必要はありません)
retrain.py photos └─ ari └─ 0001.jpg └─ 0002.jpg └─ 0003.jpg ⋮ └─ nashi └─ 0001.jpg └─ 0002.jpg └─ 0003.jpg ⋮
学習を始めるには、下記のように「–image_dir」で学習用のデータが保存されているファイルを指定し、「retrain.py」を実行します。
> python retrain.py --image_dir photos
これで4000ステップの学習がスタートします。
Tensorbordで学習状況を可視化する
TensorFlowには「Tensorboard」という学習状況の確認や結果を可視化してくれる非常に便利なツールが付属しています。
Tensorboardも仮想環境でpipを使い、下記のように簡単にインストールすることができます。
> pip install tensorboard
Tensorboardは学習をスタートさせた後に、下記のコマンドで起動することができます。
> tensorboard --logdir C:/tmp/retains_logs
起動後に表示されるURLにブラウザからアクセスすると、下記のようなグラフが表示されます。
今回の学習の精度(accuracy)は以下のような感じになりました。オレンジの線が学習用データにおける精度で青の線が学習データとは別の検証用データにおける精度です。
今回は学習用に準備したデータ数が十分とは言えなかったため、記事にできないくらい悪かったらどうしよう…と心配していたのですが、思っていたよりいい感じに学習できていたのでひと安心です。
実際に判定してみる
写真で顔面補正するのが当たり前すぎるようで、「化粧をしないで外に出るのが恥ずかしい」と同レベルで「顔面補正していない写真を人に見せるのは恥ずかしい」という人が多く…今回の記事で「顔面補正していない写真」を掲載させてくれる人を見つけるのはなかなか大変でした。
そんな中、「顔面補正してる写真」と「顔面補正していない写真」を掲載しても良いという3名の方に感謝しながら、実際に判定してみようと思います。
判定に使った写真は以下の6枚です。
そして、判定結果は・・・
全問正解!パーフェクトです!
ここまでしっかり判定できるとは思っていなかったので、個人的にはとても感動しました。
まとめ
以上、TensorFlowを使って「顔面補正してる写真」と「顔面補正していない写真」を判定してみました。今回は学習データを集めるのが難しく、あまりうまく判定できないかもしれないと不安でしたが、思った以上に良い精度を出すことができ、TensorFlowすごいな〜!!!と思いました。
今後、ますますユーザーが増えそうなTensorFlowですが、今回もほとんどコードを書かずに非常に手軽に体験することができました。エンジニアの方もそうでない方もぜひオリジナルの画像判定プログラムを作成してみてください!
工学部女子大生とライターをしています。卒業研究で彼氏の浮気を防ぐためにSNS上で彼氏と彼氏のフォロワーの親密度推定に挑戦中。大学院では計量言語学を専攻予定。