Probleme beim sequentiellen Lesen von Bildern durch Python

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:

1. Python liest nacheinander die Bilder im Ordner

2. Die Funktion und Verwendung der Funktion os.path.isdir() – Beurteilung, ob es sich um eine blog_isdir-Funktion von Directory_Endless x im Blog-CSDN handelt

Je suppose que tu aimes

Origine blog.csdn.net/dal1223/article/details/126704273
conseillé
Classement