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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2370閲覧

KerasのImageDataGeneratorで連番保存する方法

tmdayr

総合スコア5

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/18 02:49

前提・実現したいこと

KerasのImageDataGeneratorで水増しをしているのですが、
名前がランダムな4桁で決まるため、
ランダムな名前が被った時に上書きされてしまいます。

その問題を解決するために下のようなコードにして対応しているのですが、
これではファイル数が増えてきたときに、速度が遅くなってしまいます。

python

1i = 0 2for batch in datagen.flow(img_array, batch_size=1, save_to_dir=SAVE_DIR, save_prefix='A', save_format='png'): 3 4 #1回1回リネーム 5 files = glob.glob(SAVE_DIR+ '/A_0_*.png') 6 f = ''.join(files) 7 os.rename(f, os.path.join(SAVE_DIR, 'A_' + str(i).zfill(5) + '.png')) 8 9 i += 1 10 if i == 10000: 11 break # 停止しないと無限ループ

質問

ImageDataGeneratorで保存する名前を指定することはできないのでしょうか。
それができないとして、私のコードよりも効率的なやり方があったら教えてください。

補足情報(FW/ツールのバージョンなど)

環境:GoogleColab

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

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

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

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

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

guest

回答2

0

ベストアンサー

ImageDataGeneratorで保存する名前を指定できないのは、質問文へのコメントに記載したとおりです。

質問者様のやりたいことを実現するには、ImageDataGeneratorの機能で保存するのではなく、ImageDataGeneratorはデータ拡張のみに使って、生成されたデータをPIL等を使って自分でコードを書いて保存すると、スマートかと思います。

(推測ですが、ImageDataGeneratorの保存機能は、比較的テンポラリな用途(同一の拡張データセットで学習を比較したい等)、かつ、ランダムに生成するのでデータが重なって消えても問題視しない、という思想のもとに用意されているのではと思います。)

以下にMNISTのデータをもとに、データ拡張してdata_sizeの数の画像を生成して、それを連番でセーブするサンプルコードを示します。Colabで動作確認済です。なお、予め保存先フォルダを作成しておく必要があります。

Python

1import tensorflow.keras as keras 2from keras.preprocessing import image 3from PIL import Image 4 5(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() 6data = x_train.reshape(-1, 28, 28, 1) 7 8params = { 9 'rotation_range': 45, 10} 11datagen = image.ImageDataGenerator(**params) 12 13gen = datagen.flow(data, batch_size=1) 14data_size = 1000 15for i in range(data_size): 16 batches = next(gen) 17 gen_img = batches[0].squeeze() 18 pil_img = Image.fromarray(gen_img).convert("RGB") 19 pil_img.save(f'data/aug_img_{i:05}.jpg') 20

投稿2021/09/23 01:44

編集2021/09/23 01:45
toast-uz

総合スコア3266

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

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

tmdayr

2021/09/23 02:35

pillowライブラリーで保存するのですね ありがとうございます
guest

0

1つ仮のフォルダーを作り、そこに保存します。
その直後にリネームし、本来保存したいフィルダーに移動することで、
高速化が実現できました。

投稿2021/09/23 00:45

tmdayr

総合スコア5

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

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

toast-uz

2021/09/23 01:25

datagen.flowで保存するのではなく、データを生成させておいて、自分で画像セーブを実装するほうが、エレガントですし、リネームの手間も省けます。ベストアンサーをキャンセルできるなら、回答投稿します。
tmdayr

2021/09/23 01:29

自己解決をキャンセルしました 回答よろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問