python顺序读取图片遇到的问题

  • Post author:
  • Post category:python

问题起因是需要用yolov5读取自己保存的图片文件夹时,并没有按照路径的顺序。

 如上图所示,预期的图片读取顺序应该是“44.jpg–>442.jpg–>443.jpg…..”然而实际读取顺序为”44.jpg–>4410.jpg–>4411.jpg–>4412.jpg–>4413.jpg–>…..–>442.jpg–>443.jpg”,查看了一下,yolov5读取图片的代码

class LoadImages:
    # YOLOv5 image/video dataloader, i.e. `python detect.py --source image.jpg/vid.mp4`
    def __init__(self, path, img_size=640, stride=32, auto=True):
        p = str(Path(path).resolve())  # os-agnostic absolute path
        if '*' in p:
            files = sorted(glob.glob(p, recursive=True))  # glob

        elif os.path.isdir(p):
            files = sorted(glob.glob(os.path.join(p, '*.*')))  # dir
         
        elif os.path.isfile(p):
            files = [p]  # files

        else:
            raise Exception(f'ERROR: {p} does not exist')

有个博主的答案是”因为sort()采取了按字符键值排序的手段,解决方法是对每个文件名将句号前的字符串转化为数字,然后以数字为key来进行排序。“于是我就按照这个方法加入了一句新的排序命令。

通过查看存放路径的列表可以看出我们对路径排序的依据是”\\1\\”和”.jpg”之间的数字大小,所以需使用split()方法( split() 通过指定分隔符对字符串进行切片)将数字切出来,故加入如下代码。

class LoadImages:
    # YOLOv5 image/video dataloader, i.e. `python detect.py --source image.jpg/vid.mp4`
    def __init__(self, path, img_size=640, stride=32, auto=True):
        p = str(Path(path).resolve())  # os-agnostic absolute path
        if '*' in p:
            files = sorted(glob.glob(p, recursive=True))  # glob

        elif os.path.isdir(p):
            files = sorted(glob.glob(os.path.join(p, '*.*')))  # dir
            files = files.sort(key=lambda x: int(x.split(r"\\1\\")[-1].split('.jpg')[0]))#新增


        elif os.path.isfile(p):
            files = [p]  # files
        else:
            raise Exception(f'ERROR: {p} does not exist')

但是又报错“list index out of range”列表索引超出范围。调试后发现,排序后列表files值变成了None。于是我将这段读取路径的代码单独拿出来寻找问题。首先我先取列表的第一个字符串进行切片。

p="D:\\yolov5\\yolov5-6.1\\runs\detect\\exp\\crops\\1"
if '*' in p:
    files = sorted(glob.glob(p, recursive=True))  # glob
elif os.path.isdir(p):
    files = sorted(glob.glob(os.path.join(p, '*.*')))  # dir
    files1 = files[0].split("\\1\\")[1].split('.jpg')[0]
    print(files1)

输出结果为44,说明排序的值是没有问题的。之后又尝试了各种可能,最后发现只要把:


            files=files.sort(key=lambda x: int(x.split("\\1\\")[1].split('.jpg')[0]))

改成 


            files.sort(key=lambda x: int(x.split("\\1\\")[1].split('.jpg')[0]))

即可。

参考:

1.python顺序读取文件夹中的图片方法_若曦爹的博客-CSDN博客_python按顺序读取图片

2.os.path.isdir()函数的作用和用法-判断是否为目录_无止境x的博客-CSDN博客_isdir函数


版权声明:本文为dal1223原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。