最近は、カメラの顔認証や工場での不良品検知など、画像認識という技術が活躍しています。以前は数字を判定するくらいでしたが、今となっては、さまざまな言語の手書き文字を高精度に判定したり、写真から動物の種類を判定したりできるようになっていますから、すごいですよね。
こういった、高度な画像認識を実現している技術がCNN(畳み込みニューラルネットワーク)です。そして、そのCNNを誰もが簡単に利用できるようにしてくれたライブラリが、Kerasです。もしあなたが画像認識プログラムを作成してみたければ、KerasでCNNを作成するのが近道でしょう。
でも、そう言われてもなかなかとっつきにくい部分があるかもしれません。そもそもCNNというものがよくわからないかもしれませんし、Kerasの使い方がわからないかもしれませんから。実はKerasでCNNを使うのは、意外と簡単にできます。
そこで今回は、Kerasとは何か、CNNの作りかた、データの加工の方法など、画像認識プログラムを作る最初のステップを一挙に説明します。
そもそもKerasとは
Kerasは、画像認識などに用いられる深層学習のライブラリで、Python言語で記述されています。
Kerasは、簡単にニューラルネットワークを試すことができるのが魅力的なライブラリです。ニューラルネットワークの編集が容易であるほか、ある目的で作成したニューラルネットワークのプログラムを他のプログラムに移動することも簡単にできます。
またKerasは画像認識に用いられる代表的なニューラルネットワークであるCNNもサポートしていますから、Pythonで画像認識の人工知能(AI)を初めて作成する方にもおすすめでしょう。
また、KerasはTensorFlowまたは、CNTK、Theanoの上で動作します。これらは全て機械学習用のフレームワークで、TensorFlowはGoogle、CNTKはMicrosoft、Theanoはモントリオール大学によって開発されました。いずれのフレームワークも、機械学習において必ず登場する多次元配列の大規模な計算処理を、高速に解決できるという特徴があります。
といっても、特に有名なのはTensorFlowなので、ここでは、TensorFlowを用いて解説をします。
KerasのCNNを使うと、こんなことができる
KerasのCNNを用いると、自由自在に画像を識別する人工知能(AI)を作成できます。どうやって作成するかというと、Pythonで簡単なコードを記述して、学習用の画像を用意するだけ。
ここでは畳み込み層について述べましたが、そもそもニューラルネットワークとは、ニューロンの層を多数組み合わせる仕組みで、各層ごとに多様な計算が行われています。計算の処理は非常に難解かつ複雑で、いちから記述することはプロのエンジニアであっても容易ではありません。
ですが、Kerasでは、層ごとの機能などを関数のパラメータで指定できるようになっているので、簡単にCNNを作成できます。
KerasでCNNを構築する前に、ライブラリを準備しよう
KerasでCNNを構築するためには、KerasとTensorFlowのライブラリを準備する必要があります。ライブラリのインストールにpipを使うのであれば、次のコマンドでライブラリをインストールしましょう。
pip install keras
これで、Kerasを使う準備ができました。ここからは、いよいよCNNのプログラムを見ていきます。
CNNのための画像を読み込もう
ここでは、公式コミュニティで紹介されているコードを参考にしながら、画像を読み込んでCNNを作成する方法について説明します。
今回のコードでは、mnistという画像のデータセットを読み込んで学習します。mnistは、手書きの数字画像のデータセットで、機械学習のチュートリアル用のデータセットとしてよく用いられていますから、もしかしたら他の場面でも目にしたことがあるかもしれません。mnistのデータセットには、0から9までの数字の画像が含まれているので、今回のコードでは、0から9までの10種類の数字画像のデータセットを学習して、数字を判定するCNNを作成します。
まず、次の部分を確認しましょう。
ここでは、load_dataという関数によって、画像を読み込んでから学習用とテスト用に分割しています。
そして、次の部分でデータ構造に合わせてデータを変換します。最後のパラメータの1という値は、画像が白黒であることを表しています。RGBの3色であればここには3が入ります。
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
実際にKerasでCNNを作る
いよいよ、KerasのCNNの核となる、ニューロンの層を作成する部分を見てみます。
model.add(Conv2D(32, kernel_size=(3, 3),
activation=’relu’,
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation=’relu’))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation=’relu’))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation=’softmax’))
上記のコードには、model.addという関数が多く現れています。これがまさに、層を追加する関数です。
ニューラルネットワークというのは、人間の脳神経を模した計算をおこなう層を多数重ねることで判定などを行うAI(人工知能)でした。ですから、model.addという関数によって、それぞれの層を追加しています。そして、プログラムのなかに現れているConv2Dという層がCNNを特徴づける畳み込み層です。
ここで登場している層についてそれぞれ紹介します。
これらのキーワードは、初めのうちはぼんやりと認識しておけば大丈夫。
また、activationというパラメータもしばしば登場しています。これは、「活性化関数」です。reluは最も基本的な活性化関数ですが、さまざまな活性化関数があるので、慣れてきたらいろいろ試すのも良いでしょう。
今回のような識別AIの場合、最後にはsoftmaxという活性化関数を用いるというのがポイント。softmaxは、前の層からの入力を受けて、識別結果ごとの確率を出力するという活性化関数です。今回のCNNを作る目的は、画像がどの数字なのか判定することでしたから、各数字である確率が出力されることになります。
KerasでCNNを作っている時に、エラーが出た時の対処法
エラーと言ってもいろいろですが、インストールしたつもりのものがインポートできないエラーは、いきなり出鼻をくじかれるようで悲しいですよね。また、KerasでCNNを実行しようとして、エラーが出ることもあるでしょう。
よくあるエラーは、インポートエラーです。原因にはいろいろなパターンがありますが、TensorFlowの下部にあるtensorflow.kerasモジュールを使ったり、pipではなくanacondaでインストールしたりすることで解決するかもしれません。
他にも意外とよくあるのが、Kerasのバージョンが合っていないために起こるエラーです。
新しいプログラムを記述する場合には、インターネットなどからさまざまな情報を参考にしますが、そのまま利用した場合に関数のパラメータが変わっていたり、なくなっていたりする場合があります。そういう場合に起こるエラーは、なかなか見つからなくて苦労することがあります。
関数が見つからないなどのエラーメッセージでは、このエラーが起こっていることもありますから、一度落ち着いてバージョンを確認しましょう。
さて今回は、KerasでCNNを作成する方法について説明しました。
Kerasは、ニューラルネットワークを作成できるライブラリで、簡単にさまざまなパターンを試すことができます。TensorFlowとともにKerasをインストールして利用しました。mnistデータセットを使って簡単なCNNを作成して、model.addという関数を繰り返すことによって層を次々に追加できることを確認しました。さらに、活性化関数のパラメータとして基本となるreluについても紹介しました。
Kerasで作成するCNNも、奥は深いのですが、今回のことを知っていれば、ひとまず簡単にCNNを作成できます。ぜひ、一度CNNを作りましょう。層を少しずつ変更していくのが、だんだん楽しくなってくるかもしれません。
【お知らせ】
当メディア(AIZINE)を運営しているAI(人工知能)/DX(デジタルトランスフォーメーション)開発会社お多福ラボでは「福をふりまく」をミッションに、スピード、提案内容、価格、全てにおいて期待を上回り、徹底的な顧客志向で小規模から大規模ソリューションまで幅広く対応しています。
御社の悩みを強みに変える仕組みづくりのお手伝いを致しますので、ぜひご相談ください。