OSError: image file is truncated (71 bytes not processed)

在加载训练图像数据,准备训练模型的时候,报错如下:

OSError: image file is truncated (71 bytes not processed) 

搜索查了一下,有两种原因,一种说是图像太大,另一种说是图像不完整。找到的解决方式为如下:

from PIL import ImageFile

ImageFile.LOAD_TRUNCATED_IMAGES = True

这么设置,确实可以了,但是对于训练集中有多少有问题的图像,不清楚,而且这些图像如果比例太大,对训练效果会不会产生影响也不清楚。

所以还是想先确认一下,到底这种类型的图像有多少.

报错位置信息如下:

for i, (images, target) in enumerate(train_loader):

具体内部错误如下:

File "/opt/anaconda3/envs/yolov5/lib/python3.6/site-packages/PIL/ImageFile.py", line 260, in load
    "image file is truncated "
OSError: image file is truncated (34 bytes not processed)

所以写了一个测试脚本,就是对训练路径下面的所有图像都用pillow中的Image读取一下,看看哪个图像报错,结果遍历完图像发现一个报错的也没有,这个地方有些疑问。在网上查的时候,看到有人使用keras.preprocessing.image.load_img()找到了出问题的图像,所以打算试一下,结果安装虚拟环境下载需要好久,就先让它下载着,在另外一个环境中使用OpenCV进行读取测试一下,在imread的过程中,出现了几条Premature end of JPEG file提示,总共有三张图像,还好不多,看

在处理图像文件时,如果文件损坏或被截断,使用 Python 的图像处理库(如 `PIL` 或 `Pillow`)可能会抛出 `OSError: image file is truncated` 错误。这种错误通常表示图像文件的完整性存在问题,例如文件未完全下载、传输中断或存储损坏等。 ### 解决方法 1. **忽略截断错误并尝试加载图像** 可以通过设置 `PIL.ImageFile.LOAD_TRUNCATED_IMAGES` 为 `True` 来忽略截断错误,并尝试加载图像。该方法会强制加载不完整的图像文件。 ```python from PIL import Image, ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True image = Image.open("truncated_image.jpg") ``` 2. **验证图像文件的完整性** 在尝试加载图像之前,可以检查文件是否存在或是否为空。此外,可以使用 `os.path.getsize()` 检查文件大小是否合理。 ```python import os from PIL import Image if os.path.exists("truncated_image.jpg") and os.path.getsize("truncated_image.jpg") > 0: try: image = Image.open("truncated_image.jpg") image.load() # 确保图像数据完全加载 except OSError as e: print(f"无法加载图像: {e}") else: print("文件不存在或为空") ``` 3. **重新下载或获取图像文件** 如果图像文件来源于网络,建议重新下载文件。可以使用 `requests` 库重新获取图像,并确保下载完整。 ```python import requests url = "https://example.com/image.jpg" response = requests.get(url, stream=True) with open("downloaded_image.jpg", "wb") as file: for chunk in response.iter_content(chunk_size=1024): if chunk: file.write(chunk) ``` 4. **使用其他图像处理库进行修复** 如果 `Pillow` 无法处理截断图像,可以尝试使用其他工具(如 `opencv`)读取图像。`OpenCV` 对于部分损坏的图像文件具有更强的容错能力。 ```python import cv2 image = cv2.imread("truncated_image.jpg") if image is not None: print("图像加载成功") else: print("图像加载失败") ``` 5. **手动修复图像文件** 如果文件是 JPEG 格式,可以使用 `jpegtran` 等工具进行修复。该工具可以优化和修复损坏的 JPEG 文件。 ```bash jpegtran -copy none -optimize -outfile repaired_image.jpg truncated_image.jpg ``` 然后在 Python 中加载修复后的图像: ```python from PIL import Image image = Image.open("repaired_image.jpg") ``` 通过上述方法,可以有效解决图像文件被截断导致的 `OSError` 错误。如果问题仍然存在,建议检查图像的来源或存储路径,确保文件的完整性和可访问性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值