Bringen Sie Ihnen bei, wie Sie Ihren eigenen CIFAR-Datensatz erstellen (mit Projektquellcode)

Beginnend mit der Erstellung des CIFAR-Datensatzes lernen Sie, wie Sie Ihr eigenes Klassifizierungsmodell trainieren

Inhaltsverzeichnis

  • Erstellen Sie Ihren eigenen Datensatz mit Bezug auf das CIFAR-Format
  • Trainieren Sie ein Modell mit einem selbst erstellten Datensatz

Erstellen Sie Ihren eigenen Datensatz mit Bezug auf das CIFAR-Format

Der Code wurde auf meinem Github veröffentlicht . Denken Sie daran, mir einen Stern zu hinterlassen. Im Folgenden finden Sie eine detaillierte Anleitung zur Verwendung des Codes
  • Legen Sie zunächst alle Bilder nach Kategorie in einem Ordner ab, und der Ordnername ist der Kategoriename. Beispiel: Wenn es 20 Klassen gibt, gibt es 20 Ordner
  • Extrahieren Sie den Pfad aller Bilder in eine Datei. Jede Zeile in der Datei enthält den Bildpfad und den Index der Kategorie, zu der das Bild gehört (die entsprechende Beziehung zwischen der Bildkategorie und dem Index wird gleichzeitig generiert).
    • Führen Sie die Datei get_filename.py aus, um den Bildpfad + Kategorieindex (data/cow_jpg.lst) und die entsprechende Kategorieindextabelle (data/object_list.txt) zu generieren.
      import os
      def getFlist(path):
          root_dirs = []
          for root, dirs, files in os.walk(path):
              print('root_dir:', root)
              print('sub_dirs:', dirs)
              print('files:', files)
              root_dirs.append(root)
              print('root_dirs:', root_dirs[1:])
          root_dirs = root_dirs[1:]
          return root_dirs
      def getChildList(root_dirs):
          j = 0
          f = open('data/cow_jpg.lst', 'w')#生成文件路径和类别索引
      if __name__ == '__main__':
          resDir = 'data'
          f2 = open('data/object_list.txt', 'w')#生成类别和索引的对应表
          root_dirs = getFlist(resDir)
          k = 0
          for root_dir in root_dirs:
              f2.write('%s %s\n'%(root_dir,k))
              k = k+1
          f2.close()
          getChildList(root_dirs)
          print(root_dirs)
      
    • Die Kategorieindex-Korrespondenztabelle soll der durch den Dateinamen dargestellten Kategorie mit dem Index entsprechen, da die Zeichenfolge beim Training des Modells nicht als Kategoriename verwendet werden kann. Zum Beispiel: Hund 0, Katze 1, Huhn 3 ...
  • Teilen Sie den Trainingssatz und den Testsatz auf (hier verschlüssele ich zuerst alle Daten, nehme einen Teil als Trainingssatz und den Rest als Testsatz).
    • Öffnen Sie die Datei make_test_batch.py ​​​​
      import os
      import random
      f = open('data/cow_jpg.lst')#上一步生成的图片路径文件
      list = f.readlines()
      print(len(list))
      random.shuffle(list)
      print(list)
      set_num = int(float(len(list))*0.2)
      #0.2为拆分阈值,0.2则是前20%为测试集,剩下的是训练集
      test_list = list[:set_num]
      train_list = list[set_num:]
      print('================')
      print(len(test_list))
      print(len(train_list))
      print(test_list and train_list)
      
      f2 = open('data/cow_jpg_train.lst','w')
      for i in train_list:
          f2.write(i)
      f3 = open('data/cow_jpg_test.lst','w')
      for i in test_list:
          f3.write(i)
      f.close()
      f2.close()
      f3.close()
      
    • Füllen Sie die dritte Zeile mit der im vorherigen Schritt generierten Bildpfad- und Kategorieindexdatei (data/cow_jpg.lst) aus
    • Legen Sie den Split-Schwellenwert fest. Ich habe 0,2 als Split-Schwellenwert festgelegt, was bedeutet, dass die ersten 20 % der Testsatz und der Rest der Trainingssatz sind
    • laufen!
    • generieren test_batch(Dateiname: data/cow_jpg_test.lst)
      und train_batch(Dateiname: data/cow_jpg_train.lst)
  • Machen Sie eine Charge CIFAR
    • Führen Sie die Datei demo.py aus und füllen Sie den Parameter file_list mit der im vorherigen Schritt generierten Bildpfaddatei aus (data/cow_jpg_train.lst).
    • Füllen Sie die geteilte Tran-Datei (cow_jpg_train.lst) aus, setzen Sie bin_num auf 4 und es werden vier Batch_train-Dateien generiert
    • Füllen Sie die geteilte Tran-Datei (cow_jpg_test.lst) aus, setzen Sie bin_num auf 1 und eine Batch_test-Datei wird generiert
    • Es werden insgesamt fünf Dateien generiert, die mit dem vom Management bereitgestellten komprimierten CIFAR-Paket identisch sind
  • Erstellen Sie eine .mate-Datei von CIFAR
    • Erstellen Sie eine neue Datei „batches.meta“ im Batch-Ordner
    • Öffnen Sie die Datei edit_mate.py
    • Geben Sie die Anzahl der in jeder Charge enthaltenen Proben ein (num_cases_per_batch). Hier stelle ich 2500 ein, da ich insgesamt 10000 Proben habe, aufgeteilt in vier Chargen
    • Ersetzen Sie den Kategorienamen (der Dateiname ist kein Index) in der Kategorieindextabellendatei (object_list.txt) in der zehnten Zeile der Reihe nach. Dies sollte der Kategoriename sein, dh der Dateiname, zum Beispiel: cat, Hund, Huhn, hier ist eine Zahlenfolge
    • laufen!
    • Generieren Sie die Datei „batches.meta“.

Auf diese Weise erhalten Sie drei Dateitypen: data_batch_0, ..., test_batch,batches.meta usw., die vollständig mit dem offiziellen CIFAR-Datensatz übereinstimmen. Nehmen wir zum Testen ein beliebiges Modell, das den CIFAR-Datensatz als Beispiel verwendet

Trainieren Sie ein Modell mit einem selbst erstellten Datensatz

  • Öffnen Sie data_utils.py, suchen Sie den folgenden Code, setzen Sie „Download“ auf „Nein“ (Download=False). Vergessen Sie ihn, wenn Sie ihn nicht finden können, und überspringen Sie diesen Schritt

    if args.dataset == "cifar10":
         trainset = datasets.CIFAR10(root="./data",
                                     train=True,
                                     download=False,
                                     transform=transform_train)
      
         testset = datasets.CIFAR10(root="./data",
                                    train=False,
                                    download=False,
                                    transform=transform_test) if args.local_rank in [-1, 0] else None
    
  • Führen Sie das Modell train.py aus und melden Sie einen Fehler

    • Traceback (most recent call last):
          File "/workspace/ViT-pytorch-main/train.py", line 347, in <module>
            main()
          File "/workspace/ViT-pytorch-main/train.py", line 342, in main
            train(args, model)
          File "/workspace/ViT-pytorch-main/train.py", line 158, in train
            train_loader, test_loader = get_loader(args)
          File "/workspace/ViT-pytorch-main/utils/data_utils.py", line 31, in get_loader
            transform=transform_train)
          File "/opt/conda/envs/ViT/lib/python3.6/site-packages/torchvision/datasets/cifar.py", line 93, in __init__
            self._load_meta()
          File "/opt/conda/envs/ViT/lib/python3.6/site-packages/torchvision/datasets/cifar.py", line 99, in _load_meta
            ' You can use download=True to download it'
            RuntimeError: Dataset metadata file not found or corrupted. You can use download=True to download it
      
    • Der Grund dafür ist, dass das Modell die CIFAR-Datei nicht findet, da die CIFAR-Funktion über eine eigene Integritätsprüfung (check_integrity) verfügt. Schließen Sie sie einfach.
  • Deaktivieren Sie die Überprüfung der Dateiintegrität im CIFAR-Quellcode

    • Suchen Sie den Speicherort des CIFAR-Quellcodes gemäß der Fehlermeldung
    • Ich bin hier/opt/conda/envs/ViT/lib/python3.6/site-packages/torchvision/datasets/cifar.py
    • Öffnen Sie den Quellcode und kommentieren Sie die folgenden Zeilen aus
        if not check_integrity(path, self.meta['md5']):
            raise RuntimeError('Dataset metadata file not found or corrupted.' +
                           ' You can use download=True to download it')
      
        if not self._check_integrity():
             raise RuntimeError('Dataset not found or corrupted.' +
                                ' You can use download=True to download it')
      
        if not check_integrity(fpath, md5):
           return False
      
  • Suchen Sie in Ihrem Programmcode nach num_classes = 10 und ändern Sie 10 in Ihre Anzahl an Kategorien

    • In Pycharm können Sie num_classes mit Strg + Umschalt + F durchsuchen
    • Erfolgreich ausgeführt!

    cifar10Dataset-master

Supongo que te gusta

Origin blog.csdn.net/p609354432/article/details/118312563
Recomendado
Clasificación