画像をクラスごとにディレクトリで分けておいて、
my_dataset
├── a ← クラス a の画像が入っている
├── b ← クラス b の画像が入っている
└── c ← クラス c の画像が入っている
ディレクトリから画像を読み込んで、
X: (サンプル数, 次元数) のデータを表す2次元配列
y: (サンプル数,) のラベルを表す1次元配列
を返す関数を作成すればよいと思います。
データを読み込んで、SVM に流せる状態にするまでのコードを以下に記載します。
python
1from pathlib import Path
2
3import numpy as np
4from PIL import Image
5from sklearn.preprocessing import LabelEncoder
6from sklearn.svm import SVC
7
8dataset_dir = Path(r"my_dataset")
9# 以下のようなディレクトリ構成を想定
10# my_dataset
11# ├── a ← クラス a の画像が入っている
12# ├── b ← クラス b の画像が入っている
13# └── c ← クラス c の画像が入っている
14
15
16def load_dataset(dataset_dir):
17 data = []
18 labels = []
19
20 for sub_dir in dataset_dir.iterdir():
21 for img_path in sub_dir.iterdir():
22 img = np.array(Image.open(img_path))
23 # 画像のサイズは全部同じであることを想定
24 label = sub_dir.name
25
26 data.append(img)
27 labels.append(label)
28
29 return np.array(data), np.array(labels)
30
31
32X, y = load_dataset(dataset_dir)
33
34X = X / 255 # [0, 1] にする。
35X = X.reshape(len(X), -1) # (サンプル数, 次元数) にする。
36
37encoder = LabelEncoder()
38y = encoder.fit_transform(y) # 文字を整数にする。["a", "b", "c"] -> [0, 1, 2]
39
40print(X.shape, X.dtype)
41print(y.shape, y.dtype)
42print(y)
43# (3, 3686400) float64
44# (3,) int64
45# [0 1 1]