【深層学習入門】ディープラーニングで画像認識!CNNで簡単入門!

近年、注目を浴びているディープラーニング画像認識。

テレビやネットなどでも、大きく取り扱われています。

しかし、

「CNNってなに?」
「画像認識をやりたいけどどうすればいいのか分からない」

と、分からないことだらけですよね。

ということでこの記事では、CNN(Convolutional Neural Network、畳込みニューラルネットワーク)を使って画像認識(画像分類)のハンズオンをします。

CNNは畳み込み層とプーリング層という、いうなれば画像処理に特化したレイヤーを持っています。

CNNの画像処理における優位性は未だに並び立つものがなく、CNNベースの様々なアルゴリズムが発表されています。

まずはCNNの基礎的な実装を覚えて、ディープラーニングに入門しましょう!

この記事の内容

  • CNNとは?
  • CNNのTensorflow/Keras実装
  • CNNを使った画像分類問題に挑戦

※この記事のコードは、Ubuntu 18.04、Python 3.6.7、TensorFlow 1.12.0で動作を確かめました。

CNNとは

CNNとは、畳み込み層とプーリング層という二つの特殊なレイヤーを持ったニューラルネットワークです。

CNNのイメージ図:http://nkdkccmbr.hateblo.jp/entry/2016/10/06/222245より

CNNの具体的な解説については、他の記事で紹介したいと思っています。

CNNの解説については、以下のスライドがおすすめです。

また、CNNのより実用的な知識が書かれているスライドとしては以下の記事がおすすめです。

そして最後に、最新の研究動向がまとめられたスライドです。

Tensorflow/KerasによるTensorflowの実装

ライブラリのimport

まずはライブラリをimportしましょう。

importしたライブラリは以下の通りです。

  • tensorflow (version 1.12.0)
  • 深層学習でGPUを簡単に使うことができる行列計算ライブラリ

 

  • tensorflow.keras
  • tensorflowの上位ラッパー
  • よりニューラルネットワークの実装の際に便利な機能がまとめられたライブラリ

 

  • numpy
  • CPUでの行列計算ライブラリ
  • Pythonで科学計算を行うならほぼ必ず必要になる

 

  • matplotlib
  • Pythonのデファクトスタンダードな可視化ライブラリ

データの読み込み

kerasのdatasetsモジュールを使って深層学習で使うデータセットをダウンロードします。

使い方はsklearnと同様なので簡単ですね。

この関数で読み込めるものは以下の4つです。

  • 教師データ
  • 教師ラベル
  • テストデータ
  • テストラベル

また、クラスの名前は以下のリストをみてください。

ラベルはone hot表現にしたいので、kerasのto_categorical関数を使いましょう。

ちなみに……

one hot表現とは、

「あるデータのクラスが1でクラスが全部で5個ある場合、[0,1,0,0,0]」
「あるデータのクラスが3でクラスが全部で5個ある場合、[0,0,0,1,0]」

のように表現する方法です。

次に、データのスケールを0~1の範囲に直すために、255で割ります。

(8bitカラーなら2**8で256階調なので、0スタートで255までのため)

データの可視化

ここまででデータの準備ができたので、実際に分類する画像を表示してみてみましょう。

教師データとそれに対応するラベルを25個表示してみました。

似たような画像ファイルがテストデータにも入っているので、画像ファイルからラベルを予測していきます。

CNNのモデル構築

画像分類を行うCNNを実装します。

kerasのニューラルネットワークは、keras.Sequentialにリスト形式でレイヤーを追加していくことで実装ができます。

kerasのレイヤを構成するクラスはすべてlayersの下にあるので、そこから選んで使いましょう。

  • Conv2D
  • 畳込み層
  • 特徴量の畳み込みを行う

 

  • MaxPooling2D
  • マックスプーリング
  • レイヤーを縮小して使いやすくする

 

  • Dropout
  • ドロップアウト
  • ネットワークの結合を削って過学習を防ぐ

 

  • Flatten
  • 8×8の二次元配列を64要素の一次元配列に直す
  • (あんまりニューラルネット関係なし)

 

  • Dense
  • 全結合層
  • t層目のすべてのニューロンがt+1層目のすべてのニューロンに繋がっているレイヤ

フィルタサイズ、カーネルサイズ、paddingの設定などがCNNで大切になる部分です。

これらについては最初に貼ったスライドなどでCNNの仕組みを覚えてから設定してください。

わからなければこの値のままで。

kerasで作ったモデル(素のtesnorflowで作ったモデルも)はコンパイルという作業が必要になります。

この際に、以下のような設定をします。

  • オプティマイザ(optimizer)
  • ニューラルネットの学習を効率的に行ってくれるものです

 

  • SGD
  • Adam
  • 他にもたくさん

 

  • 損失関数(loss)
  • ニューラルネットの学習の際に、この関数の値を小さくするようにパラメータを調整します
  • タスクによって損失関数は変わります
  • categorical_crossentropy
  • binary_crossentropy
  • 他にもたくさん

 

  • メトリクス(metrix)
  • 学習の監視に使う関数です。
  • あくまでも監視なので、この関数が学習には影響しません。

CNNの学習学習

学習はfitメソッドを使って行います(sklearnっぽいですね)。

教師データ、教師ラベル、epoch数、batch_sizeなどの基本的な設定をして関数を実行してください。

モニタリング用のログが表示されながら学習の様子が表示され始めます。

[学習中のログ]

教師データの正答率は91パーセプトロンくらいまで上がっていますね。

結果の確認

以上で学習は終わりましたが、実際にクラス分類を行ったのでその精度を見てみましょう。

テストデータに対して予測ラベルを出すには、predictメソッドを使います。

また、評価にはevaluateメソッドを使います。

scoreはリストになっていて、ここでは1つ目がloss、2つ目がaccでした。

そして最後にテストデータと予測ラベルを表示してみましょう。

正解を緑色に、不正解を赤色にします。

最後に

この記事ではCNNを使った画像認識として画像分類タスクを解いてみました

CNNはDeep Learningの中でもホットなアルゴリズムです。

是非覚えてDeep Learningの最新動向を追いかけましょう!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

フクロウ

フクロウ

第一言語はPythonです。
皆さんRustやりましょう。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説