見出し画像

画像データの正規化と標準化

ディープラーニングで画像データを扱う際に正規化や標準化を行います。なぜこれのデータ変換が必要なのかと思ったことはありませんか。おまじないのように毎回行われるこれらの作業の意味を解説します。

最初にモノクロやRGBなどの画像データの構造について簡単に解説します。その後に正規化と標準化の方法の説明をし、どのように学習や推論で役に立つのかを解説します。

では、さっそく始めましょう。

モノクロ画像のデータ構造

単色の画像は、モノクロ(Monochrome)と呼ばれます。モノクロ画像のデータは色の濃淡(強さ、Intensity)の値を2次元に配列したものです。

モノクロとは単色を意味するので色自体の指定はありません。つまり、どんな色としても解釈ができます。ただし、モノクロは黒から白へのグラデーション(色の変化)として表現されることが多いです。それをグレースケール(Grayscale)と呼びます。

グレースケール

また、画像上の各位置を画素あるいはピクセル(Pixel、Picture Elementと呼びます。ピクセルは画像データの最小要素です。モノクロ画像のデータではピクセルを指定すればその位置における色の濃淡値がわかります。

例えば、グレースケール画像では各ピクセル位置の値は白の強さを表します。データ型としては、8ビット(1バイト)がよく使われ、0から255までの整数値になります。0が完全な黒で、255が完全な白になります。全部で256段階の濃淡を表現できます。

2次元に配列された濃淡値

つまり、モノクロの画像データは2次元に配列されたピクセルの濃淡値です。この画像データを$${\mathcal{M}}$$とすると、行と列(縦と横)で指定したピクセルの濃淡値は、以下のように表現できます。

$$
\mathcal{M}[ 行, 列 ] \rightarrow 濃淡値
$$

行と列は0ベースのインデックスを使うので、2行3列目の濃淡値は$${\mathcal{M}[1, 2]}$$と指定します。

このような2次元のデータ構造をチャンネルと呼びます。この表現を使うと「モノクロ画像のデータ構造は1つのチャンネルを持つ」と簡潔に言い換えられます。

RGB画像のデータ構造

カラー画像を表現する手法で代表的なのはRGBです。R、G、Bの各文字はそれぞれ赤(Red)、緑(Green)、青(Blue)の3色の頭文字からきています。赤と緑と青の混ぜ合わせでさまざまな色を表現します。

RGBは3つのチャンネルを持ちます。各チャンネルで赤、緑、青の濃淡をそれぞれ表現します。つまり、上記のモノクロ画像のようなピクセルの2次元配列が赤、緑、青の各チャンネル対して存在し、それぞれの色の強さを表現しています。

RGB

8ビットのデータ型を使うのであれば、各色で256の濃淡を表現できるので、3つのチャンネルを合わせると$${256 \times 256 \times 256 =16,777,216}$$色の組み合わせを各ピクセル位置に表現できます。8ビットが3つあるので24ビットカラーとも呼ばれます。

これまでチャンネル毎にデータが分かれている前提で話を進めてきましたが、実際にはRGB画像のデータ構造にはチャンネル・ファースト(Channel First)チャンネル・ラスト(Channel Last)の2つの方式があります。

画像ソース

チャンネル・ファーストでは、チャンネルと行と列を指定して濃淡値を得ます。以下のようにチャンネルを最初に指定する3次元配列で表現できます。

$$
\mathcal{M}[ チャンネル, 行, 列 ] \rightarrow 濃淡値
$$

例えば、赤・緑・青の各チャンネルのインデックスを$${0,1,2}$$とすれば、赤のチャンネルの2行3列目の濃淡値は$${\mathcal{M}[0, 1, 2]}$$と指定します。

チャンネル・ラストでは、チャンネルを最後に指定します。

$$
\mathcal{M}[ 行, 列, チャンネル] \rightarrow 濃淡値
$$

よって、赤のチャンネルの2行3列目の濃淡値は$${\mathcal{M}[1, 2, 0]}$$と指定します。

また、ディープラーニングで画像を扱う場合はモノクロでもチャンネルを指定する形式で扱います。そうすればモノクロもRGBもチャンネルの数が異なるだけで同じ形式で扱えるからです。

例えば、モノクロ画像をチャンネル・ファーストで表現した場合、2行3列目の濃淡値は$${\mathcal{M}[0, 1, 2]}$$と指定します。ここでのチャンネル0は赤ではありません。モノクロ画像にある唯一のチャンネルであり、色の指定ではありません。同じく2行3列目をチェンネル・ラストで指定するならば$${\mathcal{M}[1, 2, 0]}$$となります。

チャンネル・ファーストかチャンネル・ラストかは使うソフトウェアによって異なるので注意してください。ちなみに、深層学習用のライブラリであるPyTorchはチャネル・ファースト、TensorFlowはチャンネル・ラストをそれぞれデフォルトで使います。

なお、RGB画像のデータ構造がチャンネル・ラストである場合、ピクセル位置を指定して3色の値を得ることもできます。

$$
\mathcal{M}[ 行, 列 ] \rightarrow [ 赤の濃淡値、緑の濃淡値、青の濃淡値 ]
$$

これはチャンネル・ラストでは3色の濃淡値がメモリ上に連続で格納されているからです。

画像ソース

ただし、ソフトウェアの機能としてメモリ上の構造に限らず、チャンネル・ファーストあるいはチェンネル・ラストによるデータへのアクセスを可能にすることもできます。よって必ずしもデータの格納構造とアクセス方法が一致するとは限りません。

以上で画像データの構造の話が終わったので、正規化標準化の解説をする準備が出来ました。

画像データの正規化

正規化(Normalization)とはデータの値を0から1の範囲に収めることです。

例えば、画像データは0から255の値をとりますが、それを0から1の範囲へと変換します。やり方は簡単で、単に画像データの各チャンネル内の値を 255で割るだけです。

例として、画像データ$${\mathcal{M}}$$を正規化したものを下記にチャンネル・ファーストで表記しています。

$$
\text{正規化}(\mathcal{M})[ チャンネル, 行, 列 ] = \dfrac{\mathcal{M}[ チャンネル, 行, 列 ]}{255}
$$

もちろん画像データだけでなく、他のデータでも正規化は可能です。一般に、正規化はデータの最大値と最小値を使って以下のように計算します。

$$
\text{正規化}(x_i) = \dfrac{x_i - \min(X)}{ \max(X) - \min(X)} \\
 \\
X = \{x_1, x_2, \dots, x_N\}
$$

$${X}$$はデータの集合を意味し、値として$${x_1, x_2, \dots, x_N}$$を含みます。$${x_i}$$は集合内の各値になります。$${N}$$は集合内のデータの数です。なお、$${\min(X)}$$と$${\max(X)}$$は集合内のデータの最小値と最大値をそれぞれあらわしています。

これをMin-Max正規化(Min-Max Normalization)とも呼びますが、単に正規化と言う場合はMin-Max正規化を指すことが多いです。ただし、バッチ正規化(Batch Normalization)などでは正規化の意味が異なるので注意が必要です。

この記事では単に「正規化」を「Min-Max正規化」の意味で使います。

以上、正規化された値は必ず0から1の間に収まります。なお、上記の画像データの正規化は最小値が0であるため式が簡略化されています。

さて、データセット内の画像データを正規化する利点はなんでしょうか。

ここから先は

5,081字

キカベン・読み放題

¥1,000 / 月
初月無料
このメンバーシップの詳細

この記事が気に入ったらサポートをしてみませんか?