Пример #1
0
import albumentations as A
from albumentations.pytorch import ToTensorV2

import timm

import warnings 
warnings.filterwarnings('ignore')

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

#Transform for efficientnet
transforms_valid = albumentations.Compose([
    albumentations.CenterCrop(image_size, image_size, p=1),
    albumentations.Resize(image_size, image_size),
    albumentations.Normalize()
])


# ====================================================
# Directory settings for Resnext
# ====================================================
import os

OUTPUT_DIR = '.\\'
MODEL_DIR = '.\\cassava-models-res\\'
if not os.path.exists(OUTPUT_DIR):
    os.makedirs(OUTPUT_DIR)
    
TRAIN_PATH = '.\\train_images'
TEST_PATH = '.\\test_images'
train_transforms = A.Compose([
    A.RandomResizedCrop(train_img_size,
                        train_img_size,
                        scale=(0.7, 1.0),
                        ratio=(0.9, 1.1)),
    A.OneOf([
        A.RandomRotate90(),
        A.Flip(),
        A.ShiftScaleRotate(shift_limit=0.0625,
                           scale_limit=0.0,
                           rotate_limit=45,
                           interpolation=1)
    ]),
    A.CoarseDropout(max_holes=4, max_height=64, max_width=64),
    A.Normalize(mean=mean, std=std, max_pixel_value=max_value),
    ToTensorV2()
])

val_transforms = A.Compose(
    [A.Normalize(mean=mean, std=std, max_pixel_value=max_value),
     ToTensorV2()])

train_loader, val_loader, train_eval_loader = get_train_val_loaders(
    train_ds,
    val_ds,
    train_transforms=train_transforms,
    val_transforms=val_transforms,
    batch_size=batch_size,
    num_workers=num_workers,
    val_batch_size=val_batch_size,
Пример #3
0
 def get_transforms(self):
     return A.Normalize()
exp_suffix = '_1in20_0005b'

SIZE = 512

# Load dataset info
path_to_train = 'Christof/assets/train_rgb_512/'
data = pd.read_csv('Christof/assets/train.csv')

normal_aug = A.Compose([
    A.Rotate((0, 30), p=0.75),
    A.RandomRotate90(p=1),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightness(0.05),
    A.RandomContrast(0.05),
    A.Normalize(mean=(0.08069, 0.05258, 0.05487),
                std=(0.1300, 0.0879, 0.1386),
                max_pixel_value=255.)
])

val_aug = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.Normalize(mean=(0.08069, 0.05258, 0.05487),
                std=(0.1300, 0.0879, 0.1386),
                max_pixel_value=255.)
])

train_dataset_info = []
for name, labels in zip(data['Id'], data['Target'].str.split(' ')):
    train_dataset_info.append({
        'path':
        os.path.join(path_to_train, name),
Пример #5
0
  def __init__(self, config, split):
    """

    :param opt:
    :param split: train/val
    """
    super(DATASET_CUSTOM, self).__init__()
    self.data_dir = config['dataset']['data_dir']
    self.img_dir = os.path.join(self.data_dir, 'images')
    self.input_h = config['model']['input_h']
    self.input_w = config['model']['input_h']
    self.pad = config['model']['pad']
    self.down_ratio = config['model']['down_ratio']
    self.mean = config['dataset']['mean']
    self.std = config['dataset']['std']
    self.max_objs = config['dataset']['max_object']
    self.num_classes = config['dataset']['num_classes']
    self.radius = config['dataset']['radius']

    self.annot_path = os.path.join(
          self.data_dir, 'annotations',
          '{}.json').format(split)
    # print(self.data_dir)

    self.class_name = ['__background__'] + config['dataset']['label_name']
    self._valid_ids = [_id for _id in range(1, self.num_classes+1)]    # [1,2,..self.num_classes]
    self.cat_ids = {v: i for i, v in enumerate(self._valid_ids)}        # {1:0,

    self.split = split

    print('==> initializing {} data.'.format(split))
    self.coco = coco.COCO(self.annot_path)
    self.images = self.coco.getImgIds()
    self.num_samples = len(self.images)

    print('Loaded {} {} samples'.format(split, self.num_samples))

    self.output_h = self.input_h // self.down_ratio  # 512/4 = 128
    self.output_w = self.input_w // self.down_ratio

    self.transform_train = A.Compose(
                                [
                                    A.OneOf([
                                            A.RandomBrightnessContrast(brightness_limit=0.5,
                                                                          contrast_limit=0.4),
                                            A.RandomGamma(gamma_limit=(50, 150)),
                                            A.NoOp()
                                        ]),
                                    A.OneOf([
                                            A.RGBShift(r_shift_limit=20, b_shift_limit=15,
                                                          g_shift_limit=15),
                                            A.HueSaturationValue(hue_shift_limit=5,
                                                                    sat_shift_limit=5),
                                            A.NoOp()
                                        ]),
                                    A.HorizontalFlip(p=0.5),    #OK
                                    A.ShiftScaleRotate(shift_limit=[0.1, 0.1], scale_limit=[0,0], rotate_limit=[-45, 45], p=0.5, border_mode=cv2.BORDER_CONSTANT, value=(255,255,255)),    #OK
                                    A.Downscale(scale_min=0.1, scale_max=0.2, p=0.3),      # OK
                                    # A.CoarseDropout(max_holes=5, max_height=100, max_width=100, min_holes=3, min_height=64, min_width=64, p=0.5),   # error
                                    A.CLAHE(p=0.5),
                                    A.Resize(height=self.input_h, width=self.input_w, interpolation=cv2.INTER_LINEAR, always_apply=True),
                                    A.Normalize(mean=self.mean, std=self.std, always_apply=True)
                                ],
                                keypoint_params=A.KeypointParams(format='xy', label_fields=['class_labels'])
    )

    self.transform_heatmap = A.Compose(
                                [
                                    A.Resize(height=self.output_h, width=self.output_w, interpolation=cv2.INTER_LINEAR, always_apply=True)
                                ]
                                , keypoint_params=A.KeypointParams(format='xy')
    )

    self.transform_test = A.Compose(
                                [
                                    A.Resize(height=self.input_h, width=self.input_w, interpolation=cv2.INTER_LINEAR, always_apply=True),
                                    A.Normalize(mean=self.mean, std=self.std, always_apply=True)
                                ],
                                keypoint_params=A.KeypointParams(format='xy')
    )
Пример #6
0
def get_transforms(*, data):
    if data == 'train':
        import albumentations
        return Compose([
            albumentations.RandomResizedCrop(CFG.size,
                                             CFG.size,
                                             scale=(0.9, 1),
                                             p=1),
            albumentations.HorizontalFlip(p=0.5),
            albumentations.ShiftScaleRotate(p=0.5),
            albumentations.HueSaturationValue(hue_shift_limit=10,
                                              sat_shift_limit=10,
                                              val_shift_limit=10,
                                              p=0.7),
            albumentations.RandomBrightnessContrast(brightness_limit=(-0.2,
                                                                      0.2),
                                                    contrast_limit=(-0.2, 0.2),
                                                    p=0.7),
            albumentations.CLAHE(clip_limit=(1, 4), p=0.5),
            albumentations.OneOf([
                albumentations.OpticalDistortion(distort_limit=1.0),
                albumentations.GridDistortion(num_steps=5, distort_limit=1.),
                albumentations.ElasticTransform(alpha=3),
            ],
                                 p=0.2),
            albumentations.OneOf([
                albumentations.GaussNoise(var_limit=[10, 50]),
                albumentations.GaussianBlur(),
                albumentations.MotionBlur(),
                albumentations.MedianBlur(),
            ],
                                 p=0.2),
            albumentations.Resize(CFG.size, CFG.size),
            albumentations.OneOf([
                albumentations.JpegCompression(),
                albumentations.Downscale(scale_min=0.1, scale_max=0.15),
            ],
                                 p=0.2),
            albumentations.IAAPiecewiseAffine(p=0.2),
            albumentations.IAASharpen(p=0.2),
            albumentations.Cutout(max_h_size=int(CFG.size * 0.1),
                                  max_w_size=int(CFG.size * 0.1),
                                  num_holes=5,
                                  p=0.5),
            albumentations.Normalize(),
            ToTensorV2()
        ])

    # if data == 'train':
    #     return Compose([
    #         # Resize(int(CFG.size * 1.25), int(CFG.size * 1.25)),
    #         #Resize(CFG.size, CFG.size),
    #         RandomResizedCrop(CFG.size, CFG.size, scale=(0.85, 1.0)),
    #         # HorizontalFlip(p=0.5),
    #         # RandomBrightnessContrast(p=0.2, brightness_limit=(-0.2, 0.2), contrast_limit=(-0.2, 0.2)),
    #         # HueSaturationValue(p=0.2),
    #         ShiftScaleRotate(p=0.2, shift_limit=0.0625, scale_limit=0.2, rotate_limit=20),
    #         # # CoarseDropout(p=0.2), # max_holes=8, max_height=8, max_width=8
    #         # Cutout(p=0.2, max_h_size=16, max_w_size=16, fill_value=(0., 0., 0.), num_holes=16),
    #         Normalize(
    #             mean=[0.485, 0.456, 0.406],
    #             std=[0.229, 0.224, 0.225],
    #         ),
    #         ToTensorV2(),
    #     ])

    elif data == 'valid':
        return Compose([
            Resize(CFG.size, CFG.size),
            Normalize(
                mean=[0.485, 0.456, 0.406],
                std=[0.229, 0.224, 0.225],
            ),
            ToTensorV2(),
        ])
Пример #7
0
def make_transform(args):
    base_transform = [
        A.Resize(args.img_size, args.img_size),
        A.Normalize(
            mean=[0.485, 0.456, 0.406],
            std=[0.229, 0.224, 0.225],
        ),
        ToTensorV2()
    ]

    train_transform = []
    if args.Blur:
        train_transform.append(A.Blur(p=args.Blur))
    if args.Blur:
        train_transform.append(A.ElasticTransform(p=args.Blur))

    if args.CLAHE:
        train_transform.append(
            A.CLAHE(clip_limit=(1, 4), tile_grid_size=(8, 8), p=args.CLAHE))
    if args.RandomBrightnessContrast:
        train_transform.append(
            A.RandomBrightnessContrast(brightness_limit=0.2,
                                       contrast_limit=0.2,
                                       brightness_by_max=True,
                                       p=args.RandomBrightnessContrast))
    if args.HueSaturationValue:
        train_transform.append(
            A.HueSaturationValue(hue_shift_limit=20,
                                 sat_shift_limit=30,
                                 val_shift_limit=20,
                                 p=args.HueSaturationValue))
    if args.RGBShift:
        train_transform.append(
            A.RGBShift(r_shift_limit=20,
                       g_shift_limit=20,
                       b_shift_limit=20,
                       p=args.RGBShift))
    if args.RandomGamma:
        train_transform.append(
            A.RandomGamma(gamma_limit=(80, 120), p=args.RandomGamma))
    if args.HorizontalFlip:
        train_transform.append(A.HorizontalFlip(p=args.HorizontalFlip))

    if args.VerticalFlip:
        train_transform.append(A.VerticalFlip(p=args.VerticalFlip))

    if args.ShiftScaleRotate:
        train_transform.append(
            A.ShiftScaleRotate(shift_limit=0.2,
                               scale_limit=0.2,
                               rotate_limit=10,
                               border_mode=args.ShiftScaleRotateMode,
                               p=args.ShiftScaleRotate))
    if args.GridDistortion:
        train_transform.append(
            A.GridDistortion(num_steps=5,
                             distort_limit=(-0.3, 0.3),
                             p=args.GridDistortion))
    if args.MotionBlur:
        train_transform.append(
            A.MotionBlur(blur_limit=(3, 7), p=args.MotionBlur))
    if args.RandomResizedCrop:
        train_transform.append(
            A.RandomResizedCrop(height=args.img_size,
                                width=args.img_size,
                                scale=(-0.4, 1.0),
                                ratio=(0.75, 1.3333333333333333),
                                p=args.RandomResizedCrop))
    if args.ImageCompression:
        train_transform.append(
            A.ImageCompression(quality_lower=99,
                               quality_upper=100,
                               p=args.ImageCompression))
    train_transform.extend(base_transform)

    train_transform = A.Compose(train_transform)
    test_transform = A.Compose(base_transform)

    return train_transform, test_transform
Пример #8
0
            Image.open(
                os.path.join(CONFIG.INPUT_PATH, 'masks',
                             self.image_name[idx] + extention)))
        image = self.image_transforms(image=image)['image']
        mask = self.mask_transforms(image=mask)['image']
        mask = mask.unsqueeze(0)
        return {'original_image': image, 'mask': mask}


if __name__ == "__main__":
    path = CONFIG.INPUT_PATH
    x_ray_image_names = os.listdir(path + '/CXR_png/')
    images_name = []
    for name in x_ray_image_names:
        images_name.append(name.split('.')[0])

    image_transforms = alb.Compose([
        alb.Normalize(CONFIG.mean, CONFIG.std, always_apply=True),
        alb.Resize(572, 572, always_apply=True),
        alb.pytorch.ToTensor()
    ])
    segmented_transforms = alb.Compose(
        [alb.Resize(388, 388, always_apply=True),
         ToTensor()])
    dataloder = DataLoader(images_name, image_transforms, segmented_transforms)
    for data in dataloder:
        a = data['original_image']
        b = data['mask']
        print(a.shape, b.shape)
        break
Пример #9
0
if __name__ == '__main__':
    import pandas as pd
    import os
    
    import torch
    from torch.utils.data import DataLoader

    from constants import SHUFFLE_DATASET, VALIDATION_SPLIT, IDX2LABELS, IMAGE_SIZE_SMALL

    import albumentations

    df_train = pd.read_csv(os.path.join('data', 'train.csv'))
    print(df_train.head())

    transforms = albumentations.Compose([
        albumentations.Normalize(mean=(0.5, 0.5, 0.5),
        std=(0.5, 0.5, 0.5)),
        albumentations.GridDistortion(p=0.2),
        albumentations.HorizontalFlip(p=0.2),
        albumentations.ShiftScaleRotate(p=0.2),
        ])
    cloud_dataset = CloudDataset(df_train, transforms, output_img_shape=IMAGE_SIZE_SMALL)
    # Creating indices for train and test set
    dataset_size = len(cloud_dataset)
    indices = list(range(dataset_size))
    split = int(np.floor(VALIDATION_SPLIT * dataset_size))
    if SHUFFLE_DATASET:
        # np.random.seed(42)
        np.random.shuffle(indices)
    train_indices, val_indices = indices[split:], indices[:split]

    train_sampler = torch.utils.data.sampler.SubsetRandomSampler(train_indices)
Пример #10
0
seed_everything(21)

# train.json / validation.json / test.json 디렉토리 설정
# dataset_path = "./input/data"
dataset_path = "/opt/ml/input/data"
train_path = dataset_path + "/train.json"
val_path = dataset_path + "/val.json"
all_path = dataset_path + "/train_all.json"
test_path = dataset_path + "/test.json"
kfold_train_path = [f"{dataset_path}/train_data{i}.json" for i in range(5)]
kfold_val_path = [f"{dataset_path}/valid_data{i}.json" for i in range(5)]

# augmentations
_train_transform = [
    A.Resize(256, 256),
    A.Normalize(mean=(0.4611, 0.4403, 0.4193), std=(0.2107, 0.2074, 0.2157)),
    ToTensorV2(),
]

_valid_transform = [
    A.Resize(256, 256),
    A.Normalize(mean=(0.4611, 0.4403, 0.4193), std=(0.2107, 0.2074, 0.2157)),
    ToTensorV2(),
]

_test_transform = [
    A.Resize(256, 256),
    A.Normalize(mean=(0.4611, 0.4403, 0.4193), std=(0.2107, 0.2074, 0.2157)),
    ToTensorV2(),
]
    A.ImageCompression(quality_lower=99, quality_upper=100),
    A.ShiftScaleRotate(shift_limit=0.2,
                       scale_limit=0.2,
                       rotate_limit=10,
                       border_mode=0,
                       p=0.5),
    A.ColorJitter(0.2, 0.2, 0.2, 0.2),
    A.Resize(args.max_size, args.max_size),
    A.OneOf([
        A.RandomResizedCrop(args.max_size, args.max_size),
        A.Cutout(max_h_size=int(args.max_size * 0.4),
                 max_w_size=int(args.max_size * 0.4),
                 num_holes=1,
                 p=0.3),
    ]),
    A.Normalize(mean=(0.4452, 0.4457, 0.4464), std=(0.2592, 0.2596, 0.2600)),
    ToTensorV2(),
])

print('Loading dataset...')
train_dataset = LandmarkDataset(transforms_train)
train_loader = DataLoader(train_dataset,
                          batch_size=args.batch_size,
                          shuffle=True,
                          num_workers=args.num_workers)

print('Loading model...')
# model = EfficientNetLandmark(1, args.num_classes)
model = ResNext101Landmark(args.num_classes)
model.cuda()
Пример #12
0
    A.HorizontalFlip(p=0.5),
    A.VerticalFlip(p=0.5),
    #A.Transpose(p=0.5),
    #A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.1, rotate_limit=30,
    #                   border_mode=cv2.BORDER_CONSTANT, value=[255,255,255], p=0.8),
    #A.GridDistortion(p=0.5),
    #A.RandomBrightnessContrast(p=0.5),
    #A.RandomCrop(int(options.tilesize*1.5),
    #             int(options.tilesize*1.5),
    #             always_apply=True, p=1.0),
])

mean_img = [0.485, 0.456, 0.406]
std_img = [0.229, 0.224, 0.225]
transform_norm = A.Compose([
    A.Normalize(mean=mean_img, std=std_img, max_pixel_value=255.0, p=1.0),
    ToTensor()
])

Image.fromarray(trn_transforms(image=img)['image'])

# Lets load a model
model = timm.create_model('mixnet_l', pretrained=True)
# Downloads to /Users/dhanley/.cache/torch/checkpoints/mixnet_xl_ra-aac3c00c.pth
# Normalise the image
x = transform_norm(image=img)['image']
x.shape
type(x)
x[:10, :10, 0]

pd.Series(x.flatten()).hist(bins=100)
Пример #13
0
def albu(use_pretrained):
    if use_pretrained == True:
        transform = {
            "train":
            A.Compose([
                # A.OneOf([
                #     A.ShiftScaleRotate(always_apply=False, p=0.3, shift_limit=(0.0, 0.0), scale_limit=(0.0, 0.0), rotate_limit=(-10, 10), interpolation=0, border_mode=0, value=(0, 0, 0), mask_value=None),
                #     A.ShiftScaleRotate(always_apply=False, p=0.3, shift_limit=(-0.1, 0.1), scale_limit=(0.0, 0.0), rotate_limit=(0, 0), interpolation=0, border_mode=0, value=(0, 0, 0), mask_value=None),
                #     A.ShiftScaleRotate(always_apply=False, p=0.3, shift_limit=(0.0, 0.0), scale_limit=(-0.1, 0.1), rotate_limit=(0, 0), interpolation=0, border_mode=0, value=(0, 0, 0), mask_value=None),
                #     A.ShiftScaleRotate(always_apply=False, p=0.1, shift_limit=(-0.1, 0.1), scale_limit=(-0.1, 0.1), rotate_limit=(-10, 10), interpolation=0, border_mode=0, value=(0, 0, 0), mask_value=None),
                # ],p=1.0),
                # A.InvertImg(always_apply=False, p=0.5),
                A.Resize(width=224, height=224),
                A.Normalize(mean=[0.485, 0.456, 0.406],
                            std=[0.229, 0.224, 0.225]),
                ToTensorV2(),
            ]),
            "val":
            A.Compose([
                # A.InvertImg(always_apply=False, p=0.5),
                A.Resize(width=224, height=224),
                A.Normalize(mean=[0.485, 0.456, 0.406],
                            std=[0.229, 0.224, 0.225]),
                ToTensorV2(),
            ])
        }
        return transform

    transform = {
        "train":
        A.Compose([
            A.OneOf([
                A.ShiftScaleRotate(always_apply=False,
                                   p=0.3,
                                   shift_limit=(0.0, 0.0),
                                   scale_limit=(0.0, 0.0),
                                   rotate_limit=(-10, 10),
                                   interpolation=0,
                                   border_mode=0,
                                   value=(0, 0, 0),
                                   mask_value=None),
                A.ShiftScaleRotate(always_apply=False,
                                   p=0.3,
                                   shift_limit=(-0.1, 0.1),
                                   scale_limit=(0.0, 0.0),
                                   rotate_limit=(0, 0),
                                   interpolation=0,
                                   border_mode=0,
                                   value=(0, 0, 0),
                                   mask_value=None),
                A.ShiftScaleRotate(always_apply=False,
                                   p=0.3,
                                   shift_limit=(0.0, 0.0),
                                   scale_limit=(-0.1, 0.1),
                                   rotate_limit=(0, 0),
                                   interpolation=0,
                                   border_mode=0,
                                   value=(0, 0, 0),
                                   mask_value=None),
                A.ShiftScaleRotate(always_apply=False,
                                   p=0.1,
                                   shift_limit=(-0.1, 0.1),
                                   scale_limit=(-0.1, 0.1),
                                   rotate_limit=(-10, 10),
                                   interpolation=0,
                                   border_mode=0,
                                   value=(0, 0, 0),
                                   mask_value=None),
            ],
                    p=1.0),
            # A.InvertImg(always_apply=False, p=0.5),
            A.Resize(width=32, height=32),
            ToTensorV2(),
        ]),
        "val":
        A.Compose([
            # A.InvertImg(always_apply=False, p=0.5),
            A.Resize(width=32, height=32),
            ToTensorV2()
        ])
    }
    return transform
Пример #14
0
exp_suffix = '_base'

SIZE = 256

# Load dataset info
path_to_train = 'Christof/assets/train_rgb_256/'
data = pd.read_csv('Christof/assets/train.csv')

normal_aug = A.Compose([
    A.Rotate((0, 30), p=0.75),
    A.RandomRotate90(p=1),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightness(0.05),
    A.RandomContrast(0.05),
    A.Normalize(mean=(0.08069, 0.05258, 0.05487),
                std=(0.13704, 0.10145, 0.15313),
                max_pixel_value=255.)
])

val_aug = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.Normalize(mean=(0.08069, 0.05258, 0.05487),
                std=(0.13704, 0.10145, 0.15313),
                max_pixel_value=255.)
])

train_dataset_info = []
for name, labels in zip(data['Id'], data['Target'].str.split(' ')):
    train_dataset_info.append({
        'path':
        os.path.join(path_to_train, name),
Пример #15
0
train_targets = train_csv.target.values

# test data
test_csv = pd.read_csv(root_dir + 'test.csv')
images_id_test = test_csv.image_name.values.tolist()
test_images = [
    os.path.join(root_dir + 'test/', i + '.jpg') for i in images_id_test
]
test_targets = test_csv.target.values

mean = (0.485, 0.456, 0.406)
std = (0.229, 0.224, 0.225)
# adding a simple augmentation
aug = albumentations.Compose([
    albumentations.Normalize(mean,
                             std,
                             max_pixel_value=255.0,
                             always_apply=True)
])

# Loading customDataset and
train_dataset = ClassificationDataset(image_paths=train_images,
                                      targets=train_targets,
                                      resize=(224, 224),
                                      augmentations=aug)
test_dataset = ClassificationDataset(image_paths=test_images,
                                     targets=test_targets,
                                     resize=(224, 224),
                                     augmentations=aug)

train_loader = DataLoader(train_dataset,
                          batch_size=16,
def train(config, device='cuda:0', save_chkpt=True):
    ''' procedure launching all main functions of training,
        validation and testing pipelines'''
    # for pipeline testing purposes
    save_chkpt = False if config.test_steps else True
    # preprocessing data
    normalize = A.Normalize(**config.img_norm_cfg)
    train_transform_real = A.Compose([
        A.Resize(**config.resize, interpolation=cv.INTER_CUBIC),
        A.HorizontalFlip(p=0.5),
        A.augmentations.transforms.ISONoise(color_shift=(0.15, 0.35),
                                            intensity=(0.2, 0.5),
                                            p=0.2),
        A.augmentations.transforms.RandomBrightnessContrast(
            brightness_limit=0.2,
            contrast_limit=0.2,
            brightness_by_max=True,
            always_apply=False,
            p=0.3),
        A.augmentations.transforms.MotionBlur(blur_limit=5, p=0.2), normalize
    ])
    train_transform_spoof = A.Compose([
        A.Resize(**config.resize, interpolation=cv.INTER_CUBIC),
        A.HorizontalFlip(p=0.5),
        A.augmentations.transforms.ISONoise(color_shift=(0.15, 0.35),
                                            intensity=(0.2, 0.5),
                                            p=0.2),
        A.augmentations.transforms.RandomBrightnessContrast(
            brightness_limit=0.2,
            contrast_limit=0.2,
            brightness_by_max=True,
            always_apply=False,
            p=0.3),
        A.augmentations.transforms.MotionBlur(blur_limit=5, p=0.2), normalize
    ])
    val_transform = A.Compose(
        [A.Resize(**config.resize, interpolation=cv.INTER_CUBIC), normalize])

    # load data
    sampler = config.data.sampler
    if sampler:
        num_instances, weights = make_weights(config)
        sampler = torch.utils.data.WeightedRandomSampler(weights,
                                                         num_instances,
                                                         replacement=True)
    train_transform = Transform(train_spoof=train_transform_spoof,
                                train_real=train_transform_real,
                                val=None)
    val_transform = Transform(train_spoof=None,
                              train_real=None,
                              val=val_transform)
    train_dataset, val_dataset, test_dataset = make_dataset(
        config, train_transform, val_transform)
    train_loader, val_loader, test_loader = make_loader(train_dataset,
                                                        val_dataset,
                                                        test_dataset,
                                                        config,
                                                        sampler=sampler)

    # build model and put it to cuda and if it needed then wrap model to data parallel
    model = build_model(config, device=device, strict=False, mode='train')
    model.to(device)
    if config.data_parallel.use_parallel:
        model = torch.nn.DataParallel(model,
                                      **config.data_parallel.parallel_params)

    # build a criterion
    softmax = build_criterion(config, device, task='main').to(device)
    cross_entropy = build_criterion(config, device, task='rest').to(device)
    bce = nn.BCELoss().to(device)
    criterion = (softmax, cross_entropy,
                 bce) if config.multi_task_learning else softmax

    # build optimizer and scheduler for it
    optimizer = torch.optim.SGD(model.parameters(), **config.optimizer)
    scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer,
                                                     **config.scheduler)

    # create Trainer object and get experiment information
    trainer = Trainer(model, criterion, optimizer, device, config,
                      train_loader, val_loader, test_loader)
    trainer.get_exp_info()

    # learning epochs
    for epoch in range(config.epochs.start_epoch, config.epochs.max_epoch):
        if epoch != config.epochs.start_epoch:
            scheduler.step()

        # train model for one epoch
        train_loss, train_accuracy = trainer.train(epoch)
        print(
            f'epoch: {epoch}  train loss: {train_loss}   train accuracy: {train_accuracy}'
        )

        # validate your model
        accuracy = trainer.validate()

        # eval metrics such as AUC, APCER, BPCER, ACER on val and test dataset according to rule
        trainer.eval(epoch, accuracy, save_chkpt=save_chkpt)
        # for testing purposes
        if config.test_steps:
            exit()

    # evaluate in the end of training
    if config.evaluation:
        file_name = 'tests.txt'
        trainer.test(file_name=file_name)
Пример #17
0
SIZE = 512

# Load dataset info
path_to_train = 'Christof/assets/train_rgb_512/'
data = pd.read_csv('Christof/assets/train.csv')

normal_aug = A.Compose([  #A.Rotate((0,30),p=0.75),
    A.RandomRotate90(p=1),
    A.HorizontalFlip(p=0.5),
    #A.RandomBrightness(0.05),
    #A.RandomContrast(0.05),
    A.IAAAffine(translate_percent=10, rotate=45, shear=10, scale=(0.9, 1.1)),
    #A.RandomAffine(degrees=45, translate=(0.1,0.1), shear=10, scale=(0.9,1.1))
    A.Normalize(mean=(0.08069, 0.05258, 0.05487),
                std=(0.1300, 0.0879, 0.1386),
                max_pixel_value=255.)
])

normal_aug_ext = A.Compose([  #A.Rotate((0,30),p=0.75),
    A.RandomRotate90(p=1),
    A.HorizontalFlip(p=0.5),
    #A.RandomBrightness(0.05),
    #A.RandomContrast(0.05),
    A.IAAAffine(translate_percent=10, rotate=45, shear=10, scale=(0.9, 1.1)),
    #A.RandomAffine(degrees=45, translate=(0.1,0.1), shear=10, scale=(0.9,1.1))
    A.Normalize(mean=(0.1174382, 0.06798691, 0.06592218),
                std=(0.16392466, 0.10036821, 0.16703453),
                max_pixel_value=255.)
])
Пример #18
0
def main():
    train_transform = A.Compose(
        [
            A.Resize(height=IMAGE_HEIGHT, width=IMAGE_WIDTH),
            A.Rotate(limit=35, p=1.0),
            A.HorizontalFlip(p=0.5),
            A.VerticalFlip(p=0.1),
            A.Normalize(
                mean=[0.0, 0.0, 0.0],
                std=[1.0, 1.0, 1.0],
                max_pixel_value=255.0,
            ),
            ToTensorV2(),
        ],
    )

    val_transforms = A.Compose(
        [
            A.Resize(height=IMAGE_HEIGHT, width=IMAGE_WIDTH),
            A.Normalize(
                mean=[0.0, 0.0, 0.0],
                std=[1.0, 1.0, 1.0],
                max_pixel_value=255.0,
            ),
            ToTensorV2(),
        ],
    )

    model = UNET(in_channels=3, out_channels=1).to(DEVICE)
    loss_fn = nn.BCEWithLogitsLoss()
    optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE)

    train_loader, val_loader = get_loaders(
        TRAIN_IMG_DIR,
        TRAIN_MASK_DIR,
        VAL_IMG_DIR,
        VAL_MASK_DIR,
        BATCH_SIZE,
        train_transform,
        val_transforms,
        NUM_WORKERS,
        PIN_MEMORY,
    )

    if LOAD_MODEL:
        load_checkpoint(torch.load("my_checkpoint.pth.tar"), model)


    check_accuracy(val_loader, model, device=DEVICE)
    scaler = torch.cuda.amp.GradScaler()

    for epoch in range(NUM_EPOCHS):
        train_fn(train_loader, model, optimizer, loss_fn, scaler)

        # save model
        checkpoint = {
            "state_dict": model.state_dict(),
            "optimizer":optimizer.state_dict(),
        }
        save_checkpoint(checkpoint)

        # check accuracy
        check_accuracy(val_loader, model, device=DEVICE)

        # print some examples to a folder
        save_predictions_as_imgs(
            val_loader, model, folder="saved_images/", device=DEVICE
        )
Пример #19
0
def evaluate_model(dataset_path, model_path):
    checkpoint_path = load_best_model(model_path)

    config_path = os.path.join(os.path.dirname(checkpoint_path), "..",
                               "config.yaml")

    net_config = NetConfig(config_path)

    test_data, test_images = load_dataset(dataset_path, "Test", "test.json")

    test_dict = {"labels": test_data, "images": test_images}

    eval_transforms = A.Compose([
        A.LongestMaxSize(net_config.base_size, always_apply=True),
        A.PadIfNeeded(net_config.base_size,
                      net_config.base_size,
                      always_apply=True,
                      border_mode=cv2.BORDER_CONSTANT),
        A.Normalize(),
        ToTensorV2()
    ])

    model = VisualControl.load_from_checkpoint(
        checkpoint_path=checkpoint_path,
        dataset_path=dataset_path,
        lr=5e-2,
        base_size=net_config.base_size,
        batch_size=net_config.batch_size,
        net_config=net_config)

    # prints the learning_rate you used in this checkpoint

    device = "cuda:0"

    model.to(device)
    model.eval()
    model.freeze()

    results = {}

    visualize = False
    save = False
    output_dir = "visual_results"
    if save:
        if os.path.exists(output_dir):
            raise Exception("output dir already exists")
        os.mkdir(output_dir)

    for batch_idx in tqdm(
            range(0, len(test_dict["labels"]), net_config.batch_size)):
        images_batch = []
        labels = []
        raw_images = []
        for idx in range(
                batch_idx,
                min(batch_idx + net_config.batch_size,
                    len(test_dict["labels"]))):
            image_path = os.path.join(dataset_path, "Test", "Images",
                                      test_dict["images"][idx])
            image = cv2.imread(image_path)
            raw_images.append(image)
            x = eval_transforms(image=image)
            y = net_config.encode(test_dict["labels"][idx])
            images_batch.append(x["image"])
            labels.append(y)

        predictions = model(default_collate(images_batch).to(device))
        for idx in range(0, len(predictions)):

            # d = encoder.get_smooth_estimation(predictions[idx].cpu().numpy())

            if net_config.head_type == NetConfig.CLASSIFICATION_TYPE:
                y_hat = from_logit_to_estimation(predictions[idx], net_config)
            else:
                y_hat = predictions[idx].cpu().numpy()
            y = labels[idx]
            results[idx + batch_idx] = {"label": y, "prediction": y_hat}

            if visualize or save:
                if visualize:
                    print("-----------------")
                    print(y)
                    print(y_hat)
                image_labels = add_labels_to_image(raw_images[idx], y, y_hat)

                if net_config.head_type == NetConfig.CLASSIFICATION_TYPE:
                    class_idx = from_one_hot_to_class(y_hat, net_config)
                    motors_info = net_config.get_real_values_from_estimation(
                        class_idx)
                else:
                    motors_info = {"w": y_hat[0], "v": y_hat[1]}
                image_labels = add_arrow_prediction(image_labels, motors_info)

                if visualize:
                    cv2.imshow("Test", image_labels)
                    cv2.waitKey(0)
                if save:
                    output_file = os.path.join(
                        output_dir, "{}.jpg".format(idx + batch_idx))
                    cv2.imwrite(output_file, image_labels)

    if net_config.head_type == NetConfig.CLASSIFICATION_TYPE:
        final_stats = {}
        gt = [results[x]["label"] for x in results]
        pred = [results[x]["prediction"] for x in results]
        acc = accuracy_score(gt, pred)
        acc2 = accuracy_score(gt, pred, normalize=False)
        print(acc)
        print("Global accuracy: {}/{}".format(acc2, len(gt)))
        final_stats["acc"] = acc
        final_stats["hits"] = int(acc2)
        final_stats["dataset_size"] = len(gt)

        for controller in net_config.classification_data:
            base_idx = 0
            if controller == "v" and "w" in net_config.classification_data:
                base_idx = len(net_config.classification_data['w']['classes'])

            indexes = net_config.softmax_config[controller]
            controller_labels = []
            for current_label in gt:
                controller_label = [current_label[i]
                                    for i in indexes].index(1.0)
                controller_labels.append(controller_label)

            controller_preds = []
            for controller_pred in pred:
                controller_preds.append([controller_pred[i]
                                         for i in indexes].index(1.0))

            acc1 = np.count_nonzero(
                np.abs(
                    np.array(controller_preds) -
                    np.array(controller_labels)) == 0)
            acc2 = np.count_nonzero(
                np.abs(
                    np.array(controller_preds) -
                    np.array(controller_labels)) <= 1)

            current_stats = {
                "acc1": acc1 / len(controller_preds),
                "acc2": acc2 / len(controller_preds)
            }

            final_stats[controller] = current_stats

        out_json_stats = os.path.join(os.path.dirname(checkpoint_path), "..",
                                      "stats.json")

        json.dump(final_stats, open(out_json_stats, "w"), indent=4)

        # confusion matrices

        try:

            final_data = {}
            for current_data in results:
                gt = results[current_data]["label"]
                pred = results[current_data]["prediction"]
                class_data_gt = from_one_hot_to_class(gt, net_config)
                class_data_pred = from_one_hot_to_class(pred, net_config)

                for output_key in class_data_gt:
                    if output_key not in final_data:
                        final_data[output_key] = {
                            "label": [],
                            "prediction": []
                        }
                    final_data[output_key]["label"].append(
                        class_data_gt[output_key])
                    final_data[output_key]["prediction"].append(
                        class_data_pred[output_key])

            fig, axs = plt.subplots(1, 2)
            fig.set_size_inches(15, 7, forward=True)

            for idx, output_key in enumerate(final_data):
                ax = axs[idx]
                a = confusion_matrix(
                    final_data[output_key]["label"],
                    final_data[output_key]["prediction"],
                    normalize="true",
                    labels=net_config.get_str_labels()[output_key])
                plot_confusion_matrix(
                    a,
                    classes=net_config.get_str_labels()[output_key],
                    title=output_key,
                    ax=ax)

            plt.tight_layout()
            output_image_path = os.path.join(os.path.dirname(checkpoint_path),
                                             "..", "confusion_matrix.png")
            plt.savefig(output_image_path)
        except Exception as exc:
            print(Exception)

    else:
        stats = {}
        for result in results:
            current_result = results[result]
            for idx_controller, controller in enumerate(
                    net_config.regression_data["controllers"]):
                current_diff = np.square(
                    current_result["label"][idx_controller] -
                    current_result["prediction"][idx_controller])
                if controller not in stats:
                    stats[controller] = []
                stats[controller].append(current_diff)

        final_stats = {}
        for controller in net_config.regression_data["controllers"]:
            final_stats[controller] = {
                "rmse": float(np.square(np.mean(stats[controller])))
            }

        out_json_stats = os.path.join(os.path.dirname(checkpoint_path), "..",
                                      "stats.json")
        json.dump(final_stats, open(out_json_stats, "w"), indent=4)
Пример #20
0
def main(args):
    writer = SummaryWriter(comment=args.exp_name)
    os.makedirs(args.weights, exist_ok=True)

    norm_mean, norm_std = normalization_isic_seg
    train_transform = A.Compose([
        A.Resize(args.size, args.size, cv2.INTER_CUBIC),
        A.HorizontalFlip(p=0.5),
        A.VerticalFlip(p=0.5),
        A.Rotate(limit=(-180, 180),
                 interpolation=cv2.INTER_CUBIC,
                 border_mode=cv2.BORDER_CONSTANT,
                 value=0,
                 mask_value=0,
                 p=1),
        A.ShiftScaleRotate(shift_limit=0.05,
                           scale_limit=0,
                           rotate_limit=0,
                           interpolation=cv2.INTER_CUBIC,
                           border_mode=cv2.BORDER_CONSTANT,
                           value=0,
                           mask_value=0),
        A.ShiftScaleRotate(shift_limit=0,
                           scale_limit=(0.95, 1.25),
                           rotate_limit=0,
                           interpolation=cv2.INTER_CUBIC,
                           border_mode=cv2.BORDER_CONSTANT,
                           value=0,
                           mask_value=0),
        A.RandomBrightnessContrast(brightness_limit=0.1, contrast_limit=0.1),
        A.GaussianBlur(blur_limit=(3, 5)),
        A.GaussNoise(var_limit=(10, 40)),
        A.ElasticTransform(border_mode=cv2.BORDER_CONSTANT,
                           value=0,
                           mask_value=0),
        A.CoarseDropout(),
        A.Normalize(norm_mean, norm_std),
        ToTensorV2(),
    ])
    valid_test_transform = A.Compose([
        A.Resize(args.size, args.size, cv2.INTER_CUBIC),
        A.Normalize(norm_mean, norm_std),
        ToTensorV2(),
    ])

    train_dataset = YAMLSegmentationDataset(dataset=args.in_ds,
                                            transform=train_transform,
                                            split=['training'])
    valid_dataset = YAMLSegmentationDataset(dataset=args.in_ds,
                                            transform=valid_test_transform,
                                            split=['validation'])
    test_dataset = YAMLSegmentationDataset(
        dataset=args.in_ds,
        transform=valid_test_transform,
        split=['test'],
    )
    train_dataloader = DataLoader(train_dataset,
                                  batch_size=args.batch_size,
                                  shuffle=True,
                                  num_workers=args.workers,
                                  drop_last=True,
                                  pin_memory=True)
    valid_dataloader = DataLoader(valid_dataset,
                                  batch_size=args.batch_size,
                                  shuffle=False,
                                  num_workers=args.workers,
                                  drop_last=False,
                                  pin_memory=True)
    test_dataloader = DataLoader(test_dataset,
                                 batch_size=args.batch_size,
                                 shuffle=False,
                                 num_workers=args.workers,
                                 drop_last=False,
                                 pin_memory=True)

    dataloaders = {
        'train': train_dataloader,
        'valid': valid_dataloader,
        'test': test_dataloader
    }
    device = torch.device('cpu' if not args.gpu else 'cuda')

    # Model, loss, optimizer
    print('Loading model...')
    model = SkinLesionModel(args.model)

    if args.onnx_export:
        # export onnx
        dummy_input = torch.ones(4, 3, args.size, args.size, device='cpu')
        model.train()
        torch.onnx.export(
            model,
            dummy_input,
            f'{args.model}.onnx',
            verbose=True,
            export_params=True,
            training=torch.onnx.TrainingMode.TRAINING,
            opset_version=12,
            do_constant_folding=False,
            input_names=['input'],
            output_names=['output'],
            dynamic_axes={
                'input': {
                    0: 'batch_size'
                },  # variable length axes
                'output': {
                    0: 'batch_size'
                }
            })

    if torch.cuda.device_count() > 1 and args.gpu:
        model = torch.nn.DataParallel(
            model, device_ids=np.where(np.array(args.gpu) == 1)[0])
    print(f'Move model to {device}')
    model = model.to(device)

    # loss_fn = nn.modules.loss.BCEWithLogitsLoss()
    loss_fn = smp.losses.DiceLoss('binary')
    # optimizer = optim.SGD(model.parameters(), lr=args.learning_rate, momentum=0.9, nesterov=True)
    optimizer = optim.Adam(model.parameters(), lr=args.learning_rate)
    # optimizer = optim.Adam(model.parameters(), lr=args.learning_rate, eps=1e-5)
    metric_fn = smp.utils.metrics.IoU(threshold=0.5)

    if args.ckpts is None:
        best_valid_iou = 0.
        load_epoch = 0
    else:
        checkpoint = torch.load(args.ckpts)
        model.load_state_dict(checkpoint['state_dict'])
        load_epoch = checkpoint['epoch']
        optimizer.load_state_dict(checkpoint['optimizer'])
        best_valid_iou = checkpoint['best_metric']
        print('Loaded checkpoint epoch ', load_epoch, ' with best metric ',
              best_valid_iou)

    if args.train:
        valid_iou = 0
        print('Starting training')
        for epoch in range(load_epoch, args.epochs):
            loss_train = []
            loss_valid = []
            for phase in ['train', 'valid']:
                if phase == 'train':
                    model.train()
                else:
                    model.eval()

                iou_scores = np.array([])
                with tqdm(desc=f'{phase} {epoch}/{args.epochs - 1}',
                          unit='batch',
                          total=len(dataloaders[phase]),
                          file=sys.stdout) as pbar:
                    for i, (x, gt,
                            original_shape) in enumerate(dataloaders[phase]):
                        # torchvision.utils.save_image(x, f'batch_{i}.jpg')
                        x, gt = x.to(device), gt.to(device,
                                                    dtype=torch.float32)
                        with torch.set_grad_enabled(phase == 'train'):
                            pred = model(x)
                            loss = loss_fn(pred, gt)
                            loss_item = loss.item()
                            pred, gt = torch.sigmoid(
                                pred.detach()), gt.detach()

                            if phase == 'train':
                                optimizer.zero_grad()
                                loss.backward()
                                optimizer.step()
                                loss_train.append(loss_item)
                            elif phase == 'valid':
                                loss_valid.append(loss_item)
                                # Upsampling(pred, gt, original_shape)

                            iou = metric_fn(pred, gt).item()
                            iou_scores = np.append(iou_scores, iou)

                            pbar.set_postfix(loss=loss_item,
                                             IoU=iou_scores.mean())
                            pbar.update()
                            pbar.refresh()

                iou = iou_scores.mean()

                if phase == 'train':
                    train_iou = iou
                    writer.add_scalar(f'{phase}/loss', np.mean(loss_train),
                                      epoch)
                    writer.add_scalar(f'{phase}/iou', train_iou, epoch)
                    writer.add_images(f'{phase}/images',
                                      Denormalize(x, norm_mean, norm_std),
                                      epoch)
                    writer.add_images(f'{phase}/prediction', pred, epoch)
                else:
                    valid_iou = iou
                    writer.add_scalar(f'{phase}/loss', np.mean(loss_valid),
                                      epoch)
                    writer.add_scalar(f'{phase}/iou', valid_iou, epoch)
                    grid = torchvision.utils.make_grid(
                        Denormalize(x, norm_mean, norm_std))
                    writer.add_image(f'{phase}/images', grid, epoch)
                    grid = torchvision.utils.make_grid(pred)
                    writer.add_image(f'{phase}/prediction', grid, epoch)

            if valid_iou > best_valid_iou:
                best_valid_iou = valid_iou
                state = {
                    'epoch': epoch,
                    'state_dict': model.state_dict(),
                    'optimizer': optimizer.state_dict(),
                    'best_metric': best_valid_iou
                }
                torch.save(state,
                           os.path.join(args.weights, f'{args.model}.pth'))
    elif args.test:
        model.eval()
        iou_scores = np.array([])
        for i, (x, gt, original_shape) in enumerate(dataloaders['test']):
            x, gt = x.to(device), gt.to(device, dtype=torch.float32)
            pred = model(x)
            pred, gt = torch.sigmoid(pred.detach()), gt.detach()
            iou = metric_fn(pred, gt).item()
            iou_scores = np.append(iou_scores, iou)

        iou = iou_scores.mean()
        print(f'Test IoU: {iou:.3f}')
Пример #21
0
def experiment(device, args=None):
    """Train model.

    Args:
        device (str): device to use for training.
        args (dict): experiment arguments.
    """
    if args is None:
        args = dict

    train_config = args["train"]
    train_augmentations = albu.Compose(
        [
            albu.OneOf([
                albu.HueSaturationValue(hue_shift_limit=10,
                                        sat_shift_limit=35,
                                        val_shift_limit=25),
                albu.RandomGamma(),
                albu.CLAHE(),
            ]),
            albu.RandomBrightnessContrast(brightness_limit=[-0.3, 0.3],
                                          contrast_limit=[-0.3, 0.3],
                                          p=0.5),
            albu.OneOf([
                albu.Blur(),
                albu.MotionBlur(),
                albu.GaussNoise(),
                albu.ImageCompression(quality_lower=75)
            ]),
            albu.ShiftScaleRotate(shift_limit=0.0625,
                                  scale_limit=0.15,
                                  rotate_limit=10,
                                  border_mode=0,
                                  p=0.5),
            albu.Resize(300, 300),
            albu.Normalize(),
            ToTensorV2(),
        ],
        bbox_params=albu.BboxParams(
            "albumentations"
        ),  # 'albumentations' because x1, y1, x2, y2 in range [0, 1]
    )
    train_dataset = COCOFileDataset(train_config["annotations"],
                                    train_config["images_dir"],
                                    transforms=train_augmentations)
    train_loader = DataLoader(
        train_dataset,
        batch_size=train_config["batch_size"],
        num_workers=train_config["num_workers"],
        shuffle=True,
        drop_last=True,
    )
    logger.info("Train dataset information:")
    logger.info("\n" + train_dataset.info())

    valid_config = args["validation"]
    valid_augmentations = albu.Compose(
        [
            albu.Resize(300, 300),
            albu.Normalize(),
            ToTensorV2(),
        ],
        bbox_params=albu.BboxParams(
            format="albumentations"
        ),  # 'albumentations' because x1, y1, x2, y2 in range [0, 1]
    )
    valid_dataset = COCOFileDataset(valid_config["annotations"],
                                    valid_config["images_dir"],
                                    transforms=valid_augmentations)
    valid_loader = DataLoader(
        valid_dataset,
        batch_size=valid_config["batch_size"],
        num_workers=valid_config["num_workers"],
        shuffle=False,
        drop_last=False,
    )
    logger.info("Validation dataset information:")
    logger.info("\n" + valid_dataset.info())

    model_config = args["model"]
    num_classes = model_config["num_classes"] + 1  # +1 for background class
    seed_all(42)
    model = SSD300(model_config["backbone"], num_classes)
    model = model.to(device)
    optimizer = optim.AdamW(model.parameters(), lr=1e-3 / 2)
    # optimizer = optim.SGD(model.parameters(), lr=2.6e-3, momentum=0.9, weight_decay=0.0005)
    epoch_scheduler = optim.lr_scheduler.CosineAnnealingWarmRestarts(
        optimizer, args["experiment"]["num_epochs"])
    batch_scheduler = None
    criterion = Loss(num_classes)

    experiment_config = args["experiment"]
    num_epochs = experiment_config["num_epochs"]
    for epoch_idx in range(1, num_epochs + 1):
        logger.info(f"Epoch: {epoch_idx}/{num_epochs}")
        train_metrics = train_fn(train_loader,
                                 model,
                                 device,
                                 criterion,
                                 optimizer,
                                 batch_scheduler,
                                 verbose=False)
        logger.info(f"     Train: {train_metrics}")

        # TODO: checkpoints
        valid_metrics = valid_fn(valid_loader,
                                 model,
                                 device,
                                 criterion,
                                 verbose=False)
        logger.info(f"Validation: {valid_metrics}")

        epoch_scheduler.step()

    export_to_onnx(model, torch.randn(1, 3, 300, 300),
                   experiment_config["onnx"])
    logger.info("Exported ONNX model to '{}'".format(
        experiment_config["onnx"]))
    alb.IAAAdditiveGaussianNoise(loc=0,
                                 scale=(2.5500000000000003, 12.75),
                                 per_channel=False,
                                 p=0.5),
    alb.IAAAffine(scale=1.0,
                  translate_percent=None,
                  translate_px=None,
                  rotate=0.0,
                  shear=0.0,
                  order=1,
                  cval=0,
                  mode='reflect',
                  p=0.5),
    alb.IAAAffine(rotate=90., p=0.5),
    alb.IAAAffine(rotate=180., p=0.5),
    alb.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
    ToTensorV2()
])
train_set = NoisyStudentDataset(ranzcr_train_df,
                                chestx_df,
                                train_image_transforms,
                                '../ranzcr/train',
                                '../data',
                                width_size=width_size)
train_loader = DataLoader(train_set,
                          batch_size=batch_size,
                          shuffle=True,
                          num_workers=12,
                          drop_last=True)

ranzcr_valid_df = ranzcr_df[ranzcr_df['fold'] == 1]
Пример #23
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--local_rank",
                        type=int,
                        default=-1,
                        help="local_rank for distributed training on gpus")
    args = parser.parse_args()
    torch.cuda.set_device(args.local_rank)
    device = torch.device("cuda", args.local_rank)
    torch.distributed.init_process_group(backend="nccl")
    args.device = device

    seed = 2001
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.backends.cudnn.deterministic = True

    # prepare input
    import pickle
    with open('../process_input/split2/image_list_train.pickle', 'rb') as f:
        image_list_train = pickle.load(f)
    with open('../process_input/split2/image_dict.pickle', 'rb') as f:
        image_dict = pickle.load(f)
    with open('../lung_localization/split2/bbox_dict_train.pickle', 'rb') as f:
        bbox_dict_train = pickle.load(f)
    print(len(image_list_train), len(image_dict), len(bbox_dict_train))

    # hyperparameters
    learning_rate = 0.0004
    batch_size = 32
    image_size = 576
    num_epoch = 1

    # build model
    if args.local_rank != 0:
        torch.distributed.barrier()
    model = seresnext50()
    if args.local_rank == 0:
        torch.distributed.barrier()

    model.to(args.device)

    num_train_steps = int(
        len(image_list_train) / (batch_size * 4) * num_epoch)  # 4 GPUs
    optimizer = optim.Adam(model.parameters(), lr=learning_rate)
    scheduler = get_linear_schedule_with_warmup(
        optimizer, num_warmup_steps=0, num_training_steps=num_train_steps)
    model, optimizer = amp.initialize(model,
                                      optimizer,
                                      opt_level="O1",
                                      verbosity=0)
    model = torch.nn.parallel.DistributedDataParallel(
        model,
        device_ids=[args.local_rank],
        output_device=args.local_rank,
        find_unused_parameters=True)
    criterion = nn.BCEWithLogitsLoss().to(args.device)

    # training
    train_transform = albumentations.Compose([
        albumentations.RandomContrast(limit=0.2, p=1.0),
        albumentations.ShiftScaleRotate(shift_limit=0.2,
                                        scale_limit=0.2,
                                        rotate_limit=20,
                                        border_mode=cv2.BORDER_CONSTANT,
                                        p=1.0),
        albumentations.Cutout(num_holes=2,
                              max_h_size=int(0.4 * image_size),
                              max_w_size=int(0.4 * image_size),
                              fill_value=0,
                              always_apply=True,
                              p=1.0),
        albumentations.Normalize(mean=(0.456, 0.456, 0.456),
                                 std=(0.224, 0.224, 0.224),
                                 max_pixel_value=255.0,
                                 p=1.0)
    ])

    # iterator for training
    datagen = PEDataset(image_dict=image_dict,
                        bbox_dict=bbox_dict_train,
                        image_list=image_list_train,
                        target_size=image_size,
                        transform=train_transform)
    sampler = DistributedSampler(datagen)
    generator = DataLoader(dataset=datagen,
                           sampler=sampler,
                           batch_size=batch_size,
                           num_workers=5,
                           pin_memory=True)

    for ep in range(num_epoch):
        losses = AverageMeter()
        model.train()
        for j, (images, labels) in enumerate(generator):
            images = images.to(args.device)
            labels = labels.float().to(args.device)

            logits = model(images)
            loss = criterion(logits.view(-1), labels)
            losses.update(loss.item(), images.size(0))

            optimizer.zero_grad()
            with amp.scale_loss(loss, optimizer) as scaled_loss:
                scaled_loss.backward()
            optimizer.step()
            scheduler.step()

        if args.local_rank == 0:
            print('epoch: {}, train_loss: {}'.format(ep, losses.avg),
                  flush=True)

        if args.local_rank == 0:
            out_dir = 'weights/'
            if not os.path.exists(out_dir):
                os.makedirs(out_dir)
            torch.save(model.module.state_dict(),
                       out_dir + 'epoch{}'.format(ep))
Пример #24
0
    albtransforms.PadIfNeeded(min_height=40,
                              min_width=40,
                              border_mode=4,
                              value=[0, 0, 0],
                              always_apply=False,
                              p=1.),
    #albtransforms.RandomCrop(32,32,always_apply=False, p=1.0),
    albtransforms.RandomCrop(32, 32, always_apply=False, p=1.),
    #albtransforms.HorizontalFlip(1.0),
    albtransforms.HorizontalFlip(0.5),
    albtransforms.Cutout(num_holes=8,
                         max_h_size=8,
                         max_w_size=8,
                         always_apply=False,
                         p=0.1),
    A.Normalize(*stats),
    ToTensor()
])

test_transform = A.Compose([A.Normalize(*stats), ToTensor()])

# loaded only when loaddata() invoked
trainset = None
trainloader = None
testset = None
testloader = None


def __custom_getitem__(self, index):
    image, label = self.data[index], self.targets[index]
    if self.transform is not None:
Пример #25
0
# ##############################
# Setup Dataflow
# ##############################

assert "DATASET_PATH" in os.environ
data_path = os.environ["DATASET_PATH"]

mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]

train_transforms = A.Compose([
    A.RandomResizedCrop(train_crop_size, train_crop_size, scale=(0.08, 1.0)),
    A.HorizontalFlip(),
    A.CoarseDropout(max_height=32, max_width=32),
    A.HueSaturationValue(),
    A.Normalize(mean=mean, std=std),
    ToTensor(),
])

val_transforms = A.Compose([
    # https://github.com/facebookresearch/FixRes/blob/b27575208a7c48a3a6e0fa9efb57baa4021d1305/imnet_resnet50_scratch/transforms.py#L76
    A.Resize(int((256 / 224) * val_crop_size), int(
        (256 / 224) * val_crop_size)),
    A.CenterCrop(val_crop_size, val_crop_size),
    A.Normalize(mean=mean, std=std),
    ToTensor(),
])

train_loader, val_loader, train_eval_loader = get_train_val_loaders(
    data_path,
    train_transforms=train_transforms,
Пример #26
0
def get_aug(aug_type: str = "val",
            task: str = "denoise",
            dataset: str = "cifar100",
            size: int = 64):
    """
    Args:
        aug_type: {`val`, `test`, `light`, `medium`}
        task: {"denoise", "deblur", "sr"}
        dataset: Name of dataset to get MEAN and STD
        size: final size of the crop
    """

    assert aug_type in ["val", "test", "light", "medium"]

    # Add the same noise for all channels for single-channel images
    mean, std, max_value = MEAN_STD_BY_NAME[dataset]
    if dataset == "medicaldecathlon":
        singlechannel = True
        normalization = albu.NoOp()
        noise = GaussNoiseNoClipping(
            singlechannel,
            var_limit=0.1,
        )
    else:
        singlechannel = False
        normalization = albu.Normalize(mean=mean,
                                       std=std,
                                       max_pixel_value=max_value)
        noise = albu.MultiplicativeNoise(multiplier=(0.75, 1.25),
                                         per_channel=True,
                                         elementwise=True)

    NORM_TO_TENSOR = albu.Compose(
        [normalization, albu_pt.ToTensorV2()],
        additional_targets={"mask": "image"})

    CROP_AUG = albu.Compose([
        albu.PadIfNeeded(size, size),
        albu.RandomResizedCrop(size, size, scale=(0.5, 1.)),
    ])

    if task == "deblur":
        TASK_AUG = albu.OneOf(
            [
                albu.Blur(blur_limit=(3, 5)),
                albu.GaussianBlur(blur_limit=(3, 5)),
                # albu.MotionBlur(),
                # albu.MedianBlur(),
                # albu.GlassBlur(),
            ],
            p=1.0)
    elif task == "denoise":
        # TASK_AUG = noise
        TASK_AUG = albu.OneOf(
            [
                noise,
                # albu.GaussNoise(),
                # GaussNoiseNoClipping(singlechannel, var_limit=0.1 if singlechannel else (20., 50.)),
                # albu.GlassBlur(),
                # albu.ISONoise(),
                # albu.MultiplicativeNoise(),
            ],
            p=1.0)
    elif task == "sr":
        TASK_AUG = albu.Downscale(scale_min=0.5,
                                  scale_max=0.5,
                                  interpolation=cv2.INTER_CUBIC,
                                  always_apply=True)
    else:
        raise ValueError("Name of task must be in {'deblur', 'denosie', 'sr'}")

    VAL_AUG = albu.Compose([
        albu.PadIfNeeded(size, size),
        albu.CenterCrop(size, size),
        TASK_AUG,
        NORM_TO_TENSOR,
    ])

    LIGHT_AUG = albu.Compose([
        CROP_AUG,
        TASK_AUG,
        NORM_TO_TENSOR,
    ])

    MEDIUM_AUG = albu.Compose([
        albu.Flip(),
        albu.RandomRotate90(), CROP_AUG, TASK_AUG, NORM_TO_TENSOR
    ])

    types = {
        "val": VAL_AUG,
        "light": LIGHT_AUG,
        "medium": MEDIUM_AUG,
    }

    return types[aug_type]
def best_cifar10_test_transforms(stats):
    return alb.Compose([
        alb.Normalize(*stats),
        alb_torch.transforms.ToTensor()
        ], p=1.0)
Пример #28
0
                            input_target_key="targets")


mean = (0.485, 0.456, 0.406)  # RGB
std = (0.229, 0.224, 0.225)  # RGB

albu_transforms = {
    'train':
    A.Compose([
        A.OneOf([
            A.Cutout(max_h_size=5, max_w_size=16),
            A.CoarseDropout(max_holes=4),
            A.RandomBrightness(p=0.25),
        ],
                p=0.5),
        A.Normalize(mean, std),
    ]),
    'valid':
    A.Compose([
        A.Normalize(mean, std),
    ]),
}

audio_augmenter = Compose([
    OneOf([GaussianNoiseSNR(min_snr=10),
           PinkNoiseSNR(min_snr=10)]),
    TimeShift(sr=32000),
    VolumeControl(p=0.5),
    Normalize()
])
Пример #29
0
    def __init__(self,
                 resize=(0, 0),
                 padding=(0, 0),
                 crop=(0, 0),
                 horizontal_flip_prob=0.0,
                 vertical_flip_prob=0.0,
                 gaussian_blur_prob=0.0,
                 rotate_degree=0.0,
                 cutout_prob=0.0,
                 cutout_dim=(8, 8),
                 hue_saturation_prob=0.0,
                 contrast_prob=0.0,
                 mean=(0.5, 0.5, 0.5),
                 std=(0.5, 0.5, 0.5),
                 normalize=True,
                 train=True):
        """Create data transformation pipeline.
        
        Args:
            resize (tuple, optional): Resize the input to the given height and
                width. (default: (0, 0))
            padding (tuple, optional): Pad the image if the image size is less
                than the specified dimensions (height, width). (default= (0, 0))
            crop (tuple, optional): Randomly crop the image with the specified
                dimensions (height, width). (default: (0, 0))
            horizontal_flip_prob (float, optional): Probability of an image
                being horizontally flipped. (default: 0)
            vertical_flip_prob (float, optional): Probability of an image
                being vertically flipped. (default: 0)
            rotate_prob (float, optional): Probability of an image being
                rotated. (default: 0)
            rotate_degree (float, optional): Angle of rotation for image
                augmentation. (default: 0)
            cutout_prob (float, optional): Probability that cutout will be
                performed. (default: 0)
            cutout_dim (tuple, optional): Dimensions of the cutout box (height, width).
                (default: (8, 8))
            hue_saturation_prob (float, optional): Probability of randomly changing hue,
                saturation and value of the input image. (default: 0)
            contrast_prob (float, optional): Randomly changing contrast of the input image.
                (default: 0)
            mean (float or tuple, optional): Dataset mean. (default: 0.5 for each channel)
            std (float or tuple, optional): Dataset standard deviation. (default: 0.5 for each channel)
        """
        transforms_list = []

        if sum(resize) > 0:
            transforms_list += [
                A.Resize(height=resize[0], width=resize[1], always_apply=True)
            ]
        if train:
            if sum(padding) > 0:
                transforms_list += [
                    A.PadIfNeeded(min_height=padding[0],
                                  min_width=padding[1],
                                  always_apply=True)
                ]
            if sum(crop) > 0:
                transforms_list += [
                    A.RandomCrop(crop[0], crop[1], always_apply=True)
                ]
            if horizontal_flip_prob > 0:  # Horizontal Flip
                transforms_list += [A.HorizontalFlip(p=horizontal_flip_prob)]
            if vertical_flip_prob > 0:  # Vertical Flip
                transforms_list += [A.VerticalFlip(p=vertical_flip_prob)]
            if gaussian_blur_prob > 0:  # Patch Gaussian Augmentation
                transforms_list += [A.GaussianBlur(p=gaussian_blur_prob)]
            if rotate_degree > 0:  # Rotate image
                transforms_list += [A.Rotate(limit=rotate_degree)]
            if cutout_prob > 0:  # CutOut
                if isinstance(mean, float):
                    fill_value = mean * 255.0
                else:
                    fill_value = tuple([x * 255.0 for x in mean])
                transforms_list += [
                    A.CoarseDropout(p=cutout_prob,
                                    max_holes=1,
                                    fill_value=fill_value,
                                    max_height=cutout_dim[0],
                                    max_width=cutout_dim[1])
                ]
            if hue_saturation_prob > 0:  # Hue Saturation
                transforms_list += [
                    A.HueSaturationValue(p=hue_saturation_prob)
                ]
            if contrast_prob > 0:  # Random Contrast
                transforms_list += [A.RandomContrast(p=contrast_prob)]
        if normalize:
            # normalize the data with mean and standard deviation to keep values in range [-1, 1]
            # since there are 3 channels for each image,
            # we have to specify mean and std for each channel
            transforms_list += [
                A.Normalize(mean=mean, std=std, always_apply=True),
            ]

        # convert the data to torch.FloatTensor
        transforms_list += [ToTensor()]

        self.transform = A.Compose(transforms_list)
Пример #30
0
# Load dataset info
tile = 'ur'
exp_suffix = f'_{tile}'
path_to_train = f'Christof/assets/train_rgb_1024_9crop/{tile}/'
data = pd.read_csv('Christof/assets/train.csv')

normal_aug = A.Compose([  #A.Rotate((0,30),p=0.75),
    A.RandomRotate90(p=1),
    A.HorizontalFlip(p=0.5),
    #A.RandomBrightness(0.05),
    #A.RandomContrast(0.05),
    A.IAAAffine(translate_percent=10, rotate=45, shear=10, scale=(0.9, 1.1)),
    #A.RandomAffine(degrees=45, translate=(0.1,0.1), shear=10, scale=(0.9,1.1))
    A.Normalize(mean=(0.08165012, 0.0530909, 0.05298166),
                std=(0.12806622, 0.08622692, 0.13038702),
                max_pixel_value=255.)
])

normal_aug_ext = A.Compose([  #A.Rotate((0,30),p=0.75),
    A.RandomRotate90(p=1),
    A.HorizontalFlip(p=0.5),
    #A.RandomBrightness(0.05),
    #A.RandomContrast(0.05),
    A.IAAAffine(translate_percent=10, rotate=45, shear=10, scale=(0.9, 1.1)),
    #A.RandomAffine(degrees=45, translate=(0.1,0.1), shear=10, scale=(0.9,1.1))
    A.Normalize(mean=(0.11843426, 0.06886751, 0.06541236),
                std=(0.16149608, 0.0987589, 0.16087747),
                max_pixel_value=255.)
])