Увеличение изображений с помощью Tensorflow, чтобы у всех классов было ТОЧНО ОДИНАКОВОЕ количество изображений

Я хочу выполнить многоклассовую классификацию изображений для классификации животных. Проблема в том, что в моем наборе данных разное количество изображений для каждого класса, и разница довольно ужасна. Например:

В этом примере набор данных содержит 320 изображений 3 классов. Класс A имеет 125 изображений, класс B - 170 изображений, а класс C - только 25 изображений, и я хочу расширить эти классы, поэтому для каждого класса будет 200 изображений, что означает 600 изображений, которые равномерно распределены по этим 3 классам.

Однако в моем случае в моем наборе данных 60 классов . Как я могу увеличить их все, чтобы у них было одинаковое количество изображений для всех классов?

2 ответа

Это потребует значительного кодирования, но вы можете использовать ImageDataGenerator для создания расширенных изображений и сохранения их в указанном каталоге. Документация на генератор здесь.В качестве альтернативы вы можете использовать такие модули, как cv2 или PIL, которые предоставляют функции для преобразования изображений. Ниже приведен код, который можно использовать с cv2. Обратите внимание, что посмотрите документацию cv2, чтобы узнать, как указать преобразования изображения, как указано в комментарии к коду. Код ниже

      import os
import cv2
file_number =130 # set this to the number of files you want
sdir=r'C:\Temp\dummydogs\train' # set this to the main directory that contains yor class directories
slist=os.listdir(sdir)
for klass in slist:
    class_path=os.path.join(sdir, klass)
    filelist=os.listdir(class_path)
    file_count=len(filelist)
    if file_count > file_number:
        # delete files from the klass directory because you have more than you need
        delta=file_count-file_number
        for i in range(delta):
            file=filelist[i]
            fpath=os.path.join (class_path,file)
            os.remove(fpath)
    else:
        # need to add files to this klass so do augmentation using cv3 image transforms
        label='-aug' # set this to a string that will be part of the augmented images file name 
        delta=file_number-file_count
        for i in range(delta):
            file=filelist[i]
            file_split=os.path.split(file)
            index=file_split[1].rfind('.')
            fname=file[:index]
            ext=file[index:]
            fnew_name=fname + '-' +str(i) +'-' + label + ext
            fpath=os.path.join(class_path,file)
            img=cv2.imread(fpath)
            img= cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
            # look up cv2 documentation and apply image transformation code here
            dest_path=os.path.join(class_path, fnew_name)
            cv2.imwrite(dest_path,img)
      def dataGenerator(type_, number):
    from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
    '''
     type_ :str 
        ex 'CAT' or 'DOG'
     number :int 
        duplicate img x {number}
    '''
    
    datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rotation_range=40, 
    width_shift_range=0.2,
    height_shift_range=0.2, 
    shear_range=0.2,
    zoom_range=0.2,
    fill_mode='nearest',
    horizontal_flip=True,
    )
    
    for filename in os.listdir(f'train/{type_}/'):
        if filename.endswith('.jpeg'):
            img = load_img(f'train/{type_}/{filename}')
            x = img_to_array(img)
            x = x.reshape((1,) + x.shape)

            i = 0
            for batch in datagen.flow(x, batch_size=1, save_to_dir=f'generate_data/{type_}', save_prefix='IMG', save_format='.jpeg'):
                i += 1
                if i == number:
                    break

использовать это

Другие вопросы по тегам