PCAについては、すでに以前の記事で取り組んでいます。
今回は、画像データに対する主成分分析について説明します。
PCAは有名な教師なし次元削減手法で、次元の呪いに悩まされるたびに私たちを助けてくれます。
画像データを扱うことは、通常のデータセットとは少し異なります。
一般的なカラー画像は小さな画素(略して「画素」)で構成されており、多くの画素が配列で集まってデジタル画像を形成している。
一般的なデジタル画像は、0から255までの強度を持つ赤青緑の画素配列を積み重ねることで作られます。
#importing the dataset import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
digits = load_digits()
data = digits.data
data.shape |
グレースケール画像は、色を含まず、グレーの濃淡のみで構成されています。
グレースケール画像の画素強度は、黒(0)から白(255)まで変化し、通常、ブラック&ランプ;ホワイト画像と呼ばれるものになります。
この記事もチェック:PyTorchで音声や画像のカスタムデータセットを自作する方法
DigitsデータセットにPCAを適用する
Digitsデータセットは、1797枚の8×8画像からなる手書き数字のグレースケール画像データセットです。
#taking a sample image to view #Remember image is in the form of numpy array. image_sample = data[ 0 ,:].reshape( 8 , 8 )
plt.imshow(image_sample) |
sklearn.datasetsモジュールから
load_digits` クラスをインポートすることにより、素早くdigitsデータをインポートすることができます。
数字データの形状は (1797, 64) です。
8×8ピクセルを平坦化し、長さ64のベクトルを画像ごとに作成します。
では、どのようなデータになっているか見てみましょう。
#Import required modules from sklearn.decomposition import PCA
pca = PCA( 2 ) # we need 2 principal components.
converted_data = pca.fit_transform(digits.data)
converted_data.shape |
plt.style.use( 'seaborn-whitegrid' )
plt.figure(figsize = ( 10 , 6 ))
c_map = plt.cm.get_cmap( 'jet' , 10 )
plt.scatter(converted_data[:, 0 ], converted_data[:, 1 ], s = 15 ,
cmap = c_map , c = digits.target)
plt.colorbar() plt.xlabel( 'PC-1' ) , plt.ylabel( 'PC-2' )
plt.show() |
この記事もチェック:Pythonでデータセットから別のデータセットへピボットテーブルを作成する
1. 画像の寸法を小さくする
さて、PCAを使用して、散布図を使用してデータセットを視覚化できるように、画像の次元を64から2だけに減らしてみましょう。
sklearnはPCAの非常にシンプルな実装を提供してくれます。
# Importing required libraries import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
|
データは、(1797, 64)から(1797, 2)に縮小されます。
この記事もチェック:Pythonで主成分分析(PCA)による次元削減の理論と実装を詳しく解説する
2. 2. 結果のデータセットを可視化する
主成分分析アルゴリズムを実装するために、sklearn.decomposition
が提供する PCA()
クラスを使用することにします。
入力引数として、変換後のデータセットに含まれる主成分の数を表す整数を受け取ります。
例えば、PCA(0.90) これは、データの分散の90%を説明する主成分を見つけるアルゴリズムであることを意味します。
結果を可視化してみましょう。
# Loading the image img = cv2.imread( 'my_doggo_sample.jpg' ) #you can use any image you want.
plt.imshow(img) |
# Splitting the image in R,G,B arrays. blue,green,red = cv2.split(img)
#it will split the original image into Blue, Green and Red arrays. |
この記事もチェック:PythonによるANOVA検定(分散分析)の実装方法を解説していく
画像データ圧縮のための主成分分析
PCAのもう一つのクールなアプリケーションは、画像圧縮です。
pythonでどのようにこれを実現できるかを見てみましょう。
#initialize PCA with first 20 principal components pca = PCA( 20 )
#Applying to red channel and then applying inverse transform to transformed array. red_transformed = pca.fit_transform(red)
red_inverted = pca.inverse_transform(red_transformed)
#Applying to Green channel and then applying inverse transform to transformed array. green_transformed = pca.fit_transform(green)
green_inverted = pca.inverse_transform(green_transformed)
#Applying to Blue channel and then applying inverse transform to transformed array. blue_transformed = pca.fit_transform(blue)
blue_inverted = pca.inverse_transform(blue_transformed)
|
1. 画像の読み込み
今回はOpenCV(Open Source Computer Vision Library)を使用します。
OpenCVは、オープンソースのコンピュータビジョン・機械学習ライブラリです。
img_compressed = (np.dstack((red_inverted, red_inverted, red_inverted))).astype(np.uint8)
|
#viewing the compressed image plt.imshow(img_compressed) |
この記事もチェック:Pythonで機械学習をライブラリや概要をまとめてみた
2. 画像をR,G,Bの各アレイに分割する
デジタルカラー画像は、R,G,Bの各配列を積み重ねたものであることはご存知のとおりです。
ここでは、画像から各チャンネルを分割し、それぞれから主成分を抽出する必要があります。
ここで重要なのは,OpenCVはRed, Blue, Greenではなく,Blue, Green, Redの各チャネルに分割することです.この順番には十分注意してください。
3. 個々のアレイに主成分を適用する
では、各アレイにPCAを適用してみましょう。
ここでは、最初の20主成分だけを残してPCAを行い、RGBそれぞれのアレイに適用しています。
4. 画像の圧縮
逆変換は、ベース画像の元の寸法を再現するために必要です。
縮小された次元から元の次元を復元する過程で、選択された主成分(今回は20個)のみを残すため、一部の情報が失われる。
関数 dstack
を用いて,逆行列を積み重ねます.ここで,配列のデータ型を指定することが重要です.なぜなら,多くの画像は 8 ビットであるからです.また,各ピクセルは 8 ビットバイトで表現されます.
上の出力は、20個の主成分を考慮した場合のものです。
主成分の数を増やすと、出力画像はより鮮明になります。
最初の50主成分を使用した場合。
次に、100個の主成分を使用した場合。
最初の100個の主成分で、出力はより鮮明になりました。
次に、最初の200個の主成分を用いてPCAを適用してみましょう。
どうですか?200の主成分で、元の画像と同じようなシャープな画像を作成することができました。
主成分の数は任意です。
最初は小さな値から始めて、希望の出力が得られるまで徐々に増やしていきましょう。
このコードで自由に実験してください。
まとめ
この記事では、次元削減技術としてのPCAの応用を探求し、画像データに適用しました。
また、PCAが画像圧縮にどのように利用されているかも見てきました。
それでは、よい学習を