Skip to content
This repository was archived by the owner on Mar 22, 2021. It is now read-only.

Commit f3784b3

Browse files
authored
Dev (#13)
* Result exploration (#11) * fixed oof saving and plotting * fixed exploration notebook * Augmentations (#12) * dropped redundant loaders, updated augmentations, fixed edge option, updated notebook * exp * updated augs, updated prediction saving
1 parent 2756003 commit f3784b3

File tree

7 files changed

+335
-195
lines changed

7 files changed

+335
-195
lines changed

augmentations.ipynb

+49-10
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,13 @@
88
"source": [
99
"%matplotlib inline\n",
1010
"\n",
11-
"import sys\n",
12-
"sys.path.append('../')\n",
13-
"\n",
1411
"import numpy as np\n",
1512
"import glob\n",
1613
"from PIL import Image\n",
1714
"import matplotlib.pyplot as plt\n",
1815
"\n",
19-
"from src.augmentation import iaa\n",
20-
"from src.utils import plot_list"
16+
"from common_blocks.augmentation import iaa, PadFixed, RandomCropFixedSize\n",
17+
"from common_blocks.utils import plot_list"
2118
]
2219
},
2320
{
@@ -27,9 +24,11 @@
2724
"outputs": [],
2825
"source": [
2926
"IMG_DIR = 'YOUR/DIR'\n",
30-
"IMG_IDX = 18\n",
27+
"IMG_DIR = '/mnt/ml-team/minerva/open-solutions/salt/data/train/images'\n",
28+
"\n",
29+
"IMG_IDX = 592\n",
3130
"img_filepath = sorted(glob.glob('{}/*'.format(IMG_DIR)))[IMG_IDX]\n",
32-
"img = np.array(Image.open(img_filepath))\n",
31+
"img = np.array(Image.open(img_filepath)).astype(np.uint8)\n",
3332
"plt.imshow(img)"
3433
]
3534
},
@@ -50,13 +49,14 @@
5049
"# General\n",
5150
" iaa.SomeOf((1, 2),\n",
5251
" [iaa.Fliplr(0.5),\n",
53-
" iaa.Affine(rotate=(-10, 10),\n",
54-
" translate_percent={\"x\": (-0.25, 0.25)}, mode='symmetric'),\n",
52+
" iaa.Affine(rotate=(-10, 10), \n",
53+
" translate_percent={\"x\": (-0.05, 0.05)},\n",
54+
" mode='edge'), \n",
5555
" ]),\n",
5656
"# Deformations\n",
5757
" iaa.Sometimes(0.3, iaa.PiecewiseAffine(scale=(0.04, 0.08))),\n",
5858
" iaa.Sometimes(0.3, iaa.PerspectiveTransform(scale=(0.05, 0.1))),\n",
59-
"], random_order=True)\n"
59+
"], random_order=True)"
6060
]
6161
},
6262
{
@@ -122,6 +122,45 @@
122122
"plot_list(images=aug_imgs)"
123123
]
124124
},
125+
{
126+
"cell_type": "markdown",
127+
"metadata": {},
128+
"source": [
129+
"# Resize+Pad+Augmentations\n",
130+
"proposed by Heng CherKeng"
131+
]
132+
},
133+
{
134+
"cell_type": "code",
135+
"execution_count": null,
136+
"metadata": {},
137+
"outputs": [],
138+
"source": [
139+
"def resize_pad_seq(resize_target_size, pad_method, pad_size):\n",
140+
" seq = iaa.Sequential([\n",
141+
" affine_seq,\n",
142+
" iaa.Scale({'height': resize_target_size, 'width': resize_target_size}),\n",
143+
" PadFixed(pad=(pad_size, pad_size), pad_method=pad_method),\n",
144+
" ], random_order=False)\n",
145+
" return seq\n",
146+
"\n",
147+
"heng_seq = resize_pad_seq(101,'edge',13)"
148+
]
149+
},
150+
{
151+
"cell_type": "code",
152+
"execution_count": null,
153+
"metadata": {},
154+
"outputs": [],
155+
"source": [
156+
"AUG_NR = 6\n",
157+
"aug_imgs = []\n",
158+
"for _ in range(AUG_NR):\n",
159+
" aug_img = heng_seq.augment_image(img)\n",
160+
" aug_imgs.append(aug_img)\n",
161+
"plot_list(images=aug_imgs)"
162+
]
163+
},
125164
{
126165
"cell_type": "code",
127166
"execution_count": null,

common_blocks/augmentation.py

+21-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import imgaug as ia
44
from imgaug import augmenters as iaa
55

6-
from .utils import get_crop_pad_sequence, reseed
6+
from common_blocks.utils import get_crop_pad_sequence, reseed
77

88

99
def _perspective_transform_augment_images(self, images, random_state, parents, hooks):
@@ -36,7 +36,9 @@ def _perspective_transform_augment_images(self, images, random_state, parents, h
3636
iaa.SomeOf((1, 2),
3737
[iaa.Fliplr(0.5),
3838
iaa.Affine(rotate=(-10, 10),
39-
translate_percent={"x": (-0.25, 0.25)}, mode='symmetric'),
39+
translate_percent={"x": (-0.05, 0.05)},
40+
mode='edge'),
41+
# iaa.CropAndPad(percent=((0.0, 0.0), (0.05, 0.0), (0.0, 0.0), (0.05, 0.0)))
4042
]),
4143
# Deformations
4244
iaa.Sometimes(0.3, iaa.PiecewiseAffine(scale=(0.04, 0.08))),
@@ -69,22 +71,36 @@ def _perspective_transform_augment_images(self, images, random_state, parents, h
6971
], random_order=False)
7072

7173

74+
def resize_seq(resize_target_size):
75+
seq = iaa.Sequential([
76+
affine_seq,
77+
iaa.Scale({'height': resize_target_size, 'width': resize_target_size}),
78+
], random_order=False)
79+
return seq
80+
81+
7282
def resize_pad_seq(resize_target_size, pad_method, pad_size):
7383
seq = iaa.Sequential([
84+
affine_seq,
7485
iaa.Scale({'height': resize_target_size, 'width': resize_target_size}),
7586
PadFixed(pad=(pad_size, pad_size), pad_method=pad_method),
76-
affine_seq,
7787
], random_order=False)
7888
return seq
7989

8090

91+
def resize_to_fit_net(resize_target_size):
92+
seq = iaa.Sequential(iaa.Scale({'height': resize_target_size, 'width': resize_target_size}))
93+
return seq
94+
95+
8196
def pad_to_fit_net(divisor, pad_mode, rest_of_augs=iaa.Noop()):
82-
return iaa.Sequential(InferencePad(divisor, pad_mode), rest_of_augs)
97+
seq = iaa.Sequential(InferencePad(divisor, pad_mode), rest_of_augs)
98+
return seq
8399

84100

85101
class PadFixed(iaa.Augmenter):
86102
PAD_FUNCTION = {'reflect': cv2.BORDER_REFLECT_101,
87-
'replicate': cv2.BORDER_REPLICATE,
103+
'edge': cv2.BORDER_REPLICATE,
88104
}
89105

90106
def __init__(self, pad=None, pad_method=None, name=None, deterministic=False, random_state=None):

common_blocks/loaders.py

+6-50
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ def get_datagen(self, X, tta_params, loader_params):
329329
return datagen, steps
330330

331331

332-
class ImageSegmentationLoaderResizePad(ImageSegmentationLoaderBasic):
332+
class ImageSegmentationLoader(ImageSegmentationLoaderBasic):
333333
def __init__(self, train_mode, loader_params, dataset_params, augmentation_params):
334334
super().__init__(train_mode, loader_params, dataset_params, augmentation_params)
335335

@@ -345,7 +345,8 @@ def __init__(self, train_mode, loader_params, dataset_params, augmentation_param
345345
self.image_augment_train = ImgAug(self.augmentation_params['image_augment_train'])
346346
self.image_augment_with_target_train = ImgAug(self.augmentation_params['image_augment_with_target_train'])
347347
self.image_augment_inference = ImgAug(self.augmentation_params['image_augment_inference'])
348-
self.image_augment_with_target_inference = ImgAug(self.augmentation_params['image_augment_with_target_inference'])
348+
self.image_augment_with_target_inference = ImgAug(
349+
self.augmentation_params['image_augment_with_target_inference'])
349350

350351
if self.dataset_params.target_format == 'png':
351352
self.dataset = ImageSegmentationPngDataset
@@ -355,7 +356,7 @@ def __init__(self, train_mode, loader_params, dataset_params, augmentation_param
355356
raise Exception('files must be png or json')
356357

357358

358-
class ImageSegmentationLoaderPadTTA(ImageSegmentationLoaderBasicTTA):
359+
class ImageSegmentationLoaderTTA(ImageSegmentationLoaderBasicTTA):
359360
def __init__(self, loader_params, dataset_params, augmentation_params):
360361
super().__init__(loader_params, dataset_params, augmentation_params)
361362

@@ -369,53 +370,8 @@ def __init__(self, loader_params, dataset_params, augmentation_params):
369370
])
370371

371372
self.image_augment_inference = ImgAug(self.augmentation_params['image_augment_inference'])
372-
self.image_augment_with_target_inference = ImgAug(self.augmentation_params['image_augment_with_target_inference'])
373-
self.dataset = ImageSegmentationTTADataset
374-
375-
376-
class ImageSegmentationLoaderResize(ImageSegmentationLoaderBasic):
377-
def __init__(self, train_mode, loader_params, dataset_params, augmentation_params):
378-
super().__init__(train_mode, loader_params, dataset_params, augmentation_params)
379-
380-
self.image_transform = transforms.Compose([transforms.Resize((self.dataset_params.h, self.dataset_params.w)),
381-
transforms.Grayscale(num_output_channels=3),
382-
transforms.ToTensor(),
383-
transforms.Normalize(mean=self.dataset_params.MEAN,
384-
std=self.dataset_params.STD),
385-
])
386-
self.mask_transform = transforms.Compose([transforms.Resize((self.dataset_params.h, self.dataset_params.w),
387-
interpolation=0),
388-
transforms.Lambda(to_array),
389-
transforms.Lambda(to_tensor),
390-
])
391-
392-
self.image_augment_train = ImgAug(self.augmentation_params['image_augment_train'])
393-
self.image_augment_with_target_train = ImgAug(self.augmentation_params['image_augment_with_target_train'])
394-
395-
if self.dataset_params.target_format == 'png':
396-
self.dataset = ImageSegmentationPngDataset
397-
elif self.dataset_params.target_format == 'json':
398-
self.dataset = ImageSegmentationJsonDataset
399-
else:
400-
raise Exception('files must be png or json')
401-
402-
403-
class ImageSegmentationLoaderResizeTTA(ImageSegmentationLoaderBasicTTA):
404-
def __init__(self, loader_params, dataset_params, augmentation_params):
405-
super().__init__(loader_params, dataset_params, augmentation_params)
406-
407-
self.image_transform = transforms.Compose([transforms.Resize((self.dataset_params.h, self.dataset_params.w)),
408-
transforms.Grayscale(num_output_channels=3),
409-
transforms.ToTensor(),
410-
transforms.Normalize(mean=self.dataset_params.MEAN,
411-
std=self.dataset_params.STD),
412-
])
413-
self.mask_transform = transforms.Compose([transforms.Resize((self.dataset_params.h, self.dataset_params.w),
414-
interpolation=0),
415-
transforms.Lambda(to_array),
416-
transforms.Lambda(to_tensor),
417-
])
418-
373+
self.image_augment_with_target_inference = ImgAug(
374+
self.augmentation_params['image_augment_with_target_inference'])
419375
self.dataset = ImageSegmentationTTADataset
420376

421377

common_blocks/models.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
'init_weights': False},
2626
'ResNet152': {'model': UNetResNet,
2727
'model_config': {'encoder_depth': 152,
28-
'num_filters': 32, 'dropout_2d': 0.2,
29-
'pretrained': True, 'is_deconv': False,
28+
'num_filters': 32, 'dropout_2d': 0.0,
29+
'pretrained': True, 'is_deconv': True,
3030
},
3131
'init_weights': False},
3232
'SaltLinkNet': {'model': SaltLinkNet,

common_blocks/pipelines.py

+7-29
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44
from steppy.adapter import Adapter, E
55

66
from . import loaders
7-
from .utils import make_apply_transformer, FineTuneStep
8-
from .postprocessing import crop_image, resize_image, binarize
7+
from .utils import make_apply_transformer
8+
from .postprocessing import binarize
99

1010

1111
def preprocessing_train(config, model_name='unet', suffix=''):
1212
if config.general.loader_mode == 'resize_and_pad':
13-
Loader = loaders.ImageSegmentationLoaderResizePad
1413
loader_config = config.loaders.resize_and_pad
1514
elif config.general.loader_mode == 'resize':
16-
Loader = loaders.ImageSegmentationLoaderResize
1715
loader_config = config.loaders.resize
1816
else:
1917
raise NotImplementedError
@@ -47,7 +45,7 @@ def preprocessing_train(config, model_name='unet', suffix=''):
4745
raise NotImplementedError
4846

4947
loader = Step(name='loader{}'.format(suffix),
50-
transformer=Loader(train_mode=True, **loader_config),
48+
transformer=loaders.ImageSegmentationLoader(train_mode=True, **loader_config),
5149
input_steps=[reader_train, reader_inference],
5250
adapter=Adapter({'X': E(reader_train.name, 'X'),
5351
'y': E(reader_train.name, 'y'),
@@ -60,10 +58,8 @@ def preprocessing_train(config, model_name='unet', suffix=''):
6058

6159
def preprocessing_inference(config, model_name='unet', suffix=''):
6260
if config.general.loader_mode == 'resize_and_pad':
63-
Loader = loaders.ImageSegmentationLoaderResizePad
6461
loader_config = config.loaders.resize_and_pad
6562
elif config.general.loader_mode == 'resize':
66-
Loader = loaders.ImageSegmentationLoaderResize
6763
loader_config = config.loaders.resize
6864
else:
6965
raise NotImplementedError
@@ -86,7 +82,7 @@ def preprocessing_inference(config, model_name='unet', suffix=''):
8682
raise NotImplementedError
8783

8884
loader = Step(name='loader{}'.format(suffix),
89-
transformer=Loader(train_mode=False, **loader_config),
85+
transformer=loaders.ImageSegmentationLoader(train_mode=False, **loader_config),
9086
input_steps=[reader_inference],
9187
adapter=Adapter({'X': E(reader_inference.name, 'X'),
9288
'y': E(reader_inference.name, 'y'),
@@ -98,10 +94,8 @@ def preprocessing_inference(config, model_name='unet', suffix=''):
9894

9995
def preprocessing_inference_tta(config, model_name='unet', suffix=''):
10096
if config.general.loader_mode == 'resize_and_pad':
101-
Loader = loaders.ImageSegmentationLoaderPadTTA
10297
loader_config = config.loaders.pad_tta
10398
elif config.general.loader_mode == 'resize':
104-
Loader = loaders.ImageSegmentationLoaderResizeTTA
10599
loader_config = config.loaders.resize_tta
106100
else:
107101
raise NotImplementedError
@@ -135,7 +129,7 @@ def preprocessing_inference_tta(config, model_name='unet', suffix=''):
135129
raise NotImplementedError
136130

137131
loader = Step(name='loader{}'.format(suffix),
138-
transformer=Loader(**loader_config),
132+
transformer=loaders.ImageSegmentationLoaderTTA(**loader_config),
139133
input_steps=[tta_generator],
140134
adapter=Adapter({'X': E(tta_generator.name, 'X_tta'),
141135
'tta_params': E(tta_generator.name, 'tta_params'),
@@ -158,28 +152,12 @@ def aggregator(name, model, tta_generator, experiment_directory, config):
158152

159153

160154
def mask_postprocessing(config, suffix=''):
161-
if config.general.loader_mode == 'resize_and_pad':
162-
size_adjustment_function = partial(crop_image, target_size=config.general.original_size)
163-
elif config.general.loader_mode == 'resize':
164-
size_adjustment_function = partial(resize_image, target_size=config.general.original_size)
165-
else:
166-
raise NotImplementedError
167-
168-
mask_resize = Step(name='mask_resize{}'.format(suffix),
169-
transformer=make_apply_transformer(size_adjustment_function,
170-
output_name='resized_images',
171-
apply_on=['images']),
172-
input_data=['input_masks'],
173-
adapter=Adapter({'images': E('input_masks', 'mask_prediction'),
174-
}),
175-
experiment_directory=config.execution.experiment_dir)
176-
177155
binarizer = Step(name='binarizer{}'.format(suffix),
178156
transformer=make_apply_transformer(partial(binarize, threshold=config.thresholder.threshold_masks),
179157
output_name='binarized_images',
180158
apply_on=['images']),
181-
input_steps=[mask_resize],
182-
adapter=Adapter({'images': E(mask_resize.name, 'resized_images'),
159+
input_data=['input_masks'],
160+
adapter=Adapter({'images': E('input_masks', 'resized_images'),
183161
}),
184162
experiment_directory=config.execution.experiment_dir)
185163
return binarizer

0 commit comments

Comments
 (0)