Как сортировать прочитанные файлы с помощью ImageDataGenerator

#tensorflow #keras #tf.keras

Вопрос:

введите описание изображения здесь

введите описание изображения здесь

У меня возникли проблемы с загрузкой изображений с помощью DataGenerator. Это не похоже на мой настоящий путь, как вы можете видеть на изображениях. Это должно быть похоже на img(1), img(2), … но img(1), img(10), img(100), …

Как я могу это решить ? Заранее спасибо.

Ответ №1:

Причина, по которой порядок НЕ соответствует ожидаемому, заключается в том, что генератор обрабатывает изображения в алфавитно-цифровом порядке. Например, если ваши изображения помечены 1.jpg, 2.jpg, …9.jpg, 10.jpg, 11.jpg …и т.д. Они будут обработаны в заказе 1.jpg, 10,jpg,11.jpg, и т.д., 2.jpg,20.jpg и т.д. Один из способов сохранить порядок-назвать файлы с помощью заполнения «нулями». Например, если у вас 20 файлов, пометьте их как 01.jpg, 02.jpg, и т. д 09.jpg, 10.jpg и т.д. Имейте в виду, что если вы используете flow_from_directory, каталоги классов также обрабатываются в алфавитно-цифровом порядке. Ниже приведен код функции, которая будет переименовывать все файлы в каталоге (source_dir) численно, начиная с целого значения (snum) с соответствующим заполнением «нулями».

 def rename (source_dir, snum, ):
    import os    
    import shutil         
    flist=os.listdir(source_dir)       
    temp_dir=os.path.join(source_dir, 'temp')    
    if os.path.isdir(temp_dir):
        shutil.rmtree(temp_dir)
    os.mkdir(temp_dir)
    for f in flist:
        fpath=os.path.join(source_dir,f)
        dpath=os.path.join(temp_dir,f)
        shutil.copy(fpath, dpath)
    tlist=os.listdir(temp_dir)
    for f in tlist:
        fpath=os.path.join(source_dir,f)
        os.remove(fpath)
    tlist=os.listdir(temp_dir)    
    fc=len(tlist)  # determine number of d files to process which determines amout of zeros padding needed     
    pad=0
    mod = 10     
    for i in range(1, fc   1): # skip i=0 because 0 modulo anything is 0 and we don't want to increment pad
        if i % mod == 0:
            pad=pad 1                    
            mod =mod * 10     
    for i,f in enumerate(tlist):                 
        fpath=os.path.join(temp_dir,f) #full path to the file       
        index=fpath.rfind('.') # find location of last . in file name          
        new_path=os.path.join(source_dir, str(i   snum).zfill(pad 1)   fpath[index :] )          
        shutil.copy(fpath, new_path)        
    shutil.rmtree(temp_dir)