Как я могу применить увеличение данных с помощью Sequence API на Keras? - PullRequest
0 голосов
/ 11 февраля 2020

Я обнаружил в Интернете этот API последовательности (не помню, где, извините):

class PlanetSequence(tf.keras.utils.Sequence):
    """
    Custom Sequence object to train a model on out-of-memory datasets. 
    """

    def __init__(self, df_path, data_path, im_size, batch_size, mode='train'):
        """
        df_path: path to a .csv file that contains columns with image names and labels
        data_path: path that contains the training images
        im_size: image size
        mode: when in training mode, data will be shuffled between epochs
        """
        self.df = pd.read_csv(df_path)
        self.im_size = im_size
        self.batch_size = batch_size
        self.mode = mode

        # Take labels and a list of image locations in memory
        labelsEncoder = self.df['label'].values
        self.labels = to_categorical(labelsEncoder, num_classes=11)
        self.image_list = self.df['image'].apply(lambda x: os.path.join(data_path, x)).tolist()

    def __len__(self):
        return int(math.ceil(len(self.df) / float(self.batch_size)))

    def on_epoch_end(self):
        # Shuffles indexes after each epoch
        self.indexes = range(len(self.image_list))
        if self.mode == 'train':
            self.indexes = random.sample(self.indexes, k=len(self.indexes))

    def get_batch_labels(self, idx): 
        # Fetch a batch of labels
        return self.labels[idx * self.batch_size : (idx + 1) * self.batch_size]

    def get_batch_features(self, idx):
        # Fetch a batch of images
        batch_images = self.image_list[idx * self.batch_size : (1 + idx) * self.batch_size]
        return np.array([load_image(im, self.im_size) for im in batch_images])

    def __getitem__(self, idx):
        batch_x = self.get_batch_features(idx)
        batch_y = self.get_batch_labels(idx)
        return batch_x, batch_y

И в функции load_image у нас есть это:

def load_image(image_path, size):
    # data augmentation logic such as random rotations can be added here
    return img_to_array(load_img(image_path, target_size=(size, size))) / 255.

Кажется что я могу использовать там увеличение данных, но я не могу понять, как это сделать.

Я думал об использовании DataImageGenerator из Keras и использовании потока для увеличения изображений, но я не смог сделать эту работу.

Как лучше всего с этим бороться?

1 Ответ

1 голос
/ 11 февраля 2020

Я немного изменил ответ. Я постараюсь втиснуть генератор данных в ваш код, в то время как я бы предложил go этот способ использовать генератор изображений с базовым c домашним хранением данных.
сначала прочитайте поезд csv и импортируйте shutil util, чтобы переместить вас и выровнять вашу папку, как указано ниже: import shutil используйте этот способ, чтобы быстро прочитать каждую строку csv и скопировать изображение в соответствующие папки согласно структуре shutil.copy(path given in csv, <destination folder>) таким образом, прочитайте обе csvs и используйте shutil для перемещения ваших изображений в иерархии, упомянутой ниже, поверьте мне, для хранения данных потребуется гораздо меньше времени. Вы можете создать несколько подпапок (в зависимости от класса) в папке train и test.

| __ train
| ______ pl anet: [содержит изображения.]
| ______ star: [ содержит изображения.]

| __ test
| ______ Планеты: [содержит изображения]
| ______ собак: [images]

test_dir = os.path.join(PATH, 'test')
train_dir = os.path.join(PATH, 'train')

train_planets_dir = os.path.join(train_dir, 'planet')  # directory with our planets images
train_stars_dir = os.path.join(train_dir, 'star')  # directory with our training star images
# similarly for stars i.e. other class
test_planets_dir = os.path.join(test_dir, 'planet')  
test_stars_dir = os.path.join(test_dir, 'star') 

Теперь вызовите генератор изображений со всеми тип необходимых вам расширений в соответствии с вашими потребностями (см. аргументы для различных расширений, включите все необходимые)

train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
                                                           directory=train_dir,
                                                           shuffle=True,
                                                           target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                           class_mode='binary')


see **train_dir** is the common path which contains all the sub class folders within

similarly for test.
test_data_gen = test_image_generator.flow_from_directory(batch_size=batch_size,
                                                              directory=test_dir,
                                                              target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                              class_mode='binary')

таким образом, вы получите правильный способ хранения данных и сможете эффективно использовать генератор данных, Более того, этот способ в конечном итоге будет обрабатывать метки автоматически.

надеюсь, это немного поможет.

...