拡張画像やその他の機能を備えたKerasイテレータ


8

画像のデータセットと.csv、各画像のデータがいくつかあるとします。あなたの目標は、畳み込みブランチと他のブランチ(私の場合はMLP)を持つNNを作成することです。

さて、ネットワークを作成する方法についてはたくさんのガイド(ここでは1つもう1つ)がありますが、それは問題ではありません。

ここでの問題は、拡張画像を追加するKeras フローからの[[convolution_input, other_features], target]場合の形でイテレーターを作成する方法です。convolution_inputImageDataGenerator

より具体的には、n番目の画像(拡張されたものであるかどうかに関係なく)がNNに供給されると、その内部の元の機能が必要になりますother_features

私はいくつかの試みを見つけました(ここここで、2番目は有望に見えましたが、拡張画像を処理する方法を理解することができませんでした)それを正確に実行していましたが、Kerasジェネレータが行う可能性のあるデータセット操作を考慮していないようですします。


1
質問:大丈夫ですか、それともflow必要flow_from_directoryですか?(flowすべての画像をメモリにロードしたままにできることを意味します)
DanielMöller

ええと、画像変換を自動的に処理するフローが欲しいだけです。私の場合flow_from_dataframe、ファイル名、機能、クラスがあるので使用していました
Lamberto Basti

回答:


3

たとえば、csvがあり、画像やその他の機能がファイルに含まれているとします。

ここでidは画像名を表し、その後に機能が続き、その後にターゲットが続きます(分類のクラス、再生成の番号)

ここに画像の説明を入力してください

最初にデータジェネレーターを定義し、後でオーバーライドできます。

pandasデータフレームのcsvからデータを読み取り、kerasのflow_from_dataframeを使用してデータフレームから読み取ります。

df = pandas.read_csv("dummycsv.csv")
datagen = ImageDataGenerator(rescale=1/255.)
generator = datagen.flow_from_dataframe(df,directory="out/",x_col="id",y_col=df.columns[1:],class_mode="raw",batch_size=1)

ImageDataGeneratorでいつでも拡張機能を追加できます。

上記のflow_from_dataframeのコードで注意すべき点は

x_col =画像名

y_col =通常はクラス名を含む列ですが、csv内の他のすべての列を最初に指定することで、後でオーバーライドできます。つまり、feat_1、feat_2 .... class_labelまで

class_mode = raw、yのすべての値をそのまま返すようジェネレーターに提案します。

ここで、上記のジェネレーターをオーバーライド/継承し、新しいものを作成して、[img、otherfeatures]、[target]を返すようにします。

ここに説明付きのコメント付きのコードがあります

def my_custom_generator():
count = 0 #to keep track of complete epoch
while True:
    if(count==len(df.index)): 
        #if the count is matching with the length of df, the one pass is completed, so reset the generator
        generator.reset()
        break
    count+=1
    data = generator.next() #get the data from the generator
    #the data looks like this [[img,img] , [other_cols,other_cols]]  based on the batch size

    imgs = []
    cols = []
    targets = []
    #iterate the data and append the necessary columns in the corresponding arrays 
    for k in range(batch_size):
        imgs.append(data[0][k]) #the first array contains all images

        cols.append(data[1][k][:-1])  #the second array contains all features with last column as class, so [:-1]
        targets.append(data[1][k][-1]) #the last column in the second array from data is the class

    yield [imgs,cols],targets  #this will yield the result as you expect.

検証ジェネレーターに同様の関数を作成します。必要に応じてtrain_test_splitを使用してデータフレームを分割し、2つのジェネレータを作成してオーバーライドします。

このように関数をmodel.fit_generatorに渡します

model.fit_generator(my_custom_generator(),.....other params)

しかしif(count==len(df.index))、拡張されたデータセットが元のデータセットよりもはるかに多い場合、エポックを追跡するにはどうすればよいですか?
ランベルトバスティ

1
画像に拡張が適用されることはほとんどありません。個別に保存してトレーニングセットの一意のインスタンスとして使用しない限り、画像の数は増えません。各エポックの間、オーグメンテーションがどのように役立つかは、ランダムに異なるオーグメンテーションが適用されるため、異なるイメージのように見えます
venkata krishnan

うわー、それは膨大な情報です。回答にも追加することをお勧めします。また、なぜこのような重要な情報がKerasのドキュメントに明示的に記載されていないのですか?
ランベルトバスティ

1
私も自分で考えました。トレーニングのエポックごとのステップについて言及するときは、通常、トレーニングの長さをバッチサイズで除算します。つまり、エポックでは、すべての画像を1回だけ渡します。私は..私は右の午前願っています
ヴェンカタクリシュナン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.