-
Notifications
You must be signed in to change notification settings - Fork 12
/
scratch_tensorflow.py
118 lines (88 loc) · 3.46 KB
/
scratch_tensorflow.py
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# --------------------- not used anywhere yet ---------------------
# https://github.com/keras-team/keras/issues/3059
# https://keras.io/preprocessing/image/
# data_gen_args = dict(
# featurewise_center=True,
# featurewise_std_normalization=True,
# rotation_range=90.0,
# width_shift_range=0.1,
# height_shift_range=0.1,
# zoom_range=0.2,
# )
# image_datagen = ImageDataGenerator(**data_gen_args)
# mask_datagen = ImageDataGenerator(**data_gen_args)
# # Provide the same seed and keyword arguments to the fit and flow methods
# seed = 1
# image_datagen.fit(images, augment=True, seed=seed)
# mask_datagen.fit(masks, augment=True, seed=seed)
# image_generator = image_datagen.flow_from_directory(
# "data/images", class_mode=None, seed=seed
# )
# mask_generator = mask_datagen.flow_from_directory(
# "data/masks", class_mode=None, seed=seed
# )
# # combine generators into one which yields image and masks
# train_generator = zip(image_generator, mask_generator)
# model.fit_generator(train_generator, steps_per_epoch=2000, epochs=50)
data_gen_args = dict(width_shift_range=0.2, height_shift_range=0.2)
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)
seed = 1
image_generator = image_datagen.flow_from_directory(
"raw/train_image",
target_size=(img_rows, img_cols),
class_mode=None,
seed=seed,
batch_size=batchsize,
color_mode="grayscale",
)
mask_generator = mask_datagen.flow_from_directory(
"raw/train_mask",
target_size=(img_rows, img_cols),
class_mode=None,
seed=seed,
batch_size=batchsize,
color_mode="grayscale",
)
train_generator = zip(image_generator, mask_generator)
model.fit_generator(
train_generator, steps_per_epoch=5635 / batchsize, epochs=100, verbose=1
)
# --------------------- other idea ------------------
# https://keras.io/preprocessing/image/
def augmentationForTrainImageAndMask(imgs, masks):
data_gen_args = dict(
rotation_range=40.0,
width_shift_range=0.1,
height_shift_range=0.1,
zoom_range=0.2,
horizontal_flip=True,
fill_mode="nearest",
)
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)
seed = 1
image_datagen.fit(imgs, augment=True, seed=seed)
mask_datagen.fit(masks, augment=True, seed=seed)
image_generator = image_datagen.flow(
imgs, seed=seed, batch_size=batch_size, shuffle=False
)
mask_generator = mask_datagen.flow(
masks, seed=seed, batch_size=batch_size, shuffle=False
)
return zip(image_generator, mask_generator)
# ------------------- a thread safe / parallelisable solution ------------------
from keras.utils import Sequence
class MergedGenerators(Sequence):
def __init__(self, *generators):
self.generators = generators
# TODO add a check to verify that all generators have the same length
def __len__(self):
return len(self.generators[0])
def __getitem__(self, index):
return [generator[index] for generator in self.generators]
train_generator = MergedGenerators(image_generator, mask_generator)
# --------------------- using FLOW ----------------------
# https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html
# -------------------- custom Keras Sequence class for masks ----------------------
# https://towardsdatascience.com/keras-data-generators-and-how-to-use-them-b69129ed779c