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

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

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

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

Q&A

解決済

1回答

5689閲覧

機械学習をさせるための自作データセットの作り方について

Kuro3210

総合スコア13

Python 3.x

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

0グッド

0クリップ

投稿2019/04/06 11:24

編集2019/04/06 11:31

前提・実現したいこと

<Python3.5 / Windows10>

CNNに用いるデータセットを自身で作成しようと考えています。

最終的には、
A×AのRGBを持つカラートレーニング画像(x_train)がn個あるとき
x_train.sahpe

(n, A, A, 3)

ラベルの数がm種類の時、
y_train

([0, 1, 2, ... , m, ..., ])

y_train.shape

(n,)

というようにラベルデータとサンプルデータが別に扱えるような形状に仕上げたいと考えております。
(cifar10やMNISTのようなデータセットを作れると理想)
データセットを作るプロトコルを考えましたが、このアプローチが現実的かどうか分かりません。
また、このアプローチを実際にコードに起こす段階でも行き詰っております。
ウェブ上で参照できる実装例にはウェブスクレイピングなどを用いたり、顔認識などによる自動切り取りを組み込んでいるものが多いですが、あくまでファイル上に保存された画像データをもとにした基本的な方法を知りたいです。

コードベースで教えていただけたら幸いです。

試したこと

データセットを作るプロトコルを考えました。

①画像をnumpyを用いてnumpy配列として読み込む。
(多量の画像を読み込む方法が不明)

②ラベル付けを行う
(下記のサイトを参考にするも実装に失敗。)

テストデータとトレーニングデータに分ける
(下記のサイトを参考にするも実装に失敗)

(x_train, y_train), (x_test, y_test)の形状に仕上げる

しかし、まずこのアプローチの仕方が正しいのかすら分かりません。

こちらのサイトhttps://qiita.com/tigerz17/items/e4d1d5b8e00f7a771177
では、あらかじめフォルダを作成してそれをラベルとして使用しているのでしょうか

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

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

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

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

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

Kuro3210

2019/04/06 11:32

失礼いたしました。修正致しました。
guest

回答1

0

ベストアンサー

使用する Deep Learning のライブラリが要求する配列が最終的に作れればいいのですから、どのような形式でデータを保存しているかは重要ではありません。
質問者さんの好みの形式で保存しておけばよいです。

ライブラリが要求する配列はライブラリによって異なりますが、例えば Tensorflow/Keras の場合は
画像は (サンプル数, 高さ, 幅, チャンネル数) の numpy 配列
ラベルは (サンプル数,) の numpy 配列

①画像をnumpyを用いてnumpy配列として読み込む。
(多量の画像を読み込む方法が不明)

OpenCV の cv2.imread() か PIL の PIL.Image.open() を使う。
ファイルパスのリストアップは glob

②ラベル付けを行う
(下記のサイトを参考にするも実装に失敗。)

クラス分類であれば、フォルダごとに分けておくだけでもよい。
分ける作業 (ラベル付け) は基本手動でやる

テストデータとトレーニングデータに分ける
(下記のサイトを参考にするも実装に失敗)
(x_train, y_train), (x_test, y_test)の形状に仕上げる

フォルダ分けした段階で分けておいてもいいし、読み込んだあとに train_test_split() などで分けてもよい。

sklearn.model_selection.train_test_split — scikit-learn 0.20.3 documentation

投稿2019/04/06 12:06

tiitoi

総合スコア21956

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

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

Kuro3210

2019/04/06 14:07

回答ありがとうございます。 この方針で一度チャレンジしようと思います。 しかし、やはり悩ましい部分があります。例えばcv2を用いて cat_im = cv2.imread("C:...path...\cat\cat1.jpg") によって猫の画像cat1.jpgが配列で呼び出せることは分かりました。 しかし、catフォルダ内にあるすべての猫画像はまとめて呼び出すことはできないのでしょうか?
tiitoi

2019/04/06 20:53

指定したフォルダ内の画像の一覧は glob で取得できます。 なので、for で glob で取得したパス一覧に対して、cv2.imread() を呼び出してリストに詰めていけばよいと思います。
Kuro3210

2019/04/07 05:33

無事にラベル付けまで行うことができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問