Esempio n. 1
0
    def __init__(self, hyper_params):
        self.batch_size = hyper_params.batch

        self.n_cls = hyper_params.n_cls
        self.classes = hyper_params.classes
        root = hyper_params.root

        self.cuda = True if torch.cuda.is_available() else False

        self.model_name = hyper_params.model_name
        model_cfg = hyper_params.model_cfg
        model_type = model_cfg.pop('type')
        assert model_type in models.__dict__
        self.bg = model_cfg.pop('background')
        model_cfg['weights'] = hyper_params.weights
        model_cfg['head'][
            'num_classes'] = self.n_cls + 1 if self.bg else self.n_cls
        self.net = models.__dict__[model_type](**model_cfg)
        setattr(self.net, 'num_classes', model_cfg['head']['num_classes'])

        if self.cuda:
            self.net.cuda()
        self.net.eval()

        self.input_size = hyper_params.input_size
        setattr(self.net, 'input_size', self.input_size)
        transform = [dt.Resize_Pad(self.input_size), dt.ToTensor()]
        if hyper_params.norm:
            transform += [
                dt.Normalize(hyper_params.norm['mean'],
                             hyper_params.norm['std'])
            ]
        ann_file = root + hyper_params.ann_file
        img_dir = root + hyper_params.img_dir
        if hasattr(hyper_params, 'json'):
            self.dataset = dt.JsonDataset(
                ann_file,
                img_dir,
                transform=transforms.Compose(transform),
                city=hyper_params.city)
        else:
            self.dataset = dt.VOCDataset(
                ann_file, img_dir, transform=transforms.Compose(transform))
        setattr(self.dataset, 'with_bg', self.bg)
        self.dataloader = DataLoader(
            self.dataset,
            batch_size=self.batch_size,
            shuffle=False,
            # num_workers=hyper_params.nworkers if self.cuda else 0,
            # pin_memory=hyper_params.pin_mem if self.cuda else False,
            collate_fn=dt.list_collate,
        )

        self.conf_thresh = hyper_params.conf_th
        self.nms_thresh = hyper_params.nms_th
        self.ignore_thresh = hyper_params.ignore_th
        self.n_det = hyper_params.n_det
def main():
    parser = argparse.ArgumentParser('Visualize patch distances')
    parser.add_argument('-i', '--img', type=str, default='0',
        help='Image. If an integer, uses it as an index into a list of image'
             'files. If a filename, uses the image in that file. If the string '
             '"rand", chooses a random image from the list of image files.')
    parser.add_argument('-p', '--point', type=int, nargs=2, default=(-1, -1),
        help='(x, y) point to use as top right corner of reference patch. If '
             '(-1, -1), then choose a random point.')
    parser.add_argument('-k', '--patch-size', type=int, default=15,
        help='Size of a patch (square).')
    parser.add_argument('-s', '--size', type=int, default=320,
        help='Size of the longer side of the image after resize')
    parser.add_argument('-w', '--whiten', action='store_true',
        help='Whiten each patch individually before calculating distances.')
    parser.add_argument('--run', type=Path, default='',
        help='Path to run directory to use for saved model.')

    args = parser.parse_args()

    whiten = args.whiten
    img_file = get_image_file(args.img)
    img = get_image(img_file, args.size)
    k = args.patch_size
    point = get_point(args.point, k, *img.shape)

    print('Calculate patch distance')
    reg_dist = patch_distance(img, point, k, whiten)

    if not args.run:
        run = sorted(list(Path('runs').iterdir()))[-1]
        args.run = run
    cfg = json.load(open(str(args.run / 'config.json')))
    normalizer = dataset.Normalize(cfg['dataset']['kwargs']['normalize'])
    net = get_model(model.PyrNet, str(args.run / 'model_weights'))
    print('Calculate transformed distance')
    dist = calculate_distance(img, point, net, k, normalizer)
    print('Show closest patches')
    fig, ax = plt.subplots(1, 2, figsize=(24, 12))
    show_closest(img, reg_dist, k, ax=ax[0])
    show_closest(img, dist, k, ax=ax[1])
    ax[0].set_title('Pixel space distance')
    ax[1].set_title('Transform space distance')
    plt.tight_layout()
    plt.show()
Esempio n. 3
0
    def __init__(self, hyper_params):
        # get config
        self.batch_size = hyper_params.batch
        self.mini_batch_size = hyper_params.mini_batch
        # subdivision using accumulated grad
        self.subdivision = self.batch_size // self.mini_batch_size

        self.n_cls = hyper_params.n_cls
        self.classes = hyper_params.classes
        self.root = hyper_params.root

        self.cuda = True if torch.cuda.is_available() else False
        self.backup_dir = hyper_params.backup_dir
        self.backup = hyper_params.backup

        # listening SIGINT while Ctrl + c
        self.sigint = False
        signal.signal(signal.SIGINT, self.__sigint_handler)

        self.model_name = hyper_params.model_name
        model_cfg = hyper_params.model_cfg
        model_type = model_cfg.pop('type')
        assert model_type in models.__dict__
        self.bg = model_cfg.pop('background')
        model_cfg['weights'] = hyper_params.weights
        model_cfg['head'][
            'num_classes'] = self.n_cls + 1 if self.bg else self.n_cls
        self.net = models.__dict__[model_type](**model_cfg)

        if self.cuda:
            self.net.cuda()
        self.net.train()

        self.input_size = hyper_params.input_size
        setattr(self.net, 'input_size', self.input_size)
        transform = []
        if hasattr(hyper_params, 'crop'):
            # transform.append(dt.RCM(self.input_size,hyper_params.crop))
            transform.append(dt.RC(self.input_size, hyper_params.crop))
            # transform.append(dt.RandomCrop(hyper_params.crop))
            # transform.append(dt.SSDCrop())
        if hasattr(hyper_params, 'flip'):
            transform.append(dt.HFlip(hyper_params.flip))
        if hasattr(hyper_params, 'hue'):
            transform.append(
                dt.ColorJitter(hyper_params.exposure, hyper_params.saturation,
                               hyper_params.hue))
        transform += [dt.Resize_Pad(self.input_size), dt.ToTensor()]
        if hyper_params.norm:
            transform += [
                dt.Normalize(hyper_params.norm['mean'],
                             hyper_params.norm['std'])
            ]
        ann_file = self.root + hyper_params.ann_file
        img_dir = self.root + hyper_params.img_dir
        if hasattr(hyper_params, 'json'):
            dataset = dt.JsonDataset(ann_file,
                                     img_dir,
                                     transform=transforms.Compose(transform),
                                     city=hyper_params.city)
        else:
            dataset = dt.VOCDataset(ann_file,
                                    img_dir,
                                    transform=transforms.Compose(transform))
        setattr(dataset, 'with_bg', self.bg)
        self.dataloader = DataLoader(
            dataset,
            batch_size=self.mini_batch_size,
            shuffle=True,
            drop_last=True,
            num_workers=hyper_params.nworkers if self.cuda else 0,
            # pin_memory=hyper_params.pin_mem if self.cuda else False,
            collate_fn=dt.list_collate,
        )
        if hasattr(hyper_params, 'val'):
            ann_file = self.root + hyper_params.val['ann_file']
            img_dir = self.root + hyper_params.val['img_dir']
            transform = [dt.Resize_Pad(self.input_size), dt.ToTensor()]
            if hyper_params.norm:
                transform += [
                    dt.Normalize(hyper_params.norm['mean'],
                                 hyper_params.norm['std'])
                ]
            if hasattr(hyper_params, 'json'):
                valdata = dt.JsonDataset(
                    ann_file,
                    img_dir,
                    transform=transforms.Compose(transform),
                    city=hyper_params.city)
            else:
                valdata = dt.VOCDataset(
                    ann_file, img_dir, transform=transforms.Compose(transform))
            setattr(valdata, 'with_bg', self.bg)
            self.valloader = DataLoader(
                valdata,
                batch_size=self.mini_batch_size,
                num_workers=hyper_params.nworkers if self.cuda else 0,
                # pin_memory=hyper_params.pin_mem if self.cuda else False,
                collate_fn=dt.list_collate,
            )

        self.batch_e = len(self.dataloader) // self.subdivision
        self.max_batches = hyper_params.max_batches
        self.epoches = self.max_batches // self.batch_e

        self.optim_cfg = hyper_params.optim_cfg
        self.optim = self.make_optimizer(self.net)
        self.lr_cfg = hyper_params.lr_cfg
        self.scheduler = self.make_lr_scheduler(self.optim)

        if hyper_params.ckpt is not None:
            state = torch.load(hyper_params.ckpt)
            self.net.seen = state['seen']
            self.net.load_state_dict(state['net'])
            self.optim.load_state_dict(state['optim'])
            self.scheduler.load_state_dict(state['sche'])

        self.log = {}
Esempio n. 4
0
def main():
    parser = argparse.ArgumentParser('Visualize patch distances')
    parser.add_argument(
        '-i',
        '--img',
        type=str,
        default='0',
        nargs='+',
        help='Images. If an integer, uses it as an index into a list of image'
        'files. If a filename, uses the image in that file. If the string '
        '"rand", chooses a random image from the list of image files.')
    parser.add_argument(
        '-p',
        '--point',
        type=int,
        nargs=2,
        default=(-1, -1),
        help='(x, y) point to use as top right corner of reference patch. If '
        '(-1, -1), then choose a random point.')
    parser.add_argument('-k',
                        '--patch-size',
                        type=int,
                        default=15,
                        help='Size of a patch (square).')
    parser.add_argument(
        '-s',
        '--size',
        type=int,
        default=320,
        help='Size of the longer side of the image after resize')
    parser.add_argument(
        '-w',
        '--whiten',
        action='store_true',
        help='Whiten each patch individually before calculating distances.')
    parser.add_argument('--run',
                        type=Path,
                        default='',
                        help='Path to run directory to use for saved model.')

    args = parser.parse_args()

    dset = dataset.TigerData(mode='classification').train()

    whiten = args.whiten
    imgs = []
    # Get all the files
    for i in args.img:
        img_file = get_image_file(i, dset)
        img = pd.get_image(img_file, args.size)
        imgs.append(img)
    k = args.patch_size
    img = imgs[0]
    point = pd.get_point(args.point, k, *img.shape)

    if not args.run:
        run = sorted(list(Path('runs').iterdir()))[-1]
        args.run = run
    cfg = json.load(open(str(args.run / 'config.json')))
    normalizer = dataset.Normalize(cfg['dataset']['kwargs']['normalize'])
    net = td.get_model(model.PyrNet, str(args.run / 'model_weights'))

    print('Calculate patch distance')
    dist = pd.calculate_distance(img, point, k, whiten)
    patch_dists = [dist]
    patch = extract_patch(img, point, k)
    for i in imgs[1:]:
        dist = calculate_distance(i,
                                  patch,
                                  net,
                                  k,
                                  transform=False,
                                  normalize=normalizer)
        patch_dists.append(dist)

    print('Calculate transformed distance')
    dist = td.calculate_distance(img, point, net, k, whiten)
    trans_dists = [dist]
    patch = extract_patch(img, point, k, net)
    for i in imgs[1:]:
        dist = calculate_distance(i,
                                  patch,
                                  net,
                                  k,
                                  transform=True,
                                  normalize=normalizer)
        trans_dists.append(dist)

    print('Show closest patches')
    fig, ax = plt.subplots(2, len(imgs), figsize=(24, 12))
    for i in range(len(imgs)):
        show_closest(imgs[i], patch_dists[i], k, ax=ax[0, i])
        show_closest(imgs[i], trans_dists[i], k, ax=ax[1, i])
        ax[0, i].set_title('Pixel space distance')
        ax[1, i].set_title('Transform space distance')
    plt.tight_layout()
    plt.show()
Esempio n. 5
0
        picked = pd.concat([picked, df_full[df_full['patientid'] == idx]], ignore_index=True)
    return picked


if __name__ == '__main__':
    images_dir = './data/images'
    checkpoints_dir = './checkpoints'
    if not os.path.exists(checkpoints_dir):
        os.makedirs(checkpoints_dir)

    data_transforms = {
        'train': torchvision.transforms.Compose([
            dataset.RandomRotate(15),
            dataset.RandomCrop(512),
            dataset.RandomColorShift(),
            dataset.Normalize(config.mean, config.std),
            dataset.ToTensor(dtype=config.dtype)
        ]),
        'eval': torchvision.transforms.Compose([
            dataset.CenterCrop(512),
            dataset.Normalize(config.mean, config.std),
            dataset.ToTensor(dtype=config.dtype),
        ]),
    }

    df = pd.read_csv('./data/all.csv', usecols=['patientid', 'finding', 'filename'])
    covid_df = df[df.apply(lambda x: 'COVID-19' in str(x), axis=1)]
    other_df = df[df.apply(lambda x: 'COVID-19' not in str(x), axis=1)]
    print('Unique COVID-19 images:', len(covid_df))
    print('Unique COVID-19 patients:', len(covid_df['patientid'].unique()))
    print('Unique other images:', len(other_df))