質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3708閲覧

自作のデータセットでSVMを走らせる方法

mgumi66

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/02/07 08:46

自作のイメージファイルで作成したデータセットがあるのですが、Support vector machine(SVM)解析を行う方法が分かりまん。

SVMではMNISTやdigitなどのデータセットを読み込む方法があるのを知っているのですが、同じようなデータ形式を作成して自作データを運用する方法って無いですか?

宜しくお願いします!!!!!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2020/02/07 08:55

自作のデータセットがどのようなものなのかを追記してください。 ファイル形式、フォーマット、中身など
mgumi66

2020/02/07 08:59

データはpngファイルで、中身はモザイク状のカーペットのような単なる模様です。 データ数は1000も無い程度です。
tiitoi

2020/02/07 09:05 編集

画像サイズはいくつなのでしょうか? MNIST は28x28 なのでそのまま使えますが、 例えば、学習画像が 500x500 の RGB 画像だとすると、画像1枚の情報量が 500*500*3=75万次元のベクトルになってしまうので、なんらかの特徴抽出を行って次元を減らさないと、そのままでは SVM では扱えないと思います。 画像分類なら CNN とか使ったほうがよくないでしょうか。
mgumi66

2020/02/07 09:09

ありがとうございます。 画像サイズは6×6なので、SVMで解析してみたいと思っています。
guest

回答1

0

ベストアンサー

画像をクラスごとにディレクトリで分けておいて、

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]

投稿2020/02/07 09:32

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mgumi66

2020/02/14 07:44

返答が遅くなりました。試してみたところ、無事に画像データからSVMを走らせることができました。 SVMのスコアは少し変だった(0,1の全てが1に判定された)のですが、おそらくデータセットの問題なのかなと思っています。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問