Die Ursache des Problems liegt darin, dass beim Lesen des von Ihnen gespeicherten Bildordners mit yolov5 die Reihenfolge des Pfads nicht eingehalten wird.
Wie in der Abbildung oben gezeigt, sollte die erwartete Bildlesereihenfolge „44.jpg-->442.jpg-->443.jpg…“ sein. Die tatsächliche Lesereihenfolge ist jedoch „44.jpg-->4410“. .jpg-->4411.jpg-->4412.jpg-->4413.jpg-->.....-->442.jpg-->443.jpg“, schau es dir an, yolov5 liest das Bild der Code
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')
Die Antwort eines Bloggers lautet: „Da sort() die Methode der Sortierung nach Zeichenschlüsselwert übernimmt, besteht die Lösung darin, die Zeichenfolge vor dem Punkt in eine Zahl für jeden Dateinamen umzuwandeln und diese Zahl dann als Schlüssel zum Sortieren zu verwenden.“ Also Ich habe einen neuen Sortierbefehl gemäß dieser Methode hinzugefügt.
Wenn wir uns die Liste der Speicherpfade ansehen, können wir erkennen, dass wir die Pfade basierend auf der Größe der Zahlen zwischen „\\1\\“ und „.jpg“ sortieren. Daher müssen wir die Methode split() (split.) verwenden () durch Angabe der Trennzeichenfolge
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')
Es wurde jedoch auch der Fehler „Listenindex außerhalb des gültigen Bereichs“ gemeldet. Nach dem Debuggen wurde festgestellt, dass der Wert der Listendateien nach dem Sortieren „None“ wird. Also habe ich den Code zum Lesen des Pfads separat herausgenommen, um das Problem zu finden. Zuerst nehme ich die erste Zeichenfolge der Liste und schneide sie in Scheiben.
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)
Das Ausgabeergebnis ist 44, was darauf hinweist, dass kein Problem mit den sortierten Werten vorliegt. Danach habe ich alle möglichen Möglichkeiten ausprobiert und schließlich Folgendes gefunden:
files=files.sort(key=lambda x: int(x.split("\\1\\")[1].split('.jpg')[0]))
gewechselt zu
files.sort(key=lambda x: int(x.split("\\1\\")[1].split('.jpg')[0]))
Das ist es.
Referenz: