簡體   English   中英

如何使用 keras imagedatagenerator 為連體網絡創建圖像對

[英]How to create image pairs for Siamese network using keras imagedatagenerator

我想創建正負圖像對來訓練連體網絡。 我的連體網絡如下所示

def ResNet_model():
    
    baseModel = ResNet50(weights="imagenet", include_top=False,input_tensor=Input(shape=(IMAGE_SIZE, IMAGE_SIZE, 3)))
    for layer in baseModel.layers[:165]:
        layer.trainable = False
    
    headModel = baseModel.output
    headModel = GlobalAveragePooling2D()(headModel)
    model = Model(inputs=baseModel.input, outputs=headModel)
    
    return model


featureExtractor = ResNet_model()
imgA = Input(shape=(224, 224, 3))
imgB = Input(shape=(224, 224, 3))

view1_branch = featureExtractor(imgA)
view2_branch = featureExtractor(imgB)

all_features = Concatenate()([view1_branch, view2_branch]) # Lambda(euclidean_distance)([view1_branch, view2_branch]) # #Concatenate()([view1_branch, view2_branch]) 
hybridModel = Dense(500, activation="relu")(all_features)
hybridModel = Dropout(.3)(hybridModel)
hybridModel = Dense(500, activation="relu")(hybridModel)
hybridModel = Dense(500, activation="relu")(hybridModel)
hybridModel = Dense(500, activation="relu")(hybridModel)
hybridModel = Dropout(.25)(hybridModel)
hybridModel = Dense(500, activation="relu")(hybridModel)
hybridModel = Dense(500, activation="relu")(hybridModel)
hybridModel = Dense(10, activation="softmax")(hybridModel)
final_model = Model(inputs=[imgA,imgB], outputs=hybridModel,name="final_output") 

我的文件夾結構如下:

  |-- class_folder_a
  |-- img_1
  |-- img_2
  |-- img_3

  |-- class_folder_b
  |-- img_1
  |-- img_2
  |-- img_3 

到目前為止,我在這里這里找到了一些代碼,所有圖像都在同一個文件夾中。 我如何為我提到的文件夾結構創建圖像對(正面:兩個圖像屬於同一類,負面:圖像屬於不同的類)。 任何幫助,將不勝感激 。

您可以嘗試以下一種或兩種選擇:

1. Python 生成器 使用yield而不是return范式編寫自己的python generator

def data_generator(class_dir_a, class_dir_b, batchsize):
    while True:
      #load images from both directories 

            yield x_a, x_b, y

在本教程中閱讀有關 Python 生成器的更多信息。

tensorflow-2中, model.fit()接受 python 生成器。 過去你必須調用model.fit_generator()

2. Keras 生成器

按照本教程學習如何通過繼承tf.keras.utils.Sequence來構建自己的自定義數據生成器。

只需按照所有步驟操作即可。 當您使用 def __get_data(self) 功能時:通過執行以下操作來適應您的連體網絡:

    def __get_data(self, batches):
        # Generates data containing batch_size samples

        path_batch_a = batches[self.X_col_a['path']]
        path_batch_b = batches[self.X_col_b['path']]
        


        X_batch_a = np.asarray([self.__get_input(x, y, self.input_size) for x, y in zip(path_batch_a)])

        X_batch_b = np.asarray([self.__get_input(x, y, self.input_size) for x, y in zip(path_batch_b)])

        y0_batch = ...

        return tuple(X_batch_a, X_batch_b), tuple([y0_batch..])



希望這能讓您走上通往工作發電機的道路。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM