在训练YOLOv5时遇到图片损坏的问题

数据集选用stl-10图像数据集,利用yolov5源代码进行分类任务训练,参数设置如下:

    parser = argparse.ArgumentParser()
    parser.add_argument('--model', type=str, default='yolov5s-cls.pt', help='initial weights path')
    parser.add_argument('--data', type=str, default='../datasets/stl10', help='cifar10, cifar100, mnist, imagenet, ...')
    parser.add_argument('--epochs', type=int, default=10, help='total training epochs')
    parser.add_argument('--batch-size', type=int, default=64, help='total batch size for all GPUs')
    parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=96, help='train, val image size (pixels)')
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
    parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--workers', type=int, default=0, help='max dataloader workers (per RANK in DDP mode)')
    parser.add_argument('--project', default=ROOT / 'runs/train-cls', help='save to project/name')
    parser.add_argument('--name', default='exp', help='save to project/name')
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    parser.add_argument('--pretrained', nargs='?', const=True, default=True, help='start from i.e. --pretrained False')
    parser.add_argument('--optimizer', choices=['SGD', 'Adam', 'AdamW', 'RMSProp'], default='Adam', help='optimizer')
    parser.add_argument('--lr0', type=float, default=0.001, help='initial learning rate')
    parser.add_argument('--decay', type=float, default=5e-5, help='weight decay')
    parser.add_argument('--label-smoothing', type=float, default=0.1, help='Label smoothing epsilon')
    parser.add_argument('--cutoff', type=int, default=None, help='Model layer cutoff index for Classify() head')
    parser.add_argument('--dropout', type=float, default=None, help='Dropout (fraction)')
    parser.add_argument('--verbose', action='store_true', help='Verbose mode')
    parser.add_argument('--seed', type=int, default=0, help='Global training seed')
    parser.add_argument('--local_rank', type=int, default=-1, help='Automatic DDP Multi-GPU argument, do not modify')

运行时会有以下错误:

img


img

在查找了相关资料后,意思应该是说图片有损坏,但是数据集里的图片应该都是没问题的,并且我也检查过,网上有人说是用cv读取图片时出错,但我改过之后仍有这个问题,有没有人知道这个问题怎么解决?

报错的意思就是你的图片有问题,程序读取了一个空的图片,空的图片没有尺寸所以报错。报错信息不会错,你仔细检查下图片,或者单独写一段程序,循环读取图片的shape,看看是哪张图片卡住了

【以下回答由 GPT 生成】

解决问题流程:

  1. 首先,通过细化问题描述可以帮助你更好地获得帮助。请提供更多关于损坏图片问题的详细信息,例如损坏的图片是什么样的,出现错误的具体提示或错误信息,以及是否有任何日志或报告可用于进一步分析。

  2. 检查图像文件是否损坏。可以使用图像处理库(如PIL或OpenCV)尝试打开每个训练图像文件并检查是否抛出异常或错误。这可以帮助你确定哪些图像文件是损坏的。

    ```python from PIL import Image import os

    def check_image(file_path): try: Image.open(file_path) except (IOError, SyntaxError) as e: print(f"Error opening image: {file_path}") print(e)

    def check_dataset(dataset_path): for root, dirs, files in os.walk(dataset_path): for file in files: file_path = os.path.join(root, file) check_image(file_path)

    check_dataset('') ```

    上述代码将遍历数据集目录,并尝试打开每个图像文件。如果出现异常,将打印错误消息并显示哪些图像文件是损坏的。

  3. 删除损坏的图像文件。找到问题所在后,您可以选择删除损坏的图像文件或将其从训练集中移除,以确保训练稳定和准确性。

    ```python import os

    def remove_corrupted_images(dataset_path): for root, dirs, files in os.walk(dataset_path): for file in files: file_path = os.path.join(root, file) try: Image.open(file_path) except (IOError, SyntaxError): print(f"Removing corrupted image: {file_path}") os.remove(file_path)

    remove_corrupted_images('') ```

    上述代码将遍历数据集目录,并尝试打开每个图像文件。如果出现异常,将删除损坏的图像文件。

  4. 修复数据集中的错误图片。如果您有备份或原始的正确图像文件,可以尝试修复损坏的图像文件。可以将备份图像文件复制到损坏的图像文件所在的位置。

    ```python import shutil

    def repair_dataset_errors(errors, backup_path): for error_file, backup_file in errors.items(): try: shutil.copyfile(backup_file, error_file) print(f"Repaired image: {error_file}") except Exception as e: print(f"Failed to repair image: {error_file}") print(e)

    errors = { '': '', '': '', ... }

    repair_dataset_errors(errors, '') ```

    上述代码将遍历错误图像文件的字典,将备份文件复制到对应的损坏图像文件路径中。如果复制操作失败,将打印错误消息。

请注意,上述代码仅供参考,您需要根据实际情况调整代码和路径。同时,避免直接修改原始数据集,最好在备份数据集上进行操作。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^