当前位置: 首页 > 知识库问答 >
问题:

未知错误:OSError:映像文件被截断(30 字节未处理):

鲜于凯歌
2023-03-14

我想训练一个模特。我有将近150个类,我正在使用ImageDataGenerator来扩展我的数据集。我还使用模型检查点和csvlogger来保存权重。当我开始训练时,它在第一个纪元的某个时刻给了我一个错误。如果有帮助的话,我使用的图像是灰度图像。

这是我的代码:

batch_size = 2000
epochs = 10

    # Augments dataset 10x
train_batches = ImageDataGenerator(preprocessing_function=preprocess_func, horizontal_flip=True, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.2, zoom_range=0.2, fill_mode='nearest') \
    .flow_from_directory(directory=train_path, target_size=image_size, classes=dataset_classes, batch_size=5, color_mode='grayscale')
valid_batches = ImageDataGenerator(preprocessing_function=preprocess_func, horizontal_flip=True, width_shift_range=0.15, height_shift_range=0.1, shear_range=0.2, zoom_range=0.2, fill_mode='nearest') \
    .flow_from_directory(directory=valid_path, target_size=image_size, classes=dataset_classes, batch_size=5, color_mode='grayscale')
test_batches = ImageDataGenerator(preprocessing_function=preprocess_func, horizontal_flip=True, width_shift_range=0.15, height_shift_range=0.1, shear_range=0.2, zoom_range=0.2, fill_mode='nearest') \
    .flow_from_directory(directory=test_path, target_size=image_size, classes=dataset_classes, batch_size=5, color_mode='grayscale')

这是我的回拨:

    from keras.callbacks import ModelCheckpoint, CSVLogger

checkpoint_path = "/content/drive/MyDrive/Colab Notebooks/Datasets/Experiment/weights_improvements-epoch:{epoch:02d}-val_accuracy:{val_accuracy:.2f}.hdf5"
checkpoint_dir = os.path.dirname(checkpoint_path)

# Create a callback that saves the model's weights
cp_callback = ModelCheckpoint(checkpoint_path,
                              verbose=1,
                              monitor='val_accuracy',
                              mode='max',
                              save_best_only=True,
                              save_weights_only=True)

log_folder = '/content/drive/MyDrive/Colab Notebooks/Datasets/Experiment'
log_path = os.path.join(log_folder, 'FSLR_logs.csv')
log_csv = CSVLogger(log_path, separator=',', append=False)

callback_list = [cp_callback, log_csv]

拟合模型:

# Compile the layers into one model and create a connection
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(), metrics=['accuracy'])

# Train the model with the new callback
history = model.fit(x=train_batches,
                    validation_data=valid_batches,
                    batch_size=batch_size,
                    epochs=epochs,
                    callbacks=callback_list)

我收到的错误是这样的:

纪元 1/10 3428/4128 [===========================

6帧 /usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/execute.pyquick_execute(op_name,num_outputs,输入,attrs,ctx,name)58ctx.ensure_initialized()59张量=pywrap_tfe.TFE_Py_Execute(ctx._handle,device_name,op_name,---

未知错误:OSError:图像文件被截断(未处理30个字节)跟踪(最近一次调用的最后一次):

文件"/usr/的本地/lib/python3.7/dist-包/Tensorflow/python/操作/script_ops.py",第249行,在调用ret=func(*args)

文件 “/usr/local/lib/python3.7/dist-packages/tensorflow/python/autograph/impl/api.py”,第 645 行,在包装器返回 func(*args, **kwargs)

文件“/usr/local/lib/python 3.7/dist-packages/tensor flow/python/data/ops/dataset _ ops . py”,第892行,在generator _ py _ func values = next(generator _ state . get _ iterator(iterator _ id))中

文件“/usr/local/lib/python3.7/dist-packages/keras/engine/data_adapter.py”,第822行,位于wrapped_generator中,用于generator_fn()中的数据:

文件“/usr/local/lib/python3.7/dist-packages/keras/engine/data_adapter.py”,第948行,位于generator_fn yield x[i]中

文件 “/usr/local/lib/python3.7/dist-packages/keras_preprocessing/image/iterator.py”,第 65 行,在 getitem return self._get_batches_of_transformed_samples(index_array) 中

文件"/usr/本地/lib/python3.7/dist-的包/keras_preprocessing/图像/iterator.py",第230行,_get_batches_of_transformed_samples插值=self.interpolation)

文件“/usr/local/lib/python3.7/dist-packages/keras_preprocessing/image/utils.py”,第138行,位于load_img img=img中。调整大小(width_height_tuple,重采样)

文件“/usr/local/lib/python3.7/dist-packages/PIL/Image.py”,第1886行,位于resize-self.load()中

文件"/usr/的本地/lib/python3.7/dist-包装/PIL/ImageFile.py",第247行,在加载"(%d字节未处理)"%len(b)

o错误:图像文件被截断(30字节未处理)

[[{ { node py func } }]][[iteorgetnext]][Op:_ _ inference _ train _ function _ 1029]

函数调用栈:train_function

我尝试在训练两个类时使用相同的代码,它工作正常。我不知道为什么当我在我所有的140个类上使用它时,它不起作用。

有人能给我解释一下这个问题吗?我的学校项目需要这个。提前感谢!

编辑:我已经运行此代码来验证所有图像。它没有找到任何损坏的文件。

import os
from os import listdir
from PIL import Image

categ = ['Train', 'Valid', 'Test']
dataset = '/content/drive/MyDrive/Colab Notebooks/Datasets/FSLR_Application_Dataset'

for cat in categ:
  img_path = os.path.join(dataset, cat)
  for foldername in listdir(img_path):
    sign_path = os.path.join(img_path, foldername)
    print(sign_path)
    for sign in listdir(sign_path):
      if sign.endswith('.jpg'):
        try:
          img = Image.open(os.path.join(sign_path, sign)) # open the image file
          img.verify() # verify that it is, in fact an image
        except (IOError, SyntaxError) as e:
          print('Bad file:', sign) # print out the names of corrupt files

共有2个答案

呼延承平
2023-03-14

我以前也遇到过同样的问题,这项工作对我来说,在拟合模型之前添加以下行:

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

history = model.fit(...) #ur fitting code
张宝
2023-03-14

我在查找有缺陷的图像文件时遇到过类似的问题。ImageDataGenerator使用PIL。生成器没有在图像文件中检测到错误,如果检测到错误,它会打印一条警告消息。所以我建议你试着用PIL以外的东西来检测有缺陷的图像文件。尝试使用cv2,我发现它有时能检测到PIL没有检测到的错误。明确地

import cv2
your code but replace 
img = Image.open(os.path.join(sign_path, sign)) # open the image file
          img.verify() # verify that it is, in fact an image
        except (IOError, SyntaxError) as e:
          print('Bad file:', sign) # print out the names of corrupt files
with 
bad_file_list=[]
bad_count=0
try:
    img.cv2.imread(os.path.join(sign_path, sign)
    shape=img.shape # this will throw an error if the img is not read correctly
except:
    bad_file_list.append(os.path.join(sign_path, sign))
    bad_count +=1

然后在循环之外打印出是否发现了坏文件

 类似资料:
  • 虽然我对Objective-C开发很熟悉,但当涉及错误解释时,我仍然认为自己有点像n00b。我在申请别人也在做的工作。我相信我们可能有不同版本的Xcode,一个开发者有一台PC(其他人和我有一台MacBook)。我使用的是Xcode 4.5.1。 问题所在 Apple clang版本4.1(Tags/Apple/Clang-421.11.66)(基于LLVM 3.1 SVN)目标:i386-App

  • 在使用Spring/Java和面向方面编程编写代码时,我面临着一个问题。在服务类中,我有使用@retryable的重试方法和使用@recovery的恢复方法。 这两个方法中的每一个都附加到方面。TestProcessService中的可重试方法“TriggerJob”附加到TestAspect类中的这些方法--BeforeTestTriggerJobsAdvision、AfterTestTrigg

  • 问题内容: 当我的discord bot上网时间过长(大约3-4小时)时,会随机出现此错误,但有时该错误发生得更早,有时又更晚。真的很困扰我 问题答案: 我在自己的代码中为这个问题努力了一段时间。主要问题是跟踪是完全无用的, 并且 错误很少发生,以至于使“在终端中运行并等待”是徒劳的任务。最终,我能够弄清楚Discord.js客户端本身正在引发错误- 在我阅读的任何文档中都没有提到此错误,因此我没

  • 为什么程序不起作用?当我在第一个问题上输入'1',然后在第二个问题上输入一些东西时,出现了一个红色文本:(程序没有完成,但它应该能工作,不是吗?) 线程“main”Java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0在Java.lang.String.Charat(String.Java:658)在javaApplication2.javaAp

  • 我试图按照https://docs.angularjs.org/tutorial的教程操作,但在运行该命令时出错 Angulal-PhoneCat@0.0.0 postinstall c:\git\Angulal-paractions\Angulal-PhoneCat bower install Angulal-PhoneCat@0.0.0update-webdriver C:\git\Angul

  • iam运行一个硒脚本,并继续得到上述错误。这是代码: 所以代码中的注释行对我不起作用。当我添加这一行时,我总是得到这个错误: 并且代码在没有添加上述代码行的情况下也能正常工作。 以下是关于该错误的更多信息: 系统信息: 视窗 7 SP-1 64 位 Chrome信息:版本71.0.3578.98(官方版本)(64位) Java 版本: 10.0.1 请帮我做这件事。