R&Dセンター 技術開発部 AI技術課 古林 隆宏

TensorFlow+Keras入門 ~ ウチでもできた⁉ ディープラーニング ~

第1回 Kerasでラクショー! ディープラーニング

こんにちは、SCSK株式会社 R&Dセンターの古林です。

これから5回にわたり、「ウチでもできた!?ディープラーニング」と題しまして、TensorFlowやKeras等のOSSを活用したディープラーニングの実装方法について解説させていただきます。

なお、記事内で必要に応じてPythonのコードを示すことがありますが、Python自体の機能や構文に関する解説は割愛させていただきますのでご了承ください。

1) コードをいじる前に:ディープラーニング概説

この連載は、ディープラーニングに関心があり、IT系ニュースサイト等の記事をある程度参照されている方を読者として想定しています。

まずはおさらい程度にディープラーニングとは何か・何がうれしいのかについて確認したいと思います。

ディープラーニングとは

ディープラーニングの「ラーニング」は機械学習を指します。すなわち、コンピュータに多数の学習データを与えることで、どんな入力データに対してどう反応すればよいかを学ばせる手法です。

一口に機械学習といっても、膨大な数の手法が存在するわけですが、その中でも特に「ニューラルネットワーク」というモデルを何層にも重ねた「ディープニューラルネットワーク(Deep Neural Network、以下DNNと表記)」という仕組みを用いて実現したものが「ディープラーニング」と呼ばれます。

ディープラーニングが旧来の機械学習手法と比べて優れている点は、大まかに言って「データをとにかく沢山与えれば、それをどう分析するかを勝手に学習してくれる」というところです。

例えばディープラーニングの得意分野のひとつである「画像認識」において、旧来は入力画像がどのようなものか・得たい情報がどのようなものか、ということを考慮して前処理を重ね、画像に含まれる特徴の情報を取り出した上で機械学習を行う必要がありました。

一方、ディープラーニングにおいては、画像のサイズを揃えてRGBの情報をそのままDNNに与える、という極めて単純な下処理でも、かなりの精度を得ることができます。

とはいえ、「あらゆるデータ・あらゆる処理をこなすことのできる万能のDNN」というものは存在しません。

DNNは名前の通り脳の神経細胞(=ニューロン)のネットワークをモデル化したもので、その規模が大きいほど柔軟で複雑な学習が可能なのですが、やみくもに規模を拡げると、学習に時間がかかりすぎる・コンピュータの性能が足りなくなるなどの弊害が生じます。

そこで、規模増大を抑えつつ、より精度を上げられるようなネットワークの構造上の工夫が、世界中の研究者によって日々新しく提案されています。

ディープラーニングはデータが命

前述の通り「データをとにかく沢山与えることで精度を得る」というのがディープラーニングの基本戦略となっています。

従って、ディープラーニングの恩恵を得るには大量の学習データが必要になります。

ディープラーニング向けに学習データを用意するに当たっては、2つの課題が存在します。これらはディープラーニングを行う上での最大の課題にもなり得ることですので、ここでご紹介します。

課題1:いかにして良質なデータを大量に集めてくるか

処理内容の複雑さや求める精度にもよりますが、単純な処理でも千件以上、複雑な処理に対しては数十万件の学習データが必要になる場合もあります。

またせっかくデータの頭数をそろえても、中身が重複していたり処理目的に関係ないようなデータばかりでは役に立ちません。

例えば、画像に写っているのが犬か猫かをディープラーニングで判定したいという場合に、カブト虫の画像を十万枚集めても目的は達成できません。また集めた犬の画像がダックスフンドばかりに偏っていると、その他の犬種に対する認識精度は望めなくなってしまいます。

実務上は、「ディープラーニングで何かしたい」となるきっかけが、「データは溜めているが何かに活用できないものか」という悩みであることが多いと思うので、データ集め自体はあまり問題にならないことも多いかもしれません。

ただし、蓋を開けてみたら有効なディープラーニングができそうなデータではなかった、ということも充分考えられますので注意が必要です。

課題2:収集した大量のデータに対する「アノテーション」をどうこなすか

こんにちのディープラーニングは「教師あり学習」という手法、すなわち、入力データと、それに対応してコンピュータに出力して欲しい出力データの見本(=教師データ)をセットでコンピュータに与えることで、求める挙動をコンピュータに理解させる手法が基本です。

従って、収集した大量のデータをディープラーニングに使うには、セットになる教師データをあわせて準備する必要がでてきます。

犬と猫の画像を判定する例では、個々の画像が実際には犬と猫のどちらなのか、という情報を添えてやる必要があるわけです。

このように入力データに対する教師データを準備する行為を「アノテーション」と呼びますが、このアノテーションはディープラーニングを行う上で最もコストがかかる工程になることが多いのです。

というのはアノテーションの完全自動化は困難だからです。なにしろ、入力データから自動で出力が得られるような仕組みがないからこそ、それをディープラーニングで作ろうとするのですから・・・。

実務上、アノテーションの負荷が低くて済むケースとして、アノテーションと同等の作業をいままで業務として人手でやっており、それをディープラーニングで自動化したいという場合が挙げられます。

これまで手作業で処理された結果が残っていれば、入力データと教師データとして体裁を整えてやるだけでディープラーニングに使用できることもあるからです。

さて、前置きはこのぐらいにして、いよいよディープラーニングの世界に飛び込んでみましょう。

2) Kerasでラクショー!ディープラーニング

これからディープラーニングを始めるという場合、Kerasというオープンソースのライブラリを使用することをおすすめします。

理由としては、KerasはDNNの組み方が高度に抽象化されているため、実装する上で理解しやすくバグの入り込む余地が少ないからです。

Kerasがどれぐらい「ラクショー」なのか、実際のコードとともに見ていきましょう!

18行でディープラーニング

以下は、画像の分類に特化したDNNである「VGG16」を用いて画像に何が写っているかを認識するコードです。

from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from keras.preprocessing import image
import numpy as np
import sys
 
# 認識対象の画像を読み込み
input_filename = sys.argv[1] #コマンドライン引数で画像のファイルパスを指定
input_image = image.load_img(input_filename, target_size=(224, 224))
input = np.expand_dims(image.img_to_array(input_image), axis=0)
 
# モデルの定義と認識処理を実行
model = VGG16(weights='imagenet')
results = model.predict(preprocess_input(input))
 
# Kerasが提供するdecode_predictionsを用いて結果を出力
decoded_results = decode_predictions(results, top=5)[0]
for decoded_result in decoded_results:
    print(decoded_result)

なんと、空行とコメント行を含めて、たったの18行でディープラーニングによる画像認識ができてしまうのです。

どうでしょう、ラクショーな気がしてきませんか?

もちろん、これにはタネと仕掛けがあります。VGG16は、とても有名なDNNなので、予め構造の定義と学習を済ませたもの(学習済みモデルと呼びます)、さらにデータの下処理と評価結果の可読化のための処理がKerasの一部として提供されています。

これにより、上記コードでは複雑な部分を全てKeras任せにして、画像認識が可能になっています。

画像認識を実行してみる

実際に上記コードを実行して、結果を確認してみましょう。

実行には、Kerasの他にh5pyというライブラリのインストールが必要です。MacやLinuxでは、例えば下記のコマンドでインストール可能です。

$ pip install keras h5py

実行時には、コマンドライン引数で画像のファイルパスを指定する必要があります。

例えば、~/pictures/target_picture.jpgを認識対象の画像とする場合は、以下のようなコマンドになります

$ python vgg16_keras.py ~/pictures/target_picture.jpg

実行すると画像認識処理が行われますが、初回のみ自動でVGG16の学習済みモデルのダウンロードが始まります。ダウンロードには時間がかかりますので気長にお待ち下さい。

例として、筆者が撮影した以下の画像を分析させた結果を示します。


Ess-a-Bagelのロクス・クリームチーズ・ベーグル

結果出力:

('n07693725', 'bagel', 0.98136467)
('n02776631', 'bakery', 0.0082983598)
('n07697313', 'cheeseburger', 0.0076147486)
('n07684084', 'French_loaf', 0.0010651621)
('n07695742', 'pretzel', 0.00057881989)

出力として可能性の高いものが5個表示されています。末尾の数字は確信度の高さを示し、1.0が確信度100%を表します。

最上位はベーグルで確信度も98%となっており、正しく画像認識ができていることがわかります。

その他の結果も、パン屋、チーズバーガー、フランスパン、プレッツェルなど「ありうるな」というものが並んでいます。

おわりに

今回は、ディープラーニングの概要についてご紹介した上で、既製の学習済みモデルを使って、まずはKerasでディープラーニングが動くというところをご覧いただきました。

次回は、Kerasを用いて正面から画像認識処理を実装していきます。

1

2 3 4 5
PAGE TOP