首页 > 解决方案 > tf.keras.preprocessing.image_dataset_from_directory 没有从目录中读取所有图像,而只是其中的一部分

问题描述

我在文件夹中有 9134 个文件在E:\Desktop\IT FYP\Dataset\train 这个文件夹的一侧有 4 个文件夹代表 4 个类

E:\Desktop\IT FYP\Dataset\train\bee                 #2546 files
E:\Desktop\IT FYP\Dataset\train\otherInsect         #1951 files
E:\Desktop\IT FYP\Dataset\train\otherNonInsect      #684  files
E:\Desktop\IT FYP\Dataset\train\wasp                #3953 files

然而,当我使用该函数tf.keras.preprocessing.image_dataset_from_directory加载我的数据集时,如下所示

train_dataset = tf.keras.preprocessing.image_dataset_from_directory(
    directory=("e:/Desktop/IT FYP/Dataset/train"),
    labels="inferred",
    label_mode="categorical",
    image_size=(350, 350),
    seed=123,
    subset=None,
    interpolation="bilinear",
    follow_links=False,
)
class_names = train_dataset.class_names
print(class_names)

控制台返回结果

Found 2287 files belonging to 4 classes.
['bee', 'otherInsect', 'otherNonInsect', 'wasp']

那不是我要查找的 9134 文件,我如何train使用此功能从文件夹中实际加载完整的 9134 文件?非常感谢 。

这是我的更新:我尝试了以下另一种方法来加载数据。

train_path = "e:/Desktop/IT FYP/Dataset/train"
batch_size = 8 #accessing all our data both training and testing
train_dataset = ImageDataGenerator(rescale = 1./250,zoom_range = 0.2).flow_from_directory(directory = train_path,
                                                  target_size = (150,150),
                                                  batch_size = batch_size,)

令人震惊的是,它实际上总共读取了我所有的文件 9134 并且控制台上的结果如下。

Found 9134 images belonging to 4 classes.

为什么两种不同的方法有不同的结果?什么原因 ?

标签: pythontensorflowkeras

解决方案


我经常对从 Internet 下载的文件进行大量图像处理。在某些情况下,这些文件中有错误,或者我想限制它们具有某些扩展名,例如 jpg。所以我编写了一个测试程序,给定一个目录(sdir),程序将遍历 sdir 的所有子目录并检查所有文件以查看它们是否是有效的图像文件并在可接受的扩展名列表中具有扩展名。它还检查图像是否为 rgb、rgba 或灰度。它返回好文件的数量、坏文件的数量和坏文件的列表。

import os
import cv2
def check_images(sdir, ext_list, color_mode):
    def inc_bad(bad_count, bad_list, fpath):        
        bad_count +=1
        bad_list.append(fpath)
        return bad_count, bad_list
    def check_color_mode(channels, color_mode, bad_count, bad_list, fpath):
        result=True
        if color_mode==('rgb' and channels !=3) or (color_mode=='rgba' and channels !=4) or (color_mode == 'grayscale' and channels !=1):
            bad_count, bad_list=inc_bad(bad_count, bad_list, fpath)
            result=False        
        return result,bad_count, bad_list            
    good_count=0
    bad_count = 0
    bad_list=[]    
    classlist=os.listdir(sdir)
    print('The classes found are \n', classlist,'\n')
    for klass in classlist:
        print('Processing class ', klass, '\n')
        classpath=os.path.join(sdir, klass)
        if os.path.isdir(classpath):
            flist=os.listdir(classpath)
            for f in flist:
                fpath=os.path.join(classpath, f)                
                if os.path.isfile(fpath):
                    index=f.rfind('.')
                    ext=f[index +1:]
                    if ext.lower() in ext_list:
                        try:
                            img=cv2.imread(fpath)
                            channels=img.shape[2]
                            result,bad_count, bad_list= check_color_mode(channels, color_mode,bad_count, bad_list,fpath)
                            if result:                            
                                good_count +=1 # check_color_mode found no error
                        except:
                            bad_count, bad_list=inc_bad(bad_count, bad_list, fpath)
                            
                    else:
                        bad_count, bad_list=inc_bad(bad_count, bad_list, fpath)
    return good_count, bad_count, bad_list

现在指定类子目录和文件所在的 sdir。定义可接受的扩展列表,指定 color_mode 并调用函数

sdir=r'c:\temp\people\train'
ext_list=['jpg', 'jpeg', 'png']
color_mode='rgb'
good_count, bad_count, bad_files=check_images(sdir, ext_list, color_mode)
print('number of good files is: ', good_count, '\nnumber of bad files is: ', bad_count)
if bad_count>0:
    for f in bad_files:
        print (f)

我使用的目录有 2 个 savory 和 unsavory 类,总共有 11220 个 jpg 格式的文件,所以运行代码的结果是

The classes found are 
 ['savory', 'unsavory'] 

Processing class  savory 

Processing class  unsavory 

number of good files is:  11220 
number of bad files is:  0

推荐阅读