问题起因是需要用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函数