HYPERDOC でハイパースペクトル画像分類してみよう(解析、分類編)
1. 目的
- データ確認編 に続いてハイパースペクトル画像解析ライブラリを使用してハイパースペクトル画像をクラス分類する。
2. ハイパースペクトル画像解析ライブラリ
主要なハイパースペクトル画像解析ライブラリについて紹介する。scikit-learn 等と組み合わせて使用すると良い。また、ハイパースペクトル画像解析アルゴリズムは論文では掲載されているが実装されていないものも多数あるため、使用したいアルゴリズムで実装がない場合は適宜自分で実装する必要がある。
- Spectral Python
- Project Page: https://www.spectralpython.net/
- GitHub: https://github.com/spectralpython/spectral
- 最終更新日: 2025/4/13
- 特徴: ハイパースペクトル画像解析の主要なアルゴリズムが実装されている。一番よく使用されるライブラリと思われる。定期的にメンテナンスされているようである。
- PySptools
- Project Page: https://pysptools.sourceforge.io/
- GitHub: https://github.com/ctherien/pysptools
- 最終更新日: 2018/2/10
- 特徴: Spectral Python 同様ハイパースペクトル画像解析の主要なアルゴリズムが実装されている。Spectral Python で実装されいないアルゴリズム(FIPPI 等)を含む。ただし、メンテナンスはされていない。
3. Spectral Python によるハイパースペクトル画像解析
3.1. 概要
今回は Spectral Python を使用して、HYPERDOC データセットに対して、いくつかアルゴリズムを適用してみる。HYPERDOC データセットについては、データ確認編 参照。
3.2. 動作環境
次の動作環境で動作確認済みである。
- OS: Windows11
- CPU: 12th Gen Intel(R) Core(TM) i7-1255U
- Python: 3.12.8
3.3. 環境構築
次のコマンドで Python ライブラリをインストールする。
# Spectral Python
pip install spectral==0.24
# HYPERDOC 読み込み用
pip install h5py==3.15.0
pip install matplotlib==3.10.7
pip install numpy==2.3.3
pip install openpyxl==3.1.5
pip install pandas==2.3.3
pip install pillow==11.3.0
pip install scikit-learn==1.7.2
pip install scikit-image==0.25.2
画像読み込みは、次の関数を使用する。
# GT 画像読み込み
def load_gt(gt_file):
gt_image = np.array(Image.open(gt_file))
return gt_image
# HS 画像読み込み
def load_hsi(hsi_path):
with h5py.File(hsi_path,"r") as h5file:
hs_image = h5file["DataCube"][:] # 形状は B, W, H
# 扱いやすいように H, W, B に変形
hs_image = np.transpose(hs_image, (2, 1, 0))
return hs_image
3.4. 主要なアルゴリズム一覧
Spectral Python で実装されている全アルゴリズムは、https://www.spectralpython.net/class_func_glossary.html 参照。
次のアルゴリズムの動作確認をしていく。
次元削減
- Principal Component Analysis (PCA)
- Minimum Noise Fraction (MNF)
エンドメンバー抽出
- Pixel Purity Index (PPI)
スペクトルマッチング
- Spectral Angle Mapper (SAM)
- Modified SAM (MSAM)
異常検知
- RX 検出器
分類
- k-means 法
- Gaussian Maximum Likelihood Classifier (GMLC)
- Mahalanobis Distance Classifier
- Perceptron Classifier
3.5. 次元削減
Principal Component Analysis (PCA)
-
概要
一般的に使用される主成分分析である。参考として次の論文では、一枚の HS 画像に対して主成分分析を適用している。主に画像処理の前処理として有効と考えられる(PCA + SVM 分類、等)。
通常 (画像の全ピクセル数) × (バンド数) のサイズに変形して適用するが、spectral python では直接画像を入力する。ただし、HS 画像はサイズが大きいため、複数枚の画像に適用する場合を考えると Incremental PCA のようなバッチ処理が必要と考えられる(未検証)。スペクトルデータに対する PCA のイメージは次を参考にするとわかりやすい。
-
主要な引数
パラメータ 型 デフォルト値 内容 image np.array - M x N x B サイズの HS 画像 -
戻り値
戻り値は、PCA の結果で、次のメンバー変数が確認できる。
パラメータ 型 内容 eigenvalues np.array 長さ B の固有値 eigenvectors np.array B x B サイズの正規化された固有ベクトル stats GaussianStats ガウス分布の統計量(平均ベクトル, 共分散行列, n 個のサンプル) transform - データを主成分の空間に変換するコールバック関数 reduce - 固有値の数を減らす手法コールバック関数 denoise - データを主成分分析の結果を使用してノイズ除去するコールバック関数 get_denoiseing_transforme - ノイズデータを出力するためのコールバック関数 -
動作確認
# 画像読み込み gt_path = "./data/samples/GT/00001-VNIR-mock-up_GT.png" gt_image = load_gt(gt_path=gt_path) hsi_path = "./data/samples/minicubes/00001-VNIR-mock-up.h5" hs_image = load_hsi(hsi_path=hsi_path) # PCA 学習 pca = principal_components(hs_image) # PCA 適用 pcs = pca.transform(hs_image) # 第1から第3主成分まで結合 pc1 = pcs[:,:,0] pc2 = pcs[:,:,1] pc3 = pcs[:,:,2] rgb = np.dstack([pc1, pc2, pc3]) # GT 画像と PCA 結果比較 fig, ax = plt.subplots(1, 2, figsize=(10, 5)) ax[0].imshow(gt_image) ax[0].set_title("GT") ax[0].axis('off') ax[1].imshow(rgb, cmap='gray') ax[1].set_title("PCA RGB Composite (PC1-PC2-PC3)") ax[1].axis('off') plt.tight_layout() plt.show()HYPERDOC の一枚の画像に対して PCA を適用した結果は次の通りである。
- 赤色箇所(第1主成分)は、背景の紙の部分である。
- 緑色箇所(第2主成分)は、文字の部分である。
- 青色箇所(第3主成分)は、紙と文字の境界部分である。
直接 SVM を適用すれば、HS 画像に映る物体を分類できそうである。

図3.5.1 GT 画像(左)と PCA 結果の比較(右)
Minimum Noise Fraction (MNF)
-
概要
最小ノイズフラクション(または最大ノイズフラクション)と呼ばれる次元削減手法である。PCA が分散が最大になるように主成分を作成するのに対して、MNF はノイズ比が最大になるように主成分を作成する。
-
主要な引数
パラメータ 型 デフォルト値 内容 signal GaussianStats - 推定された信号の統計量 noise GaussianStats - 推定されたノイズの統計量 -
戻り値
戻り値は、MNFResult オブジェクトで、次の手法なメンバー関数が実行できる。
メンバー関数 パラメータ 型 内容 denoise X np.array ノイズ除去する配列. 信号の画素か画像を入力. 戻り値は, X と同じ形状のノイズ除去後のデータ. reduce X np.array 次元削減する配列. 信号の画素か画像を入力. 戻り値は, X と同じ形状の次元削減後のデータ. -
動作確認
ノイズを推定する必要があるため、今回は動作確認は実施しない。pysptools では、白色化後に主成分を作成する実装になっており、使い勝手が良いため pysptools の使用を推奨する。
3.6. エンドメンバー抽出
エンドメンバー(端成分)とは、特定の物質を表す代表的なスペクトルのことである。一般的なスペクトルは、複数のエンドメンバーが混合したスペクトルである。HS 画像内のエンドメンバー(に近い)画素を抽出する方法はエンドメンバー抽出とよばれる。
Pixel Purity Index (PPI)
-
概要
HS 画像内のエンドメンバーを含むピクセルを抽出する手法である。元論文では、前処理として放射伝達モデルで大気、太陽、機器の影響を除去し、MNF を適用している。その後のメインのアルゴリズムが Spectral Python で実装されており、次の通りの処理である。
- ランダムな単位ベクトルを生成する。
- 各ベクトル方向に、すべての画素を射影する。
- 各射影で、最も外側(極端な)位置にある画素を記録する。これは「凸包(convex hull)」上にある可能性が高い画素である。
- これを多数回(数千回など)繰り返す。
- 各画素が「極端点」として何回選ばれたかをカウントする。
-
主要な引数
パラメータ 型 デフォルト値 内容 X np.array - 入力 HS 画像 niters int - イテレーション数. 各イテレーションは画像をランダムな単位ベクトルへの射影に対応. threshold float 0 0 の場合、各ランダムベクトルに対して最も極端な2つのピクセルのみがインデックス増加の対象となる. 0 より大きい場合、ランダムベクトルへの投影値が両極端ピクセルのいずれかの閾値データ単位を持つ全てのピクセルもインデックス増加の対象となる. centered bool False True の場合、X のピクセルは既に計算された平均値が差し引かれているものとみなされる。False の場合、純度指標を計算する前にX の平均値が計算され差し引かれる。 start np.array None 純度指数の初期配列. 前回の計算から継続して計算するためのオプション. -
戻り値
戻り値は、ピクセル純度指数の配列である。
-
動作確認
# 前処理として MNF や PCA を適用すると良い # PPI 実行 idx = ppi(hs_image, niters=100) print(idx.shape) # (150, 150) print(np.unique_counts(idx)) # UniqueCountsResult(values=array([0, 1, 2, 3, 4, 5, 7, 8, 11], dtype=uint32), counts=array([22347, 135, 9, 4, 1, 1, 1, 1, 1])) # 最大カウント回数の画素を抽出する max_count_endmembers = hs_image[idx==np.max(idx)] idx_endmembers = np.where(idx==np.max(idx)) y = idx_endmembers[0][0] x = idx_endmembers[1][0] # エンドメンバーの位置とスペクトルをプロット fig, ax = plt.subplots(1, 2, figsize=(10, 5)) ax[0].imshow(gt_image) ax[0].plot(x, y, marker='*', markersize=20, color="r") ax[0].set_title("GT") ax[0].axis('off') ax[1].plot(np.arange(max_count_endmembers[0].shape[0]), max_count_endmembers[0]) ax[1].set_title("endmenber") plt.tight_layout() plt.show()実装では、試行回数(イテレーション数)を指定して、各画素に対してエンドメンバーとしてカウントされた回数が格納された配列が出力される。初期値がランダムなベクトルであるため、実行ごとに出力が異なる(seed を固定しておけば同じ結果になる)。

図3.6.1 GT 画像におけるエンドメンバーの位置★(左)と エンドメンバーのスペクトル(右)発展手法として、FIPPI がある。エンドメンバー初期セット作成と反復回数の自動設定が PPI と異なる。
3.7. スペクトルマッチング
エンドメンバーと HS 画像の各画素(テストスペクトル)に対して類似度を計算する手法である。Spectral Python では、SAM と MSAM が実装されている。Spectral Python で実装されてはないが、その他の発展手法には、SID や SIDSAM が存在する。
SAM
-
概要
t をテストスペクトル、r をエンドメンバースペクトルとすると、SAM スコアは
$$
sam = cos^{-1}(\frac{\Sigma_{i=1}^C t_i r_i}{\sqrt{\Sigma_{i=1}^C t_i^2}\sqrt{\Sigma_{i=1}^C r_i^2}})
$$
と表される。SAM スコアが小さいほど類似度が高い。
Kruse, F.A., A.B. Lefkoff, J.W. Boardman, K.B. Heidebrecht, A.T. Shapiro, P.J. Barloon, and A.F.H. Goetz. “The Spectral Image Processing System (SIPS)—Interactive Visualization and Analysis of Imaging Spectrometer Data.” Remote Sensing of Environment 44, no. 2–3 (May 1993): 145–63. https://doi.org/10.1016/0034-4257(93)90013-N.
-
主要な引数
パラメータ 型 デフォルト値 内容 data np.array - M x N x B サイズの HS 画像 members np.array - C x B サイズのエンドメンバースペクトル -
戻り値
戻り値は、M x N x C サイズの SAM スコアを格納した配列である。
-
動作確認
# PPI 実行 idx = ppi(hs_image, niters=100) # 最大カウント回数の画素を抽出する max_count_endmembers = hs_image[idx==np.max(idx)] idx_endmembers = np.where(idx==np.max(idx)) y = idx_endmembers[0][0] x = idx_endmembers[1][0] # SAM を実行する sam_score = spectral_angles(hs_image, max_count_endmembers) # エンドメンバーの位置とスペクトルをプロット fig, ax = plt.subplots(1, 2, figsize=(10, 5)) ax[0].imshow(gt_image) ax[0].plot(x, y, marker='*', markersize=20, color="r") ax[0].set_title("GT") ax[0].axis('off') mappable = ax[1].pcolormesh(np.squeeze(sam_score), cmap="Reds") ax[1].invert_yaxis() fig.colorbar(mappable, ax=ax[1]) ax[1].set_title("sam score") plt.tight_layout() plt.show()1枚の HS 画像に対して、PPI でエンドメンバー抽出後、同じ HS 画像に対して SAM を実行する。
PPI で抽出したエンドメンバー(★印)と各画素との SAM スコアを計算した結果を、図3.7.1 に示す。抽出したエンドメンバーが文字のある画素のスペクトルであり、GT の文字のある画素と図右側の白い画素(類似度が高い画素)がほとんど一致していることから、適切にマッチチングできていると考えられる。
図3.7.1 GT 画像におけるエンドメンバーの位置★(左)と SAM の結果(右)
Modified SAM (MSAM)
-
概要
Shoko Oshigami, Yasushi Yamaguchi, Tatsumi Uezato, Atsushi Momose, Yessy Arvelyna, Yuu Kawakami, Taro Yajima, Shuichi Miyatake, and Anna Nguno. 2013. Mineralogical mapping of southern Namibia by application of continuum-removal MSAM method to the HyMap data. Int. J. Remote Sens. 34, 15 (August 2013), 5282-5295.
論文は有料で確認はしていないが、ソースコードではアルゴリズムは次の通りである。
- エンドメンバーを自身の波長方向(バンド方向)に標準化する。標準化したエンドメンバースペクトルを e とする。
- 各画素に対して、各画素のスペクトルを波長方向(バンド方向)に標準化する。標準化した各画素のスペクトルを x_ij とする(i, j は 幅と高さに関するインデックスとする)。
-
msam = 1 - cos(x_{ij}\cdot e) / (\pi / 2)
MSAM スコアが大きいほど類似度が高い。
-
主要な引数
パラメータ 型 デフォルト値 内容 data np.array - M x N x B サイズの HS 画像 members np.array - C x B サイズのエンドメンバースペクトル -
戻り値
戻り値は、M x N x C サイズの SAM スコアを格納した配列である。
-
動作確認
# PPI 実行 idx = ppi(hs_image, niters=100) # 最大カウント回数の画素を抽出する max_count_endmembers = hs_image[idx==np.max(idx)] idx_endmembers = np.where(idx==np.max(idx)) y = idx_endmembers[0][0] x = idx_endmembers[1][0] # MSAM を実行する msam_score = msam(hs_image, max_count_endmembers) # エンドメンバーの位置とスペクトルをプロット fig, ax = plt.subplots(1, 2, figsize=(10, 5)) ax[0].imshow(gt_image) ax[0].plot(x, y, marker='*', markersize=20, color="r") ax[0].set_title("GT") ax[0].axis('off') mappable = ax[1].pcolormesh(np.squeeze(msam_score), cmap="Reds") ax[1].invert_yaxis() fig.colorbar(mappable, ax=ax[1]) ax[1].set_title("msam score") plt.tight_layout() plt.show()HS 画像に対して、PPI でエンドメンバー抽出後、同じ HS 画像に対して MSAM を実行する。
PPI で抽出したエンドメンバー(★印)と各画素との MSAM スコアを計算した結果を、図3.7.2 に示す。抽出したエンドメンバーが文字のある画素のスペクトルであり、GT の文字のある画素と右図の赤い画素(類似度が高い画素)がほとんど一致していることから、適切にマッチチングできていると考えられる。
図3.7.2 GT 画像におけるエンドメンバーの位置★(左)と MSAM の結果(右)
3.8. 異常検知
RX 検出器
-
概要
HS 画像の各画素のスペクトル x に対する RX スコアは、次のようにマハラノビス距離の 2 乗で定義される。
y = (x - \mu_b)^T \Sigma^{-1}(x - \mu_b) ただし、
は背景の平均、\mu_b は背景の共分散行列である。背景の平均、共分散行列は、手動で入力されればその値を設定し、何も入力されなければ入力 HS 画像から計算される。RX スコアは値が高い程、異常を示す画素を示している。\Sigma -
主要な引数
パラメータ 型 デフォルト値 内容 X np.array - M x N x B サイズの HS 画像. background GaussianStats None 背景に関するガウス統計量. backgroud (背景)が与えられない場合は入力 HS 画像から background に関する統計量が計算される. window 2-tuple of odd integers None (inner, outer) 形式のウィンドウサイズ cov np.array None 共分散行列. 前回の計算から継続して計算するためのオプション. -
戻り値
戻り値は、M x N x C サイズの RX スコアを格納した配列である。
-
動作確認
# PCA 学習 pca = principal_components(hs_image) # PCA 適用 pcs = pca.transform(hs_image) # rx 実行 # ※ 直接HS画像入力すると共分散行列のランクがフルランクでないため、 # 逆行列の計算で特異行列となり計算できないエラーが発生すること # に注意 rx_score = rx(pcs) print(rx_score.shape) # (150, 150) # RX スコアをプロット fig, ax = plt.subplots(1, 2, figsize=(10, 5)) ax[0].imshow(gt_image) ax[0].set_title("GT") ax[0].axis('off') mappable = ax[1].pcolormesh(np.squeeze(rx_score), cmap="Reds") ax[1].invert_yaxis() fig.colorbar(mappable, ax=ax[1]) ax[1].set_title("rx score") plt.tight_layout() plt.show()文字と紙の境界部分や、文字の中央部分が RX スコアが高くなることを確認できる。

図3.8.1 GT 画像★(左)と RX スコアの結果(右)
3.9. 分類
画素ごとにスペクトルをクラス分類する。
k-means 法
-
概要
有名な k-means 法を HS 画像にも適用できる。各スペクトルをクラスタ重心の距離が近くなるクラスタに振り分ける手法である。
-
主要な引数
パラメータ 型 デフォルト値 内容 image np.array - M x N x B サイズの HS 画像 nclusters int 10 クラスタ数 max_iterations int 20 イテレーション数の最大値 -
戻り値
パラメータ 型 内容 class_map np.array M x N サイズのクラスタ番号を格納した配列 centers np.array nclusters x B サイズのクラスタ中心の配列 -
動作確認
# K-means 適用 class_map, centers = kmeans(hs_image) print(class_map.shape) # (150, 150) print(centers.shape) # (10, 121) # クラスタを表示 fig, ax = plt.subplots(1, 2, figsize=(10, 5)) ax[0].imshow(gt_image) ax[0].set_title("GT") ax[0].axis('off') ax[1].imshow(class_map) ax[1].set_title("K-means class map") plt.tight_layout() plt.show()結果は次の通りである。クラスタ数をデフォルトの 10 に設定したことによって、元の GT より細かなクラスになったが、概ね GT と同じクラス(文字、紙、境界)に分割されている。

図3.9.1 GT 画像★(左)と k-means クラスタマップ(右)
Gaussian Maximum Likelihood Classifier (GMLC)
-
概要
ガウス最尤分類器(Gaussian Maximum Likelihood Classifier, GMLC)は、各クラスの特徴量分布がガウス分布に従うと仮定して、最尤推定に基づいてクラス分類をする手法である。
-
主要な引数と戻り値
関数 パラメータ 型 デフォルト値 内容 init traing_data TraingClassSet None 学習データのクラス init min_samples int None 学習データのクラスから取得するために必要な最小サンプル数 train training_data TrainingClassSet - 学習データを入力して学習を実行 classify_image image np.array - M x N x B サイズの HS 画像. 戻り値は M x N サイズのクラスマップ配列. classify_spectrum x list or rank-1 ndarray - 1画素を学習データのいずれかのクラスに分類. 戻り値は学習データのいずれかのクラスの番号. -
動作確認
# PCA 学習 pca = principal_components(hs_image) # PCA 適用 pcs = pca.transform(hs_image) # 上半分を学習画像に設定 h_half = pcs.shape[0] // 2 pcs_half1 = pcs[:h_half, ::] gt_half1 = gt_image[:h_half, ::] # 下半分を評価画像に設定 pcs_half2 = pcs[h_half:, ::] gt_half2 = gt_image[h_half:, ::] # 学習データセット作成 train_dataset = create_training_classes( image=pcs_half1, class_mask=gt_half1 ) # GMLC クラスのインスタンス化 gmlc = GaussianClassifier( training_data=train_dataset, ) # GMLC の実行 class_map = gmlc.classify_image(pcs_half2) print(class_map.shape) # (75, 150) # クラスを表示 fig, ax = plt.subplots(1, 2, figsize=(10, 5)) ax[0].imshow(gt_half2) ax[0].set_title("GT") ax[0].axis('off') ax[1].imshow(class_map) ax[1].set_title("GMLC class map") plt.tight_layout() plt.show()画像の上半分を学習し、下半分に対して推論した。前処理として次元削減(PCA 等)を適用しなければ、RX 検出器と同様に計算途中で特異行列となってしまいエラーとなってしまうことに注意が必要である。クラス分類結果は次の通りである。クラス分類が適切に行えていることが確認できる。

図3.9.2 GT 画像★(左)と GMLC クラスマップ(右)
Mahalanobis Distance Classifier
-
概要
マハラノビス距離によってクラス分類をする手法である。
-
主要な引数と戻り値
Gaussian Maximum Likelihood Classifier と同様の引数と戻り値のため割愛する。
-
動作確認
# 画像読み込み gt_path = "./data/samples/GT/00001-VNIR-mock-up_GT.png" gt_image = load_gt(gt_path=gt_path) hsi_path = "./data/samples/minicubes/00001-VNIR-mock-up.h5" hs_image = load_hsi(hsi_path=hsi_path) # PCA 学習 pca = principal_components(hs_image) # PCA 適用 pcs = pca.transform(hs_image) # 上半分を学習画像に設定 h_half = pcs.shape[0] // 2 pcs_half1 = pcs[:h_half, ::] gt_half1 = gt_image[:h_half, ::] # 下半分を評価画像に設定 pcs_half2 = pcs[h_half:, ::] gt_half2 = gt_image[h_half:, ::] # 学習データセット作成 train_dataset = create_training_classes( image=pcs_half1, class_mask=gt_half1 ) # MDC クラスのインスタンス化 mdc = MahalanobisDistanceClassifier( training_data=train_dataset, ) # MDC の実行 class_map = mdc.classify_image(pcs_half2) print(class_map.shape) # (75, 150) # クラスを表示 fig, ax = plt.subplots(1, 2, figsize=(10, 5)) ax[0].imshow(gt_half2) ax[0].set_title("GT") ax[0].axis('off') ax[1].imshow(class_map) ax[1].set_title("MDC class map") plt.tight_layout() plt.show()Gaussian Maximum Likelihood Classifier と同様に学習、推論した結果は次の通りである。GMLC よりも正確にクラス分類できているように思われる。

図3.9.2 GT 画像★(左)と Mahalanobis Distance Classifier クラスマップ(右)
Perceptron Classifier
-
概要
多層パーセプトロンによってクラス分類をする手法である。
-
主要な引数と戻り値
関数 パラメータ 型 デフォルト値 内容 init layers sequence of integers - 多層パーセプトロンの各層の次元数. 0 番目が入力特徴量次元で、最後がクラス数、間は隠れ層の次元を設定. init k float 1.0 Sigmoid 関数の微分の勾配の大きさを調整するパラメータ. k⋅σ(x)(1−σ(x)). train training_data TrainingClassSet - 学習データを入力して学習を実行 train samples_per_class int 0 学習データにおける各クラスのサンプリング数 classify_image image np.array - M x N x B サイズの HS 画像. 戻り値は M x N のクラスマップ配列. -
動作確認
# PCA 学習 pca = principal_components(hs_image) # PCA 適用 pcs = pca.transform(hs_image) # 上半分を学習画像に設定 h_half = pcs.shape[0] // 2 pcs_half1 = pcs[:h_half, ::] gt_half1 = gt_image[:h_half, ::] # 下半分を評価画像に設定 pcs_half2 = pcs[h_half:, ::] gt_half2 = gt_image[h_half:, ::] # 学習データセット作成 train_dataset = create_training_classes( image=pcs_half1, class_mask=gt_half1 ) nfeatures = pcs_half1.shape[-1] nclasses = len(train_dataset) # 多層パーセプトロン学習 p = PerceptronClassifier([nfeatures, 20, 8, nclasses]) p.train(train_dataset, 20, clip=0., accuracy=100., batch=1, momentum=0.3, rate=0.3) # 推論 class_map = p.classify_image(pcs_half2) print(class_map.shape) # (75, 150) # クラスを表示 fig, ax = plt.subplots(1, 2, figsize=(10, 5)) ax[0].imshow(gt_half2) ax[0].set_title("GT") ax[0].axis('off') ax[1].imshow(class_map) ax[1].set_title("Perceptron class map") plt.tight_layout() plt.show()Gaussian Maximum Likelihood Classifier と同様に学習、推論した結果は次の通りである。今回はハイパーパラメータを調整していないため、精度は悪い結果となった。

図3.9.3 GT 画像★(左)と Perceptron Classifier クラスマップ(右)
4. まとめ
今回は Spectral Python を使用して、1 枚の画像に対してクラス分類の実験を実施した。次元削減やクラス分類手法を組み合わせるとある程度クラス分類ができることを確認した。時間があればだが、今後の予定としては、HYPERDOC データセットを複数枚使用して、学習、推論、評価を試してみたい。
Discussion