画像分類の流れと参照

この章は画像分類に対する理解を深めるために、画像分類に関する流れと参照について紹介します。

画像表現

私達が普段見ている画像は、プログラム上だと配列(array)として扱うことができます。また私たちは様々な色を画像上で見ますが、これらの色は全て3つの基本的な色である赤、緑、青(RGB: Red, Green, Blue)から成り立っています。よって、これらの基本的な色を使うことで、私たちは全ての色を扱うことができます。このことから、画像をプログラム上で表現するために、配列の形は(高さ、幅、チャンネル(RGB))の形で扱われます。つまり、仮に今500×500の画像があるとした場合、配列の形は(500, 500, 3)となります。

次に、実際に画像の配列の形をプログラム上で確認します。画像をプログラムで扱うために imageio と呼ばれるモジュールを利用して画像をロードします。以下のプログラムで確認することができるように、与えられた画像は500×353です。よって配列の形は(500, 353, 3)となります。

Requirements

  • numpy 1.12.1
  • imageio 2.2.0
  • matplotlib 2.0.2
In [10]:
%matplotlib inline
import os
import numpy as np
from imageio import imread
import matplotlib.pyplot as plt

img = imread('./000001.jpg')
plt.imshow(img)
plt.show()
print("The Image Shape is ", img.shape)
../../../_images/notebooks_neuralnetwork_classification_basic_notebook_3_0.png
The Image Shape is  (500, 353, 3)

学習データの表現

画像分類の問題では、画像それぞれに一つのクラスだけ与えられます。ニューラルネットワークを学習させる場合それぞれの画像に対して1, 2,...Nなどのクラスの値をそれぞれの画像に割り当てて学習させることも可能ですが、効果的かつ効率的に学習させるために、ターゲットデータをこの数値から 1×(クラスの数) のベクトルである One Hot Vector に変換します。このベクトルは全ての要素が0であるベクトルに、クラスを識別するために一つの要素のみ1を代入させたベクトルです。例えば、3つのクラス(Dog, Cat, Bird)があるとします。ここで、0(Dog), 1(Cat), 2(Bird)を使うのではなく、1×3のOne Hot Vectorを利用する。よって、もしクラスがCatであった場合は、1をOne Hot Vectorのインデックス1の部分に代入します。したがってOne Hot Vectorは[0, 1, 0]といった形になります。このようにクラスの数値をOne Hot Vectorに変換することで、ニューラルネットワークを効果的に学習させることができるようにする。

3. Augmentation

ニューラルネットワークの学習を強化するためにはたくさんの画像を利用することが要求されます。しかしながら、モデルを効果的に学習するために必要な十分な画像があることはなかなかありません。したがって、特に複雑なタスクの際には、データのAugmentationが必要になります。このAugmentationに関する関数はRenomに定義されており、また別の章で説明もされています。ですので、データのAugmentationについて理解するために、以下の章を読むことをお薦めします。

Rotate

Flip

Shift

Color Jitter

Crop

学習

画像分類などのコンピュータービジョンに関するタスクにおいて、 畳み込み層 プーリング層 がモデル内でよく使われます。これらの層の理論は複雑なため、この章でなく別の章にて説明があります。また、他の重要な、Optimizerやモデルの保存の仕方も別の章にて説明があります。より深く理解するために以下のリンクを同時に読むことをお薦めします。

Convolutional Neural Network