Saját adathalmaz használata CNN-hez

A Tensorflow oldalán lévő tutorialokban általában MNIST datasetet töltenek be a neurális háló tanítására és validálására. A képek előkészítését pythonban végzem.

Erre egy példa:

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

Tehát a load_data() függvény feltölti a train_images, train_labels, test_images és test_labels változókat, melyek numpy arrayként fogják tárolni az adatokat.
Ehhez hasonlóan megírható egy saját load_data() függvény, ha saját adathalmazt szeretnénk használni.

Az adathalmazom 256×256-os színes képekből áll.
Szükség lesz az adathalmaz elérési útvonalára, majd a képeket tartalmazó mappát be kell járni, a fájlokon esetleges módosításokat végezni és eltárolni azokat.
A képek például sources mappán belüli train és val mappákban szerepelnek elkülönítve. A használathoz szükségünk van az elérési útvonalra:

train_dir = os.path.dirname(os.path.realpath('__file__'))+r'\sources\train'

Hasonlóan a validációs adatok mappája is eltárolandó a ‘train’ szót kicserélve ‘val’-ra.
Az útvonal ismeretében bejárható a mappa, ehhez egy segédmetódust fogok használni.

  • A directory elérési útvonalú mappát járom be (ez nálam a train vagy a val), ezen belül szerepelnek kategóriánként a képek, ezeket a kategórianeveket mentem el labelként.
  • Az inner_dir a kategória mappa neve, ebből csinálok elérési útvonalat.
  • A kategória mappákban lévő képek beolvasása scipy lib haszálatával. Esetleges módosítások.
  • Adatok numpy array-jé alakítása
  • Visszatérés (data, labels) formában.
def load_data_by_dir(directory):
    for inner_dir in os.listdir(directory):
        category = directory+'\\'+os.fsdecode(inner_dir)
        for file_name in os.listdir(category):
            img = misc.imread(category+'\\'+file_name)
            data.append(img)
            labels.append(inner_dir)
        data = np.asarray(data)
        labels = np.asarray(labels)
    return (data, labels)

A saját load_data függvényünkben meghívjuk ezt a segéd függvényt kétszer, paraméterben egyszer a train_dir-t, egyszer pedig a val_dir-t átadva. A segédfüggvények értékével pedig visszatérünk (train_images, train_labels), (test_images, test_labels) formában.

Felmerülő problémák:

  • Fekete fehér kép keveredik a színesek közé, ennek más lesz az alakja is.
 if img.shape != (256, 256, 3): img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
  • Lebegőpontos számábrázolásban kell tárolni a képeket egész számok helyett.
 img = np.float32(img)
  • Képek értékeit normalizálni kell.
 img = cv2.normalize(img, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
  • Képek átméretezése. Itt felére.
 img = misc.imresize(img, 0.5)
  • A labeleknek is számoknak kell lenniük!

 

Leave a Reply