File size: 2,811 Bytes
1cf3825
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import tensorflow as tf
from pathlib import Path


def build_dataset(

    directory,

    image_size=(224, 224),

    batch_size=32,

    validation_split=None,

    subset=None,

    seed=123,

    shuffle=True,

):
    return tf.keras.preprocessing.image_dataset_from_directory(
        directory,
        labels='inferred',
        label_mode='int',
        batch_size=batch_size,
        image_size=image_size,
        shuffle=shuffle,
        validation_split=validation_split,
        subset=subset,
        seed=seed,
    )


def get_datasets(

    root_dir,

    image_size=(224, 224),

    batch_size=32,

    validation_split=0.15,

    seed=123,

):
    root = Path(root_dir)
    train_dir = root / 'train'
    val_dir = root / 'val'
    test_dir = root / 'test'

    if not root.exists():
        raise FileNotFoundError(f'Dataset root directory not found: {root_dir}')

    if val_dir.exists() and test_dir.exists():
        train_ds = build_dataset(train_dir, image_size=image_size, batch_size=batch_size, shuffle=True)
        val_ds = build_dataset(val_dir, image_size=image_size, batch_size=batch_size, shuffle=False)
        test_ds = build_dataset(test_dir, image_size=image_size, batch_size=batch_size, shuffle=False)
    elif train_dir.exists():
        train_ds = build_dataset(
            train_dir,
            image_size=image_size,
            batch_size=batch_size,
            validation_split=validation_split,
            subset='training',
            seed=seed,
        )
        val_ds = build_dataset(
            train_dir,
            image_size=image_size,
            batch_size=batch_size,
            validation_split=validation_split,
            subset='validation',
            seed=seed,
            shuffle=False,
        )
        test_ds = None
    else:
        raise FileNotFoundError(
            'Could not find expected train/val/test directories. Create `dataset/train` and optionally `dataset/val` and `dataset/test`.'
        )

    return train_ds, val_ds, test_ds


def get_augmentation_layer(image_size=(224, 224)):
    return tf.keras.Sequential(
        [
            tf.keras.layers.RandomFlip('horizontal'),
            tf.keras.layers.RandomRotation(0.12),
            tf.keras.layers.RandomZoom(0.15),
            tf.keras.layers.RandomContrast(0.1),
            tf.keras.layers.Rescaling(1.0 / 255),
            tf.keras.layers.Resizing(image_size[0], image_size[1]),
        ],
        name='data_augmentation',
    )


def prepare_dataset(dataset, cache=True, prefetch=True):
    if dataset is None:
        return None
    ds = dataset
    if cache:
        ds = ds.cache()
    if prefetch:
        ds = ds.prefetch(buffer_size=tf.data.AUTOTUNE)
    return ds