python - 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.
为什么两种不同的方法有不同的结果?什么原因 ?
解决方案
我经常对从 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
推荐阅读
- javascript - 如何将值从表单添加到 div,堆叠值?
- java - Java Bouncy Castle TLS 协议版本顺序?
- javascript - 将 JSON 对象保存到项目结构内的 JSON 文件中
- android - Google Play 商店内部测试临时应用名称
- node.js - 游戏状态的单一事实来源
- reactjs - 正确处理 React 中使用的 SCSS 导出的汇总插件
- vba - 将附件从一个草稿移到另一个草稿
- javascript - 如何使用 javascript/jquery 打开 Button-group 中的特定元素
- google-cloud-firestore - 与 Algolia 进行关系搜索?
- flutter - 如何在 Getx Rx 上添加错误
并在流生成器上获取它?