【问题标题】:How to create image pairs for Siamese network using keras imagedatagenerator如何使用 keras imagedatagenerator 为连体网络创建图像对
【发布时间】:2022-06-18 03:25:49
【问题描述】:

我想创建正负图像对来训练连体网络。我的连体网络如下所示

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 

到目前为止,我发现了一些代码 herehere,其中所有图像都在同一个文件夹中。我如何为我提到的文件夹结构创建图像对(正面:两个图像属于同一类,负面:图像属于不同的类)。任何帮助将不胜感激。

【问题讨论】:

    标签: tensorflow keras deep-learning siamese-network imagedatagenerator


    【解决方案1】:

    您可以尝试以下一种或两种选择:

    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 生成器的信息in this tutorial

    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..])
    
    
    
    

    希望这能让您走上通往工作发电机的道路。

    【讨论】:

    • 嗨@YScharf 谢谢你的回答,但这不是我想要的。在我的数据集中,我有 10 个不同的纹理材料文件夹,每个文件夹都包含该特定纹理材料的图像。我想生成正负图像对来训练 saimese 网络,如 here 中描述的 make_pairs 函数。但我不明白如何在我有多个目录和子目录的情况下采用这些。
    • 我看到@BorhanUddin。一种方法是通过创建一个列表或成对的对比图像来预处理数据。然后,您可以让生成器通过读取此图像对路径列表来为模型提供数据。
    【解决方案2】:
    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多