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

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

ただいまの
回答率

87.35%

Keras imagedatagenerator 一括処理

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,613

score 47

kerasで画像判定に関する学習を行なっています。

imagedatageneratorを使ってディレクトリ内の画像に対して一括で処理を行いたいと考えております。

現状は増やしたい画像をimageに入れ、水増し後に元のディレクトリに戻す作業をしています。

imageに画像を入れなくともtrainに入っている全ディレクトリ内の.pngに対して水増しを行いたいのですがどのように書き加えたらいいのか教えてください。

train
/dirA
/A.png
B.png
C.png
/dirB 
/D.png
E.png
F.png
/dirC
/G.png
H.png
Y.png

といったディレクトリ構成になっております

import os
import glob
import numpy as np
from keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array, array_to_img

def draw_images(generator, x, dir_name, index):
    save_name = 'extened' + str(index)
    g = generator.flow(x, batch_size=1, save_to_dir=output_dir, save_prefix=save_name, save_format='png')

    for i in range(10):##############拡張枚数###################
        bach = g.next()

input_dir = 'dir/a'
if __name__ == '__main__':

    ##############出力先###################
    output_dir = input_dir

    ##############入力ディレクトリ###################
    images = glob.glob("/Users/a/Desktop/image/*.png")


    ##############オーギュメンテーションの設定###################
    generator = ImageDataGenerator(
                    #zoom_range=0.8,
                    )


    # 読み込んだ画像を順に拡張
    for i in range(len(images)):
        img = load_img(images[i])
        # 画像を配列化して転置a
        x = img_to_array(img)
        x = np.expand_dims(x, axis=0)
        # 画像の拡張
        draw_images(generator, x, output_dir, i)

print("fin")

宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tiitoi

    2019/07/17 20:29 編集

    現状のコードで変換して保存するということが実現できていそうですが、なにか問題があるのでしょうか?

    キャンセル

  • 22Go

    2019/07/17 21:06

    dirAの中の.pngを見つけたら水増しをして、その後、次のdirBにアクセスして.pngを水増ししたいと思ってます。
    現在は別でディレクトリを準備して水増し後に元のディレクトリに全て写している状況なんですが、もっと簡単にできたらと思いまして。。。
    ちなみに現在はDesktop/train/dirA.dirB.dirCとなっており、Desktop/imageというディレクトリを作成してあります。

    キャンセル

回答 1

checkベストアンサー

+1

データセットのディレクトリで各クラスごとに画像がフォルダで分けられている場合は以下のようにすれば、データセットを水増ししてディレクトリに保存できます。

元の画像と水増しした画像が区別つくように、output_dir に元のデータセットと同じディレクトリ構造で保存するようにしています。

from pathlib import Path
from keras.preprocessing.image import (
    ImageDataGenerator,
    load_img,
    img_to_array,
    array_to_img,
)


# データセットのパス
dataset_dir = Path("/data/flower_photos")

# 以下のようにクラスごとにサブディレクトリがある前提
# /data/flower_photos
# |-- daisy
# |-- dandelion
# |-- roses
# |-- sunflowers
# `-- tulips

# 出力ディレクトリのパス
output_dir = Path("extend")
output_dir.mkdir(exist_ok=True)

# 1枚あたりの生成枚数 (例: 2の場合、1つの画像を2倍に水増しする)
n = 1

# 画像データ生成器を作成する。
params = {"rotation_range": 20, "width_shift_range": 0.4}  # パラメータは適当に変えてください。
datagen = ImageDataGenerator(**params)

for sub_dir in dataset_dir.iterdir():
    print(f"processing {sub_dir} ...")

    output_subdir = output_dir / sub_dir.name
    output_subdir.mkdir(exist_ok=True)

    for img_path in sub_dir.glob("*.jpg"):  # 拡張子は適当に変えてください
        # 画像を読み込む。
        img = load_img(img_path)
        x = img_to_array(img)  # PIL => numpy
        x = np.expand_dims(x, axis=0)  # (H, W, C) -> (1, H, W, C)

        gen = datagen.flow(
            x,
            batch_size=1,
            save_to_dir=output_subdir,
            save_prefix=f"extened_{img_path.stem}",
            save_format="png",
        )

        # ジェネレーターを n 回呼び出す。
        [gen.next() for i in range(n)]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る