Help us understand the problem. What is going on with this article?

TensorFlow を使ってブラックホールとポンデリングを見分ける (追記あり)

More than 1 year has passed since last update.

はじめに

ハワイ、南米、南極など色々な箇所に設置された電波望遠鏡が協力し合う国際プロジェクト「イベント・ホライズン・テレスコープ」が、5500万光年彼方も向こうにある銀河の中心に位置する超大質量ブラックホールの撮影に成功したとの事。ブラックホールが直接撮影されたのは史上初の快挙との事で巷でも賑わっております。

https://japanese.engadget.com/2019/04/10/8/

さてこれだけ盛り上がると Twitter でも色々話題になっていて「ポンデリングに似ている」とか「ポンデリングじゃん」とか「ポンデリングにしか見えない」など色々と言われております。

それポンデリングじゃねぇの?

これはもしかしてブラックホールを見た事のない我々に対して、ポンデリングの画像を見せられ騙されているのではないかとさえ思い始めました。Twitter 上にも数多くのポンデリング画像が散見されています。そこで TensorFlow の力を借りて「画像がブラックホールなのかポンデリングなのかを判別するモデル」を作ろうと思い立ちました。

とは言っても筆者は宗教上の理由により Python を書かない事にしているので今回の記事では一切 Python のコードは書きません。しかし便利な世の中になった物で、Python のコードを一切書かなくても機械学習を使った画像判別が出来る様になりました。

本記事ではそんな「誰でも簡単にできる画像判別」をやってみたいと思います。

TensorFlow Hub とは

TensorFlow に関するモデル集的なもので、この中にサンプルとして画像分類の為のスクリプトが置いてあります。

How to Retrain an Image Classifier for New Categories

この例では花の画像を使っていますが、今回はこれをブラックホールおよびポンデリングの画像でやろうという話です。

Python をインストールする

Python は書きませんが Python を使う必要があるので conda を使ってインストールします。筆者は Windows ユーザなので miniconda を使いました。

https://docs.conda.io/en/latest/miniconda.html

インストーラに従って進めると conda というコマンドが使える様になっています。以下のコマンドを使って tensorflow 専用の環境を作ります。

conda create --name=tensorenv python=3.7 tensorflow tensorflow_hub tensorboard

コマンドが終了したら以下のコマンドで tensorflow 専用環境にスイッチします。

activate tensorflow

UNIX だと conda activate tensorflow になります。必要な Python のライブラリは上記のコマンドによりインストールされているはずです。

tensorflow_hub の使い方

tensorflow_hub のライブラリはインストールされているのでチュートリアルスクリプトをダウンロードします。

wget https://raw.githubusercontent.com/tensorflow/hub/master/examples/image_retraining/retrain.py

この retrain.py というスクリプトを使うと、一切 Python を書く事なく画像判別ができる様になるのです。

retrain.py を使う為には、カテゴリ毎に画像がフォルダ分けされたフォルダ構造が必要です。

─ images
 ├── blackhole
 │   ├── 0b92ef18217c6831.png
 │   ├── 0d46c5da430d4f6f.png
 │   ├──    …
 │   ├── 448604dd6ae451c8.png
 │   └── fb0c345e37e8b2b4.png
 └── pondering
     ├── 5f371bb5a81ce468.png
     ├── 6d405524581ee189.png
     ├──    …
     ├── 70ef4015d901ec2b.png
     └── f85b5aa49b2923a5.png

この図の様に、blackhole の中にブラックホールの画像を、pondering の中にポンデリングの画像を集めます。機械学習には多くの画像が必要なのですが、retrain.py では最低でも20枚を集める必要があります。

とにかく画像を集めなさい

画像判別をするのであれば、とにかく画像を集めて下さい。

まずはブラックホール画像20枚

image.png

そしてポンデリングの画像も20枚 1

image.png

これとは別に、検証に使う為の画像を数枚用意します。

image.png

学習しましょう

難しい事は必要ありません。以下のコマンドを実行して下さい。

python retrain.py --image_dir images --how_many_training_steps 1000

--image_dir にカテゴリ毎に分けられたディレクトリの親ディレクトリを、--how_many_training_steps にどれくらい学習させるかを指定します。画像枚数も少ないので1000回もあれば十分です。

実行したらしばらく時間が必要です。テレビを見るでもいいし、スマホでゲームするでもいいし、ちょっとオシャレに機械学習してる雰囲気を味わいたい人は tensorboard コマンドを起動するといいでしょう。

tensorboard --logdir /tmp/retrain_logs

http://localhost:6006 にアクセスするとカッコいい画面が出てきます。

image.png

学習が終わると /tmp/output_graph.pb/tmp/output_labels.txt が出来ているはずです。

さぁ判別しよう

判別の為のスクリプトも既に良い物があります。Python は書かなくても構いません。

wget https://github.com/tensorflow/tensorflow/raw/master/tensorflow/examples/label_image/label_image.py

以下の様に実行します。

python label_image.py \
--graph /tmp/output_graph.pb --labels /tmp/output_labels.txt \
--input_layer Placeholder \
--output_layer final_result \
--image input.jpg

この input.jpg に判別したい画像を渡します。

sample1.jpg

pondering 0.9957397
blackhole 0.0042603137

ポンデリング

sample2.jpg

pondering 0.99942964
blackhole 0.0005703046

ポンデリング

sample3.jpg

pondering 0.99130476
blackhole 0.008695241

ポンデリング

sample4.jpg

blackhole 0.99925417
pondering 0.00074583775

ブラックホール

sample4.jpg

blackhole 0.99878365
pondering 0.001216362

ブラックホール

いずれも高い確率で判別できている事が分かります。画像を集めている時はこれ数枚は間違うかもしれないと思ったりもしましたが、良い確率が出て良かったですね。

おわりに

TensorFlow Hub を使って一切 Python を書かずに画像判別をやってみました。これだけ高い確率だと、「今日のオヤツはポンデリングよ」とお母さんがブラックホールを差し出してきても騙される事はないので安心ですね。良かったですね。

追記 2019/04/13

image.png

ブラックホール、ポンデリング、オニオンリングの3クラスで判別してみました。集めたオニオンリングの画像はこちら。

image.png

images/onionring ディレクトリに格納して再度学習しました。

pondering 0.84498084
onionring 0.14338708
blackhole 0.011632051
ポンデリング
pondering 0.9974367
onionring 0.001937004
blackhole 0.00062626286
ポンデリング
pondering 0.9910465
blackhole 0.0070514176
onionring 0.0019021431
ポンデリング
blackhole 0.99832636
pondering 0.001540566
onionring 0.00013305261
ブラックホール
blackhole 0.99802303
pondering 0.0014418605
onionring 0.0005351493
ブラックホール
onionring 0.9961351
pondering 0.003439871
blackhole 0.00042503988
オニオンリング
onionring 0.97317266
pondering 0.02610269
blackhole 0.0007246907
オニオンリング

オニオンリングを混ぜた事で正解率は若干さがりましたが間違いはありませんでした。これならば「今日のオヤツはポンデリングよ」とお母さんがオニオンリングを差し出してきても騙される事はないので安心ですね。良かったですね。

追記 2019/04/19

mruby から TensorFlow Lite を操りブラックホールとポンデリングとオニオンフライを見分ける という記事を書きました。コードは必要だけど面白いので遊んで下さい。


  1. 一部、ポンデリングでない物も含まれますが気にしてはいけません。本質を見失ってしまいます。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away