예제 #1
0
    cfg = voc_refinedet[args.input_size]
    target_size = cfg['min_dim']
    num_classes = cfg['num_classes']
    objectness_threshold = 0.01
    args.nms_threshold = 0.49  # nms
    # args.nms_threshold = 0.45  # softnms
    args.confidence_threshold = 0.01
    args.top_k = 1000
    args.keep_top_k = 500
    args.vis_thres = 0.3
    # args.multi_scale_test = True

    set_type = 'test'

    # load data
    dataset = VOCDetection(args.voc_root, [('2007', set_type)],
                           dataset_name='VOC0712')
    # load net
    torch.set_grad_enabled(False)
    load_to_cpu = not args.cuda
    cudnn.benchmark = True
    device = torch.device('cuda' if args.cuda else 'cpu')
    detect = Detect_RefineDet(num_classes,
                              int(args.input_size),
                              0,
                              objectness_threshold,
                              confidence_threshold=args.confidence_threshold,
                              nms_threshold=args.nms_threshold,
                              top_k=args.top_k,
                              keep_top_k=args.keep_top_k)
    net = build_refinedet('test', int(args.input_size), num_classes,
                          backbone_dict)
예제 #2
0
}

p = 0.6
img_dim = (300, 512)[args.size == '512']
bgr_means = (104, 117, 123)
num_classes = (21, 81)[args.dataset == 'COCO']
batch_size = args.batch_size
weight_decay = 0.0005
gamma = 0.1
momentum = 0.9

dataset_name = args.dataset
if dataset_name[0] == "V":
    cfg = (VOC_300, VOC_512)[args.size == '512']
    train_dataset = VOCDetection(VOCroot, datasets_dict[dataset_name],
                                 SSDAugmentation(img_dim, bgr_means),
                                 AnnotationTransform(), dataset_name)
    # train_dataset = VOCDetection(VOCroot, datasets_dict[dataset_name],    preproc(img_dim, bgr_means, p), AnnotationTransform())
    test_dataset = VOCDetection(VOCroot, datasets_dict["VOC2007"], None,
                                AnnotationTransform(), dataset_name)
elif dataset_name[0] == "C":
    train_dataset = COCODetection(COCOroot, datasets_dict[dataset_name],
                                  SSDAugmentation(img_dim, bgr_means),
                                  COCOAnnotationTransform(), dataset_name)
    test_dataset = COCODetection(COCOroot, datasets_dict["COCOval"], None,
                                 COCOAnnotationTransform(), dataset_name)
    cfg = (COCO_300, COCO_512)[args.size == '512']
else:
    print('Unkown dataset!')

if args.version == "ssd_vgg":
예제 #3
0
 from collections import OrderedDict
 new_state_dict = OrderedDict()
 for k, v in state_dict.items():
     head = k[:7]
     if head == 'module.':
         name = k[7:] # remove `module.`
     else:
         name = k
     new_state_dict[name] = v
 net.load_state_dict(new_state_dict)
 net.eval()
 print('Finished loading model!')
 print(net)
 # load data
 if args.dataset == 'VOC':
     testset = VOCDetection(
         VOCroot, [('2007', 'test')], None, AnnotationTransform())
 elif args.dataset == 'COCO':
     testset = COCODetection(
         COCOroot, [('2014', 'minival')], None)
         #COCOroot, [('2015', 'test-dev')], None)
 else:
     print('Only VOC and COCO dataset are supported now!')
 if args.cuda:
     net = net.cuda()
     cudnn.benchmark = True
 else:
     net = net.cpu()
 # evaluation
 #top_k = (300, 200)[args.dataset == 'COCO']
 top_k = 200
 detector = Detect(num_classes,0,cfg)
예제 #4
0

def evaluate_detections(box_list, output_dir, dataset):
    write_voc_results_file(box_list, dataset)
    do_python_eval(output_dir)


if __name__ == '__main__':
    # load net
    num_classes = len(labelmap) + 1  # +1 for background
    net = build_ssd('test', 300, num_classes)  # initialize SSD
    net.load_state_dict(torch.load(args.trained_model))
    net.eval()
    print('Finished loading model!')
    # load data
    dataset = VOCDetection(args.voc_root, [('2007', set_type)],
                           BaseTransform(300, dataset_mean),
                           VOCAnnotationTransform())
    if args.cuda:
        net = net.cuda()
        cudnn.benchmark = True
    # evaluation
    test_net(args.save_folder,
             net,
             args.cuda,
             dataset,
             BaseTransform(net.size, dataset_mean),
             args.top_k,
             300,
             thresh=args.confidence_threshold)
예제 #5
0
def train():
    net.train()
    # loss counters
    loc_loss = 0  # epoch
    conf_loss = 0
    epoch = 0
    print('Loading Dataset...')
    if args.datasets == 'voc':
        train_sets = [('2007', 'trainval'), ('2012', 'trainval')]
        dataset = VOCDetection(args.voc_root, train_sets, SSDAugmentation(
            ssd_dim, means), AnnotationTransform())

    elif args.datasets == 'coco':
        dataset = make_dataset('coco',args.coco_dataroot, args.coco_annfile)
    print(len(dataset))
    epoch_size = len(dataset) // args.batch_size
    #print('Training SSD on', dataset.name)
    step_index = 0
    if args.visdom:
        # initialize visdom loss plot
        lot = viz.line(
            X=torch.zeros((1,)).cpu(),
            Y=torch.zeros((1, 3)).cpu(),
            opts=dict(
                xlabel='Iteration',
                ylabel='Loss',
                title='Current SSD Training Loss',
                legend=['Loc Loss', 'Conf Loss', 'Loss']
            )
        )
        epoch_lot = viz.line(
            X=torch.zeros((1,)).cpu(),
            Y=torch.zeros((1, 3)).cpu(),
            opts=dict(
                xlabel='Epoch',
                ylabel='Loss',
                title='Epoch SSD Training Loss',
                legend=['Loc Loss', 'Conf Loss', 'Loss']
            )
        )
    batch_iterator = None
    data_loader = data.DataLoader(dataset, batch_size, num_workers=args.num_workers,
                                  shuffle=True, pin_memory=True, collate_fn = detection_collate)
    scheduler = ReduceLROnPlateau(optimizer, 'min', min_lr = 1e-10, verbose = True)
    for iteration in range(args.start_iter, max_iter):
        if (not batch_iterator) or (iteration % epoch_size == 0):
            # create batch iterator
            batch_iterator = iter(data_loader)
        if iteration in stepvalues:
            step_index += 1
            adjust_learning_rate(optimizer, args.gamma, step_index)
            if args.visdom:
                viz.line(
                    X=torch.ones((1, 3)).cpu() * epoch,
                    Y=torch.Tensor([loc_loss, conf_loss,
                        loc_loss + conf_loss]).unsqueeze(0).cpu() / epoch_size,
                    win=epoch_lot,
                    update='append'
                )
            # reset epoch loss counters
            loc_loss = 0
            conf_loss = 0
            epoch += 1

        # load train data
        images, targets = next(batch_iterator)

        if args.cuda:
            images = Variable(images.cuda())
            targets = [Variable(anno.cuda(), volatile=True) for anno in targets]
        else:
            images = Variable(images)
            targets = [Variable(anno, volatile=True) for anno in targets]
        # forward
        t0 = time.time()
        out = net(images)
        # backprop
        optimizer.zero_grad()
        loss_l, loss_c = criterion(out, targets)
        loss = 0.01*loss_l + loss_c
        loss.backward()
        optimizer.step()
        t1 = time.time()
        loc_loss += loss_l.data[0]
        conf_loss += loss_c.data[0]
        #scheduler.step(loss.data[0])
        if iteration % 10 == 0:
            print('Timer: %.4f sec.' % (t1 - t0))
            print('iter ' + repr(iteration) + ' || Loss_loc: %.4f Loss_conf %.4f ||' % (loss_l.data[0], loss_c.data[0]))
            if args.visdom and args.send_images_to_visdom:
                random_batch_index = np.random.randint(images.size(0))
                viz.image(images.data[random_batch_index].cpu().numpy())
        if args.visdom:
            viz.line(
                X=torch.ones((1, 3)).cpu() * iteration,
                Y=torch.Tensor([loss_l.data[0], loss_c.data[0],
                    loss_l.data[0] + loss_c.data[0]]).unsqueeze(0).cpu(),
                win=lot,
                update='append'
            )
            # hacky fencepost solution for 0th epoch plot
            if iteration == 0:
                viz.line(
                    X=torch.zeros((1, 3)).cpu(),
                    Y=torch.Tensor([loc_loss, conf_loss,
                        loc_loss + conf_loss]).unsqueeze(0).cpu(),
                    win=epoch_lot,
                    update=True
                )
        if iteration % 10000 == 0:
            print('Saving state, iter:', iteration)
            save_dir = os.path.join(args.save_folder, args.experiments)
            if not os.path.exists(save_dir):
                os.mkdir(save_dir)
            torch.save(ssd_net.state_dict(), os.path.join(save_dir,'ssd300_0712_' +
                       repr(iteration) + '.pth'))
        
        torch.save(ssd_net.state_dict(), args.save_folder + '' + args.version + '.pth')
예제 #6
0
            ymax = top_ymax[j] * img.size[1]
            score = top_conf[j]
            label_name = top_labels[j]
            # print(img_id)
            coords = [xmin, ymin, xmax - xmin, ymax - ymin, score, img_id]
            with open(filename, mode='a') as f:
                f.write('PREDICTION: ' + repr(j) + '\n')
                f.write('label: ' + label_name + ' score: ' + str(score) +
                        ' ' + ' || '.join(str(c) for c in coords) + '\n\n')


if __name__ == '__main__':
    # load net
    net = build_ssd('test', 300, 21)  # initialize SSD
    net.load_state_dict(torch.load(args.trained_model))
    net.eval()
    print('Finished loading model!')
    # load data
    valset = VOCDetection(VOCroot, 'val', None, AnnotationTransform())
    if args.cuda:
        net = net.cuda()
        cudnn.benchmark = True
    # evaluation
    test_net(args.save_folder,
             net,
             args.cuda,
             valset,
             base_transform(net.size, (104, 117, 123)),
             args.top_k,
             thresh=args.confidence_threshold)
예제 #7
0
def train(model, resume=False):
    model.train()
    optimizer = build_optimizer(args, model)
    scheduler = build_lr_scheduler(args, optimizer)
    checkpointer = DetectionCheckpointer(
        model, args, optimizer=optimizer, scheduler=scheduler
    )
    criterion = MultiBoxLoss_combined(num_classes, overlap_threshold, True, 0, True, 3, 0.5, False)
    start_iter = (
        checkpointer.resume_or_load(args.basenet if args.phase == 1 else args.load_file,
                                    resume=resume).get("iteration", -1) + 1
    )
    max_iter = args.max_iter
    periodic_checkpointer = PeriodicCheckpointer(
        checkpointer, args.checkpoint_period, max_iter=max_iter
    )

    writers = (
        [
            CommonMetricPrinter(max_iter),
            TensorboardXWriter(args.save_folder),
        ]
    )

    if args.dataset == 'VOC':
        dataset = VOCDetection(args, VOCroot, train_sets, preproc(
            img_dim, rgb_means, p), AnnotationTransform(0 if args.setting == 'transfer' else args.split))
    elif args.dataset == 'COCO':
        dataset = COCODetection(COCOroot, train_sets, preproc(
            img_dim, rgb_means, p))
    else:
        raise ValueError(f"Unknown dataset: {args.dataset}")

    if args.phase == 2 and args.method == 'ours':
        sampler = TrainingSampler(len(dataset))
        data_loader = torch.utils.data.DataLoader(
            dataset,
            args.batch_size,
            sampler=sampler,
            num_workers=args.num_workers,
            collate_fn=detection_collate,
        )
        # initialize the OBJ(Target) parameters
        init_reweight(args, model, data_loader)
        dataset.set_mixup(np.random.beta, 1.5, 1.5)
        logger.info('Fine tuning on ' + str(args.shot) + '-shot task')

    sampler = TrainingSampler(len(dataset))
    data_loader = iter(torch.utils.data.DataLoader(
        dataset,
        args.batch_size,
        sampler=sampler,
        num_workers=args.num_workers,
        collate_fn=detection_collate,
    ))
    assert model.training, 'Model.train() must be True during training.'
    logger.info("Starting training from iteration {}".format(start_iter))

    # scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=args.gamma, last_epoch=epoch - 1)

    with EventStorage(start_iter) as storage:
        for iteration in range(start_iter, max_iter):
            iteration = iteration + 1
            storage.step()
            if args.phase == 2 and args.method == 'ours' and \
                    iteration == (args.max_iter - args.no_mixup_iter):
                dataset.set_mixup(None)
                data_loader = iter(torch.utils.data.DataLoader(
                    dataset,
                    args.batch_size,
                    sampler=sampler,
                    num_workers=args.num_workers,
                    collate_fn=detection_collate,
                ))

            data, targets = next(data_loader)
            # storage.put_image('image', vis_tensorboard(data))
            output = model(data)
            loss_dict = criterion(output, priors, targets)
            losses = sum(loss for loss in loss_dict.values())
            # assert torch.isfinite(losses).all(), loss_dict
            storage.put_scalars(total_loss=losses, **loss_dict)

            optimizer.zero_grad()
            losses.backward()
            optimizer.step()
            if args.phase == 2 and args.method == 'ours':
                if isinstance(model, (DistributedDataParallel, DataParallel)):
                    model.module.normalize()
                else:
                    model.normalize()
            storage.put_scalar("lr", optimizer.param_groups[-1]["lr"], smoothing_hint=False)
            scheduler.step()

            if iteration - start_iter > 5 and (iteration % 20 == 0 or iteration == max_iter):
                for writer in writers:
                    writer.write()
            periodic_checkpointer.step(iteration)
예제 #8
0
파일: train.py 프로젝트: xychen9459/TDRN
def train():
    net.train()
    epoch = args.start_iter
    if args.dataset_name == 'COCO':
        dataset = COCODetection(COCOroot,
                                year='trainval2014',
                                image_sets=train_sets,
                                transform=data_transform(ssd_dim, means),
                                phase='train')
    else:
        dataset = VOCDetection(
            data_root,
            train_sets,
            data_transform(ssd_dim, means),
            AnnotationTransform(dataset_name=args.dataset_name),
            dataset_name=args.dataset_name,
            set_file_name=set_filename)
    epoch_size = len(dataset) // args.batch_size
    drop_step = [s * epoch_size for s in args.step_list]
    max_iter = max_epoch * epoch_size
    logging.info('Loading Dataset:' + args.dataset_name + ' dataset size: ' +
                 str(len(dataset)))

    step_index = 0
    if args.visdom:
        # initialize visdom loss plot
        y_dim = 3
        legend = [
            'Loss',
            'Loc Loss',
            'Conf Loss',
        ]
        if use_refine:
            y_dim += 1
            legend += [
                'Arm Loc Loss',
            ]

        lot = viz.line(X=torch.zeros((1, )),
                       Y=torch.zeros((1, y_dim)),
                       opts=dict(
                           xlabel='Iteration',
                           ylabel='Loss',
                           title=args.save_folder.split('/')[-1],
                           legend=legend,
                       ))
    batch_iterator = None
    data_loader = data.DataLoader(dataset,
                                  batch_size,
                                  num_workers=args.num_workers,
                                  shuffle=True,
                                  collate_fn=collate_fn,
                                  pin_memory=True)

    for iteration in range(epoch * epoch_size, max_iter + 10):
        if (not batch_iterator) or (iteration % epoch_size == 0):
            # create batch iterator
            batch_iterator = iter(data_loader)
            if epoch % args.save_interval == 0:
                logging.info('Saving state, epoch: ' + str(epoch))
                torch.save(
                    ssd_net.state_dict(),
                    os.path.join(
                        args.save_folder, args.model_name + str(ssd_dim) +
                        '_' + args.dataset_name + '_' + repr(epoch) + '.pth'))
            epoch += 1

        t0 = time.time()
        if iteration in drop_step:
            step_index = drop_step.index(iteration) + 1
        adjust_learning_rate(optimizer, args.gamma, epoch, step_index,
                             iteration, epoch_size)
        # adjust_learning_rate(optimizer, args.gamma)

        collected_data = next(batch_iterator)
        with torch.no_grad():
            images, targets = collected_data[:2]
            images = images.to(device)
            targets = [anno.to(device) for anno in targets]

        # forward
        loss = torch.tensor(0., requires_grad=True).to(device)
        out = net(images)
        # backward
        optimizer.zero_grad()
        if use_refine:
            loss_arm_l = arm_criterion(out[0], priors, targets)
            loss_l, loss_c = criterion(out[2:],
                                       priors,
                                       targets,
                                       arm_data=out[:2])
            loss += args.loss_coe[0] * loss_arm_l

        else:
            loss_l, loss_c = criterion(out, priors, targets)
        loss += args.loss_coe[0] * loss_l + args.loss_coe[1] * loss_c

        loss.backward()
        optimizer.step()
        t1 = time.time()
        if iteration % 10 == 0:
            if use_refine:
                logging.info(
                    'Epoch:' + repr(epoch) + ', epochiter: ' +
                    repr(iteration % epoch_size) + '/' + repr(epoch_size) +
                    ', total_iter ' + repr(iteration) +
                    ' || loss: %.4f, Loss_l: %.4f, loss_c: %.4f, loss_arm_l: %.4f, lr: %.5f || Timer: %.4f sec.'
                    % (loss, loss_l, loss_c, loss_arm_l,
                       optimizer.param_groups[0]['lr'], t1 - t0))
            else:
                logging.info(
                    'Epoch:' + repr(epoch) + ', epochiter: ' +
                    repr(iteration % epoch_size) + '/' + repr(epoch_size) +
                    ', total_iter ' + repr(iteration) +
                    ' || loss: %.4f, Loss_l: %.4f, loss_c: %.4f, lr: %.5f || Timer: %.4f sec.'
                    % (loss, loss_l, loss_c, optimizer.param_groups[0]['lr'],
                       t1 - t0))

        if args.visdom:
            y_dis = [
                loss.cpu(), args.loss_coe[0] * loss_l.cpu(),
                args.loss_coe[1] * loss_c.cpu()
            ]
            if iteration == 1000:
                # initialize visdom loss plot
                lot = viz.line(X=torch.zeros((1, )),
                               Y=torch.zeros((1, y_dim)),
                               opts=dict(
                                   xlabel='Iteration',
                                   ylabel='Loss',
                                   title=args.save_folder.split('/')[-1],
                                   legend=legend,
                               ))
            if use_refine:
                y_dis += [
                    args.loss_coe[0] * loss_arm_l.cpu(),
                ]
            # update = 'append' if iteration
            viz.line(X=torch.ones((1, y_dim)) * iteration,
                     Y=torch.FloatTensor(y_dis).unsqueeze(0),
                     win=lot,
                     update='append',
                     opts=dict(
                         xlabel='Iteration',
                         ylabel='Loss',
                         title=args.save_folder.split('/')[-1],
                         legend=legend,
                     ))

    torch.save(
        ssd_net.state_dict(),
        os.path.join(
            args.save_folder, args.model_name + str(ssd_dim) + '_' +
            args.dataset_name + '_' + repr(iteration) + '.pth'))
    print('Complet Training. Saving state, iter:', iteration)
예제 #9
0
def train():
    net.train()
    # loss counters
    loc_loss = 0  # epoch
    conf_loss = 0
    epoch = 0
    print('Loading Dataset...')

    dataset = VOCDetection(VOCroot, train_sets, preproc(img_dim, rgb_means, p),
                           AnnotationTransform())

    epoch_size = len(dataset) // args.batch_size
    max_iter = args.max_epoch * epoch_size

    stepvalues = (25 * epoch_size, 35 * epoch_size)
    step_index = 0
    start_iter = 0

    lr = args.lr
    for iteration in range(start_iter, max_iter):
        if iteration % epoch_size == 0:
            if (epoch > 20 and epoch % 2 == 0):
                torch.save(
                    net.state_dict(), args.save_folder + 'epoches_' +
                    repr(epoch).zfill(3) + '.pth')
            # create batch iterator
            batch_iterator = iter(
                data.DataLoader(dataset,
                                batch_size,
                                shuffle=True,
                                num_workers=8,
                                collate_fn=detection_collate))
            loc_loss = 0
            conf_loss = 0
            epoch += 1

        load_t0 = time.time()
        if iteration in stepvalues:
            step_index += 1
        lr = adjust_learning_rate(optimizer, 0.2, epoch, step_index, iteration,
                                  epoch_size)

        images, targets = next(batch_iterator)

        images = Variable(images.cuda())
        targets = [Variable(anno.cuda()) for anno in targets]

        # forward
        t0 = time.time()
        out = net(images)
        # backprop
        optimizer.zero_grad()
        loss_l, loss_c = criterion(out, priors, targets)
        loss = loss_l + loss_c
        loss.backward()
        optimizer.step()
        t1 = time.time()
        loc_loss += loss_l.item()
        conf_loss += loss_c.item()
        load_t1 = time.time()

        # visualization
        visualize_total_loss(writer, loss.item(), iteration)
        visualize_loc_loss(writer, loss_l.item(), iteration)
        visualize_conf_loss(writer, loss_c.item(), iteration)

        if iteration % 10 == 0:
            print('Epoch:' + repr(epoch) + ' || epochiter: ' +
                  repr(iteration % epoch_size) + '/' + repr(epoch_size) +
                  '|| Totel iter ' + repr(iteration) +
                  ' || L: %.4f C: %.4f||' % (loss_l.item(), loss_c.item()) +
                  'Batch time: %.4f sec. ||' % (load_t1 - load_t0) +
                  'LR: %.8f' % (lr))

    torch.save(net.state_dict(),
               args.save_folder + 'epoches_' + repr(epoch).zfill(3) + '.pth')
예제 #10
0
    # load net
    if args.dataset == 'VOC':
        cfg = voc
    else:
        cfg = custom
                   # +1 for background
    net = build_ssd(phase='test', size=cfg['min_dim'], 
        num_classes=cfg['num_classes'], confidence_threshold=args.confidence_threshold)
    net.load_state_dict(torch.load(args.trained_model))
    net = net.to(device)
    net.eval()
    print('Finished loading model!')

    # Load data (TODO:  add COCO)
    if args.dataset == 'VOC':
        dataset = VOCDetection(args.dataset_root, [(set_type)],
                            BaseTransform(cfg['min_dim'], MEANS),
                            VOCAnnotationTransform())
    else:
        dataset = CustomDetection(root=args.dataset_root, 
                                    image_set=[(set_type)], 
                                    transform=BaseTransform(cfg['min_dim'], MEANS),
                                    target_transform=CustomAnnotationTransform(train=False))
    
    # net = net.to(device)
    
    # Evaluation
    test_net(args.save_folder, net, args.cuda, dataset,
             BaseTransform(net.size, MEANS), args.top_k, cfg['min_dim'],
             thresh=args.confidence_threshold)
예제 #11
0
def train():
    net.train()
    # loss counters
    loc_loss = 0  # epoch
    conf_loss = 0
    epoch = 0
    print('Loading Dataset...')

    dataset = VOCDetection(VOCroot, train_sets, BaseTransform(
        ssd_dim, rgb_means), AnnotationTransform())
    epoch_size = len(dataset) // args.batch_size
    print('Training SSD on', dataset.name)
    step_index = 0
    if args.visdom:
        # initialize visdom loss plot
        lot = viz.line(
            X=torch.zeros((1,)).cpu(),
            Y=torch.zeros((1, 3)).cpu(),
            opts=dict(
                xlabel='Iteration',
                ylabel='Loss',
                title='Current SSD Training Loss',
                legend=['Loc Loss', 'Conf Loss', 'Loss']
            )
        )
        epoch_lot = viz.line(
            X=torch.zeros((1,)).cpu(),
            Y=torch.zeros((1, 3)).cpu(),
            opts=dict(
                xlabel='Epoch',
                ylabel='Loss',
                title='Epoch SSD Training Loss',
                legend=['Loc Loss', 'Conf Loss', 'Loss']
            )
        )
    for iteration in range(max_iter):
        if iteration % epoch_size == 0:
            # create batch iterator
            batch_iterator = iter(data.DataLoader(dataset, batch_size,
                                                  shuffle=True, collate_fn=detection_collate))
        if iteration in stepvalues:
            step_index += 1
            adjust_learning_rate(optimizer, args.gamma, step_index)
            if args.visdom:
                viz.line(
                    X=torch.ones((1, 3)).cpu() * epoch,
                    Y=torch.Tensor([loc_loss, conf_loss,
                        loc_loss + conf_loss]).unsqueeze(0).cpu() / epoch_size,
                    win=epoch_lot,
                    update='append'
                )
            # reset epoch loss counters
            loc_loss = 0
            conf_loss = 0
            epoch += 1

        # load train data
        images, targets = next(batch_iterator)
        # print(images)
        # print(targets)
        if args.cuda:
            images = Variable(images.cuda())
            targets = [Variable(anno.cuda()) for anno in targets]
        else:
            images = Variable(images)
            targets = [Variable(anno) for anno in targets]
        # forward
        t0 = time.time()
        out = net(images)
        # backprop
        optimizer.zero_grad()
        loss_l, loss_c = criterion(out, targets)
        loss = loss_l + loss_c
        loss.backward()
        optimizer.step()
        t1 = time.time()
        loc_loss += loss_l.data[0]
        conf_loss += loss_c.data[0]
        if iteration % 10 == 0:
            print('Timer: %.4f sec.' % (t1 - t0))
            print('iter ' + repr(iteration) + ' || Loss: %.4f ||' % (loss.data[0]), end=' ')
        if args.visdom:
            viz.line(
                X=torch.ones((1, 3)).cpu() * iteration,
                Y=torch.Tensor([loss_l.data[0], loss_c.data[0],
                    loss_l.data[0] + loss_c.data[0]]).unsqueeze(0).cpu(),
                win=lot,
                update='append'
            )
            # hacky fencepost solution for 0th epoch plot
            if iteration == 0:
                viz.line(
                    X=torch.zeros((1, 3)).cpu(),
                    Y=torch.Tensor([loc_loss, conf_loss,
                        loc_loss + conf_loss]).unsqueeze(0).cpu(),
                    win=epoch_lot,
                    update=True
                )
        if iteration % 5000 == 0:
            torch.save(net.state_dict(), 'weights/ssd300_0712_iter_' +
                       repr(iteration) + '.pth')
    torch.save(net.state_dict(), args.save_folder + '' + args.version + '.pth')
예제 #12
0
파일: test.py 프로젝트: hkjdy/ssd

if __name__ == "__main__":
    # init xmls
    init_xmls(args.image_root, args.annotation_root, TEMP_PATH)
    # load net
    num_classes = len(labelmap) + 1  # +1 for background
    net = build_ssd("test", 300, num_classes)  # initialize SSD
    net.load_state_dict(torch.load(args.trained_model))
    net.eval()
    print("Finished loading model!")
    # load data
    dataset = VOCDetection(
        args.image_root,
        args.annotation_root,
        [("", set_type)],
        BaseTransform(300, dataset_mean),
        VOCAnnotationTransform(),
    )
    if args.cuda:
        net = net.cuda()
        cudnn.benchmark = True
    # evaluation
    test_net(
        args.save_folder,
        net,
        args.cuda,
        dataset,
        BaseTransform(net.size, dataset_mean),
        args.top_k,
        300,
예제 #13
0
from loss import MultiBoxLoss
from data import VOCDetection, detection_collate
from params import voc_config, args, MEANS, VOC_ROOT

import time
import torch.optim as optim
import torch.backends.cudnn as cudnn
import torch.utils.data as data

import torch
import numpy as np

from net import build_ssd
from matplotlib import pyplot as plt

dataset = VOCDetection(root=VOC_ROOT, transform=SSDAugmentation(300, MEANS))

# ネットワークの定義
ssd_net = build_ssd('train', voc_config['num_classes'])
device = 'cuda' if torch.cuda.is_available() else 'cpu'
# ネットワークをGPUに転送
net = ssd_net.to(device)

# 学習の再開時はargs['resume']のパラメータをロード
if args['resume']:
    print('Resuming training, loading {}...'.format(args['resume']))
    ssd_net.load_weights(args['save_folder'] + args['resume'])

# 新規モデル学習時は追加ネットワークの畳み込み、位置推定、クラス分類の畳み込みパラメータを初期化する
net.init_weights(args['resume'])
예제 #14
0
파일: eval.py 프로젝트: jacke121/PytorchSSD
def test():
    print('Loading Dataset...')
    if args.dataset == 'VOC':
        testset = VOCDetection(VOCroot, [('2007', 'test')], None,
                               AnnotationTransform())
        train_dataset = VOCDetection(VOCroot, train_sets,
                                     preproc(img_dim, rgb_means, rgb_std, p),
                                     AnnotationTransform())
    # elif args.dataset == 'COCO':
    #     testset = COCODetection(
    #         COCOroot, [('2017', 'val')], None)
    #     train_dataset = COCODetection(COCOroot, train_sets, preproc(
    #         img_dim, rgb_means, rgb_std, p))
    else:
        print('Only VOC and COCO are supported now!')
        exit()

    net.eval()
    # loss counters
    epoch = 0
    if args.resume_net:
        epoch = 0 + args.resume_epoch
    epoch_size = len(train_dataset) // args.batch_size
    max_iter = args.max_epoch * epoch_size

    stepvalues_VOC = (150 * epoch_size, 200 * epoch_size, 250 * epoch_size)
    stepvalues_COCO = (90 * epoch_size, 120 * epoch_size, 140 * epoch_size)
    stepvalues = (stepvalues_VOC, stepvalues_COCO)[args.dataset == 'COCO']
    print('Training', args.version, 'on', train_dataset.name)

    step_index = 0

    start_iter = 0
    log_file = open(log_file_path, 'w')
    batch_iterator = None
    mean_loss_c = 0
    mean_loss_l = 0
    for iteration in range(start_iter, max_iter + 10):
        if (iteration % epoch_size == 0):
            # create batch iterator
            batch_iterator = iter(
                data.DataLoader(train_dataset,
                                batch_size,
                                shuffle=True,
                                num_workers=args.num_workers,
                                collate_fn=detection_collate))
            top_k = (300, 200)[args.dataset == 'COCO']
            if args.dataset == 'VOC':
                APs, mAP = test_net(test_save_dir,
                                    net,
                                    detector,
                                    args.cuda,
                                    testset,
                                    BaseTransform(net.size, rgb_means, rgb_std,
                                                  (2, 0, 1)),
                                    top_k,
                                    thresh=0.01)
                APs = [str(num) for num in APs]
                mAP = str(mAP)
                log_file.write(str(iteration) + ' APs:\n' + '\n'.join(APs))
                log_file.write('mAP:\n' + mAP + '\n')
            else:
                test_net(test_save_dir,
                         net,
                         detector,
                         args.cuda,
                         testset,
                         BaseTransform(net.module.size, rgb_means, rgb_std,
                                       (2, 0, 1)),
                         top_k,
                         thresh=0.01)

        load_t0 = time.time()
        if iteration in stepvalues:
            step_index = stepvalues.index(iteration) + 1

        # load train data
        images, targets = next(batch_iterator)
        if args.cuda:
            images = images.cuda()
            targets = [anno.cuda() for anno in targets]
        # forward
        out = net(images)
        # backprop

        load_t1 = time.time()
        if iteration % 2 == 0:
            print('Epoch:' + repr(epoch) + ' batch: ' +
                  repr(iteration % epoch_size) + '/' + repr(epoch_size) +
                  ' loss-L: %.4f loss-C: %.4f' %
                  (mean_loss_l / 10, mean_loss_c / 10) + 'time: %.4f ' %
                  (load_t1 - load_t0))
            log_file.write('Epoch:' + repr(epoch) + ' epochiter: ' +
                           repr(iteration % epoch_size) + '/' +
                           repr(epoch_size) + ' Totel iter ' +
                           repr(iteration) + ' Loss %.4f C: %.4f' %
                           (mean_loss_l / 10, mean_loss_c / 10) +
                           'Batch time: %.4f sec. ||' % (load_t1 - load_t0) +
                           '\n')

            mean_loss_c = 0
            mean_loss_l = 0
            if args.visdom and args.send_images_to_visdom:
                random_batch_index = np.random.randint(images.size(0))
                viz.image(images.data[random_batch_index].cpu().numpy())
    log_file.close()
    devices = [0, 1]
    device, device_ids = prepare_device(devices)

    T_file = 'model/KD_' + repr(Feature_num) + 'F' + repr(Feature_num) + 'D/T_const/prune_list/' + repr(
            Epoch) + 'epoch/lr_040812/20200404/'
    if os.path.exists(Path(T_file)) is False:
        os.makedirs(T_file)

    priorbox = PriorBox(voc, device).to(device)
    priorbox = torch.nn.DataParallel(priorbox, device_ids=device_ids)
    T_model = build_ssd('train', 300, 21, device)

    try:
        dataset = VOCDetection(root='/home/hanchengye/data/VOCdevkit/',
                               image_sets=[('2007', 'trainval'), ('2012', 'trainval')],
                               transform=SSDAugmentation(300, MEANS))
    except FileNotFoundError:
        dataset = VOCDetection(root='/remote-home/source/remote_desktop/share/Dataset/VOCdevkit/',
                               image_sets=[('2007', 'trainval'), ('2012', 'trainval')],
                               transform=SSDAugmentation(300, MEANS))

    data_loader_rank = data.DataLoader(dataset, batch_size=32,
                                       num_workers=4, shuffle=True,
                                       collate_fn=detection_collate,
                                       pin_memory=True)

    param_T = torch.load('weights/ssd300_COCO_395000.pth')
    T_model.load_state_dict(param_T)
    T_model = T_model.to(device)
    S_model = copy.deepcopy(T_model)
예제 #16
0
def train():
    net.train()
    # loss counters
    loc_loss = 0  # epoch
    conf_loss = 0
    epoch = 0 + args.resume_epoch
    print('Loading Dataset...')

    if args.dataset == 'VOC':
        dataset = VOCDetection(VOCroot, train_sets,
                               preproc(img_dim, rgb_means, p),
                               AnnotationTransform())
    elif args.dataset == 'COCO':
        dataset = COCODetection(COCOroot, train_sets,
                                preproc(img_dim, rgb_means, p))
    else:
        print('Only VOC and COCO are supported now!')
        return

    epoch_size = len(dataset) // args.batch_size
    max_iter = args.max_epoch * epoch_size

    stepvalues_VOC = (150 * epoch_size, 200 * epoch_size, 250 * epoch_size)
    stepvalues_COCO = (90 * epoch_size, 120 * epoch_size, 140 * epoch_size,
                       215 * epoch_size)
    if args.size == '512' and args.batch_size < 32:
        # batchsize => 8
        stepvalues_COCO = (90 * epoch_size, 120 * epoch_size, 140 * epoch_size,
                           215 * epoch_size)
        print("!!!!!!!!!")
    stepvalues = (stepvalues_VOC, stepvalues_COCO)[args.dataset == 'COCO']
    print('Training', args.version, 'on', dataset.name)
    step_index = 0

    if args.resume_epoch > 0:
        start_iter = args.resume_epoch * epoch_size
    else:
        start_iter = 0

    lr = args.lr
    loc_loss = 0
    conf_loss = 0
    for iteration in range(start_iter, max_iter):
        if iteration % epoch_size == 0:
            # create batch iterator
            batch_iterator = iter(
                data.DataLoader(dataset,
                                batch_size,
                                shuffle=True,
                                num_workers=args.num_workers,
                                collate_fn=detection_collate))
            loc_loss = 0
            conf_loss = 0
            if (epoch % 10 == 0 and epoch > 0) or (epoch % 1 == 0
                                                   and epoch > 90):
                torch.save(
                    net.state_dict(), args.save_folder + args.version + '_' +
                    args.dataset + '_epoches_' + repr(epoch) + '.pth')
            epoch += 1

        load_t0 = time.time()
        step_index = 0
        for stepvalue in stepvalues:
            if iteration >= stepvalue:
                step_index += 1
        lr = adjust_learning_rate(optimizer, args.gamma, epoch, step_index,
                                  iteration, epoch_size)

        images, targets = next(batch_iterator)
        # load train data
        lam = np.random.beta(0.1, 0.1)
        ##  mixup
        index = np.arange(len(targets))
        np.random.shuffle(index)

        # print(np.sum([torch.sum(anno[:,-1] == 2) for anno in targets]))

        if args.cuda:
            images = Variable(images.cuda())
            targets = [Variable(anno.cuda()) for anno in targets]
        else:
            images = Variable(images)
            targets = [Variable(anno) for anno in targets]
        mixed_x = lam * images + (1 - lam) * images[index, :]
        y_a = targets
        y_b = [targets[idx] for idx in index]

        # forward
        t0 = time.time()
        out = net(mixed_x)
        # backprop
        optimizer.zero_grad()
        # loss_l, loss_c = criterion(out, priors, targets)

        loss_l1, loss_c1 = criterion(out, priors, y_a)
        loss_l2, loss_c2 = criterion(out, priors, y_b)

        loss_l = lam * loss_l1 + (1 - lam) * loss_l2
        loss_c = lam * loss_c1 + (1 - lam) * loss_c2

        loss = loss_l + loss_c
        loss.backward()
        optimizer.step()
        t1 = time.time()
        loc_loss += loss_l.item()
        conf_loss += loss_c.item()
        load_t1 = time.time()
        if iteration % 10 == 0:
            print('Epoch:' + repr(epoch) + ' || epochiter: ' +
                  repr(iteration % epoch_size) + '/' + repr(epoch_size) +
                  '|| Totel iter ' + repr(iteration) +
                  ' || L: %.4f C: %.4f||' % (loss_l.item(), loss_c.item()) +
                  'Batch time: %.4f sec. ||' % (load_t1 - load_t0) +
                  'LR: %.8f' % (lr))
        if iteration % epoch_size == 0:
            # Summary
            writer.add_scalar("conf_loss", conf_loss, iteration // epoch_size)
            writer.add_scalar("loc_loss", loc_loss, iteration // epoch_size)
            writer.add_scalar("learning rate", lr, iteration // epoch_size)

    torch.save(
        net.state_dict(), args.save_folder + 'Final_' + args.version + '_' +
        args.dataset + '.pth')
예제 #17
0
def train():
    net.train()
    epoch = 0 + args.resume_epoch
    print('Loading Dataset...')

    dataset = VOCDetection(args.training_dataset, preproc(img_dim, rgb_means),
                           AnnotationTransform())

    epoch_size = math.ceil(len(dataset) / args.batch_size)
    max_iter = args.max_epoch * epoch_size

    stepvalues = (200 * epoch_size, 250 * epoch_size)
    step_index = 0

    if args.resume_epoch > 0:
        start_iter = args.resume_epoch * epoch_size
    else:
        start_iter = 0

    for iteration in range(start_iter, max_iter):
        if iteration % epoch_size == 0:
            # create batch iterator
            batch_iterator = iter(
                data.DataLoader(dataset,
                                batch_size,
                                shuffle=True,
                                num_workers=args.num_workers,
                                collate_fn=detection_collate))
            if (epoch % 10 == 0 and epoch > 0) or (epoch % 5 == 0
                                                   and epoch > 200):
                torch.save(
                    net.state_dict(), args.save_folder + 'FaceBoxes_epoch_' +
                    repr(epoch) + '.pth')
            epoch += 1

        load_t0 = time.time()
        if iteration in stepvalues:
            step_index += 1
        lr = adjust_learning_rate(optimizer, args.gamma, epoch, step_index,
                                  iteration, epoch_size)

        # load train data
        images, targets = next(batch_iterator)
        if gpu_train:
            images = Variable(images.cuda())
            targets = [Variable(anno.cuda()) for anno in targets]
        else:
            images = Variable(images)
            targets = [Variable(anno) for anno in targets]

        # forward
        out = net(images)

        # backprop
        optimizer.zero_grad()
        loss_l, loss_c = criterion(out, priors, targets)
        loss = cfg['loc_weight'] * loss_l + loss_c
        loss.backward()
        optimizer.step()
        load_t1 = time.time()
        print('Epoch:' + repr(epoch) + ' || epochiter: ' +
              repr(iteration % epoch_size) + '/' + repr(epoch_size) +
              '|| Totel iter ' + repr(iteration) + ' || L: %.4f C: %.4f||' %
              (cfg['loc_weight'] * loss_l.item(), loss_c.item()) +
              'Batch time: %.4f sec. ||' % (load_t1 - load_t0) + 'LR: %.8f' %
              (lr))

    torch.save(net.state_dict(), args.save_folder + 'Final_FaceBoxes.pth')
예제 #18
0
logging.info("==> save eval result txt of each class to the directory of: ",
             eval_result_txt)
if not os.path.exists(eval_result_txt):
    os.makedirs(eval_result_txt)

if not os.path.exists(cachedir):
    os.makedirs(cachedir)
logging.info("==> save annotation cache file to the directory of: ", cachedir)

output_dir = get_output_dir(save_folder, "PR_curves")
logging.info("==> save detections.pkl to the directory of: ", output_dir)

comp_id = "comp4_"

dataset = VOCDetection(VOCroot, [(set_type)],
                       BaseTransform(input_size, dataset_mean),
                       AnnotationTransform())
if use_cuda:
    net = net.cuda()


class Timer(object):
    """A simple timer."""
    def __init__(self):
        self.total_time = 0.
        self.calls = 0
        self.start_time = 0.
        self.diff = 0.
        self.average_time = 0.

    def tic(self):
예제 #19
0
detector = Detect(num_classes, 0, cfg)
optimizer = optim.SGD(net.parameters(),
                      lr=args.lr,
                      momentum=args.momentum,
                      weight_decay=args.weight_decay)

criterion = MultiBoxLoss(num_classes, 0.5, True, 0, True, 3, 0.5, False)
priorbox = PriorBox(cfg)
with torch.no_grad():
    priors = priorbox.forward()
# -------------------------------------------------------------------------------------------------------------------- #
# -------------------------------------------------------------------------------------------------------------------- #
# Load dataset
print('Loading Dataset...')
if args.dataset == 'VOC':
    testset = VOCDetection(VOCroot, [('2007', 'test')], None,
                           AnnotationTransform())
    train_dataset = VOCDetection(VOCroot, train_sets,
                                 preproc(img_dim, rgb_means, rgb_std, p),
                                 AnnotationTransform())
elif args.dataset == 'COCO':
    testset = COCODetection(COCOroot, [('2017', 'val')], None)
    train_dataset = COCODetection(COCOroot, train_sets,
                                  preproc(img_dim, rgb_means, rgb_std, p))
else:
    print('Only VOC and COCO are supported now!')
    exit()
# -------------------------------------------------------------------------------------------------------------------- #

# -------------------------------------------------------------------------------------------------------------------- #
from utils.tuto4_logger import Logger_tf
logger = Logger_tf(save_folder)
예제 #20
0
def train():
    args = parse_args()
    if not os.path.exists(args.save_folder):
        os.mkdir(args.save_folder)
    if args.dataset == 'VOC':
        train_sets = [('2007', 'trainval'), ('2012', 'trainval')]
        cfg = (VOC_300, VOC_512)[args.size == '512']
    else:
        train_sets = [('2017', 'train'), ('2014', 'val')]
        cfg = (COCO_300, COCO_512)[args.size == '512']

    if args.version == 'RFB_vgg':
        from models.RFB_Net_vgg import build_rfb_vgg_net
    elif args.version == 'RFB_E_vgg':
        from models.RFB_Net_E_vgg import build_net
    elif args.version == 'RFB_mobile':
        from models.RFB_Net_mobile import build_rfb_mobilenet
        cfg = COCO_mobile_300
    else:
        print('Unkown version!')

    img_dim = (300, 512)[args.size == '512']
    rgb_means = ((104, 117, 123), (103.94, 116.78, 123.68))[args.version == 'RFB_mobile']
    p = (0.6, 0.2)[args.version == 'RFB_mobile']
    num_classes = (21, 81)[args.dataset == 'COCO']
    batch_size = args.batch_size

    print('Loading Dataset...')
    if args.dataset == 'VOC':
        dataset = VOCDetection(VOCroot, train_sets, preproc(img_dim, rgb_means, p), AnnotationTransform())
    elif args.dataset == 'COCO':
        dataset = COCODetection(COCOroot, train_sets, preproc(img_dim, rgb_means, p))
    else:
        print('Only VOC and COCO are supported now!')
        return

    net = build_rfb_mobilenet('train', img_dim, num_classes)
    if args.resume_net:
        # load resume network
        print('Loading resume network...')
        state_dict = torch.load(args.resume_net)
        # create new OrderedDict that does not contain `module.`
        from collections import OrderedDict
        new_state_dict = OrderedDict()
        for k, v in state_dict.items():
            head = k[:7]
            if head == 'module.':
                name = k[7:]  # remove `module.`
            else:
                name = k
            new_state_dict[name] = v
        net.load_state_dict(new_state_dict)
        print('Resume model load done.')
    else:
        base_weights = torch.load(args.basenet)
        print('Loading base network...')
        net.base.load_state_dict(base_weights)
        print('Base weights load done.')
        # def xavier(param):
        #     init.xavier_uniform(param)
        #
        # def weights_init(m):
        #     for key in m.state_dict():
        #         if key.split('.')[-1] == 'weight':
        #             if 'conv' in key:
        #                 init.kaiming_normal_(m.state_dict()[key], mode='fan_out')
        #             if 'bn' in key:
        #                 m.state_dict()[key][...] = 1
        #         elif key.split('.')[-1] == 'bias':
        #             m.state_dict()[key][...] = 0
    net.to(device)

    optimizer = optim.SGD(net.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay)
    criterion = MultiBoxLoss(num_classes, 0.5, True, 0, True, 3, 0.5, False).to(device)
    priorbox = PriorBox(cfg)
    with torch.no_grad():
        priors = priorbox.forward()
        priors.to(device)

    net.train()
    # loss counters
    loc_loss = 0  # epoch
    conf_loss = 0
    epoch = 0 + args.resume_epoch
    epoch_size = len(dataset) // args.batch_size
    max_iter = args.max_epoch * epoch_size

    stepvalues_VOC = (150 * epoch_size, 200 * epoch_size, 250 * epoch_size)
    stepvalues_COCO = (90 * epoch_size, 120 * epoch_size, 140 * epoch_size)
    stepvalues = (stepvalues_VOC, stepvalues_COCO)[args.dataset == 'COCO']
    print('Training', args.version, 'on', dataset.name)
    step_index = 0

    if args.resume_epoch > 0:
        start_iter = args.resume_epoch * epoch_size
    else:
        start_iter = 0

    lr = args.lr
    try:
        for iteration in range(start_iter, max_iter):
            if iteration % epoch_size == 0:
                # create batch iterator
                batch_iterator = iter(data.DataLoader(dataset, batch_size,
                                                      shuffle=True, num_workers=args.num_workers,
                                                      collate_fn=detection_collate))
                loc_loss = 0
                conf_loss = 0
                if (epoch % 10 == 0 and epoch > 0) or (epoch % 5 == 0 and epoch > 200):
                    torch.save(net.state_dict(), args.save_folder + args.version + '_' + args.dataset + '_epoches_' +
                               repr(epoch) + '.pth')
                epoch += 1

            load_t0 = time.time()
            if iteration in stepvalues:
                step_index += 1
            lr = adjust_learning_rate(args, optimizer, args.gamma, epoch, step_index, iteration, epoch_size)

            # load train data
            images, targets = next(batch_iterator)
            images = Variable(images.to(device))
            targets = [Variable(anno.to(device)) for anno in targets]
            print(images)
            print(targets)

            # forward
            t0 = time.time()
            out = net(images)
            # backprop
            optimizer.zero_grad()
            loss_l, loss_c = criterion(out, priors, targets)
            loss = loss_l + loss_c
            loss.backward()
            optimizer.step()
            t1 = time.time()
            loc_loss += loss_l.item()
            conf_loss += loss_c.item()
            load_t1 = time.time()
            if iteration % 10 == 0:
                print('Epoch:' + repr(epoch) + ' || epochiter: ' + repr(iteration % epoch_size) + '/' + repr(epoch_size)
                      + '|| Totel iter ' +
                      repr(iteration) + ' || L: %.4f C: %.4f||' % (
                          loss_l.item(), loss_c.item()) +
                      'Batch time: %.4f sec. ||' % (load_t1 - load_t0) + 'LR: %.8f' % (lr))
    except KeyboardInterrupt:
        print('Interrupted, try saving model...')
        torch.save(net.state_dict(), args.save_folder +
                   'Final_' + args.version + '_' + args.dataset + '.pth')
    torch.save(net.state_dict(), args.save_folder +
               'Final_' + args.version + '_' + args.dataset + '.pth')
예제 #21
0
from torch.autograd import Variable
import numpy as np
import cv2
from matplotlib import pyplot as plt
from data import VOCDetection, VOC_ROOT, VOCAnnotationTransform
from ssd import build_ssd

if torch.cuda.is_available():
    torch.set_default_tensor_type('torch.cuda.FloatTensor')

net = build_ssd('test', 300, 21)    # initialize SSD
net.load_weights('weights/ssd300_mAP_77.43_v2.pth')


# here we specify year (07 or 12) and dataset ('test', 'val', 'train')
testset = VOCDetection(VOC_ROOT, [('2007', 'val')], None, VOCAnnotationTransform())
img_id = 345  # change here for image id
image, image_name = testset.pull_image(img_id)
print(image_name)
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# View the sampled input image before transform
# plt.figure(figsize=(6,6))
# plt.imshow(rgb_image)
# plt.show()


def base_transform(image):
    x = cv2.resize(image, (300, 300)).astype(np.float32)
    x -= (104.0, 117.0, 123.0)
    x = x.astype(np.float32)
    x = x[:, :, ::-1].copy()
예제 #22
0
def train():
    net.train()
    epoch = 0 + args.resume_epoch
    print('Loading Dataset...')

    dataset = VOCDetection(training_dataset, preproc(img_dim, rgb_mean),
                           AnnotationTransform())

    epoch_size = math.ceil(len(dataset) / batch_size)
    max_iter = max_epoch * epoch_size

    stepvalues = (200 * epoch_size, 250 * epoch_size)
    step_index = 0

    if args.resume_epoch > 0:
        start_iter = args.resume_epoch * epoch_size
    else:
        start_iter = 0

    for iteration in range(start_iter, max_iter):
        if iteration % epoch_size == 0:
            # create batch iterator
            batch_iterator = iter(
                data.DataLoader(dataset,
                                batch_size,
                                shuffle=True,
                                num_workers=num_workers,
                                collate_fn=detection_collate))
            if (epoch % 10 == 0 and epoch > 0) or (epoch % 5 == 0
                                                   and epoch > 200):
                torch.save(
                    net.state_dict(),
                    save_folder + 'FaceBoxes_epoch_' + str(epoch) + '.pth')
            epoch += 1

        load_t0 = time.time()
        if iteration in stepvalues:
            step_index += 1
        lr = adjust_learning_rate(optimizer, gamma, epoch, step_index,
                                  iteration, epoch_size)

        # load train data
        images, targets = next(batch_iterator)
        images = images.to(device)
        targets = [anno.to(device) for anno in targets]

        # forward
        out = net(images)

        # backprop
        optimizer.zero_grad()
        loss_l, loss_c = criterion(out, priors, targets)
        loss = cfg['loc_weight'] * loss_l + loss_c
        loss.backward()
        optimizer.step()
        load_t1 = time.time()
        batch_time = load_t1 - load_t0
        eta = int(batch_time * (max_iter - iteration))
        print(
            'Epoch:{}/{} || Epochiter: {}/{} || Iter: {}/{} || L: {:.4f} C: {:.4f} || LR: {:.8f} || Batchtime: {:.4f} s || ETA: {}'
            .format(epoch, max_epoch, (iteration % epoch_size) + 1,
                    epoch_size, iteration + 1, max_iter, loss_l.item(),
                    loss_c.item(), lr, batch_time,
                    str(datetime.timedelta(seconds=eta))))

    torch.save(net.state_dict(), save_folder + 'Final_FaceBoxes.pth')
예제 #23
0
def evaluate_detections(box_list, output_dir, dataset):
    write_voc_results_file(box_list, dataset)
    do_python_eval(output_dir)


if __name__ == '__main__':
    # load net
    num_classes = len(labelmap) + 1  # +1 for background
    net = build_refinedet('test', int(args.input_size),
                          num_classes)  # initialize SSD
    net.load_state_dict(torch.load(args.trained_model))
    net.eval()
    print('Finished loading model!')
    # load data
    dataset = VOCDetection(args.voc_root, [('2007', set_type)],
                           BaseTransform(int(args.input_size), dataset_mean),
                           VOCAnnotationTransform())
    if args.cuda:
        net = net.cuda()
        cudnn.benchmark = True
    # evaluation
    test_net(args.save_folder,
             net,
             args.cuda,
             dataset,
             BaseTransform(net.size, dataset_mean),
             args.top_k,
             int(args.input_size),
             thresh=args.confidence_threshold)
예제 #24
0
else:
    print('Unkown version!')

priorbox = PriorBox(cfg)
with torch.no_grad():
    priors = priorbox.forward()
    if args.cuda:
        priors = priors.cuda()

# define test data set
img_size = (300, 512)[args.size == '512']
rgb_mean = (104, 117, 123)
img_set = ('SDYY', 'test')

transform = ImageAugment(img_size, rgb_mean)
testset = VOCDetection(VOCroot, img_set, CLASSES, transform)
num_classes = len(testset.classes)

# define net and load weight
net = build_net('test', img_size, num_classes)
state_dict = torch.load(args.trained_model)
new_state_dict = OrderedDict()
for k, v in state_dict.items():
    head = k[:7]
    if head == 'module.':
        name = k[7:]  # remove `module.`
    else:
        name = k
    new_state_dict[name] = v

# load new state dict
예제 #25
0
def train():
    net.train()
    # loss counters
    loc_loss = 0  # epoch
    conf_loss = 0
    epoch = 0 + args.resume_epoch
    print('Loading Dataset...')

    if args.dataset == 'VOC':
        dataset = VOCDetection(VOCroot, train_sets,
                               preproc(img_dim, rgb_means, p),
                               AnnotationTransform())
    elif args.dataset == 'COCO':
        dataset = COCODetection(COCOroot, train_sets,
                                preproc(img_dim, rgb_means, p))
    else:
        print('Only VOC and COCO are supported now!')
        return

    epoch_size = len(dataset) // args.batch_size
    max_iter = args.max_epoch * epoch_size

    stepvalues_VOC = (150 * epoch_size, 200 * epoch_size, 250 * epoch_size)
    stepvalues_COCO = (90 * epoch_size, 120 * epoch_size, 140 * epoch_size)
    stepvalues = (stepvalues_VOC, stepvalues_COCO)[args.dataset == 'COCO']
    print('Training', args.version, 'on', dataset.name)
    step_index = 0

    if args.resume_epoch > 0:
        start_iter = args.resume_epoch * epoch_size
    else:
        start_iter = 0

    lr = args.lr
    for iteration in range(start_iter, max_iter):
        if iteration % epoch_size == 0:
            # create batch iterator
            batch_iterator = iter(
                data.DataLoader(dataset,
                                batch_size,
                                shuffle=True,
                                num_workers=args.num_workers,
                                collate_fn=detection_collate))
            loc_loss = 0
            conf_loss = 0
            if (epoch % 10 == 0 and epoch > 0) or (epoch % 5 == 0
                                                   and epoch > 200):
                torch.save(
                    net.state_dict(),
                    'delete10_11_' + args.save_folder + args.version + '_' +
                    args.dataset + '_epoches_' + repr(epoch) + '.pth')
            epoch += 1

        load_t0 = time.time()
        if iteration in stepvalues:
            step_index += 1
        lr = adjust_learning_rate(optimizer, args.gamma, epoch, step_index,
                                  iteration, epoch_size)

        # load train data
        images, targets = next(batch_iterator)

        #print(np.sum([torch.sum(anno[:,-1] == 2) for anno in targets]))

        if args.cuda:
            images = Variable(images.cuda())
            targets = [Variable(anno.cuda()) for anno in targets]
        else:
            images = Variable(images)
            targets = [Variable(anno) for anno in targets]
        # forward
        t0 = time.time()
        out = net(images)
        # backprop
        optimizer.zero_grad()
        loss_l, loss_c = criterion(out, priors, targets)
        loss = loss_l + loss_c
        loss.backward()
        optimizer.step()
        t1 = time.time()
        loc_loss += loss_l.item()
        conf_loss += loss_c.item()
        load_t1 = time.time()
        if iteration % 10 == 0:
            print('Epoch:' + repr(epoch) + ' || epochiter: ' +
                  repr(iteration % epoch_size) + '/' + repr(epoch_size) +
                  '|| Totel iter ' + repr(iteration) +
                  ' || L: %.4f C: %.4f||' % (loss_l.item(), loss_c.item()) +
                  'Batch time: %.4f sec. ||' % (load_t1 - load_t0) +
                  'LR: %.8f' % (lr))

    torch.save(
        net.state_dict(), args.save_folder + 'Final_' + args.version + '_' +
        args.dataset + '.pth')
예제 #26
0
def test():
    # get device
    if args.cuda:
        print('use cuda')
        cudnn.benchmark = True
        device = torch.device("cuda")
    else:
        device = torch.device("cpu")

    # load net
    num_classes = 80
    if args.dataset == 'COCO':
        cfg = config.coco_ab
        testset = COCODataset(data_dir=args.dataset_root,
                              json_file='instances_val2017.json',
                              name='val2017',
                              img_size=cfg['min_dim'][0],
                              debug=args.debug)
    elif args.dataset == 'VOC':
        cfg = config.voc_ab
        testset = VOCDetection(VOC_ROOT, [('2007', 'test')], None,
                               VOCAnnotationTransform())

    if args.version == 'yolo_v2':
        from models.yolo_v2 import myYOLOv2
        net = myYOLOv2(device,
                       input_size=cfg['min_dim'],
                       num_classes=num_classes,
                       anchor_size=config.ANCHOR_SIZE_COCO)
        print('Let us test yolo-v2 on the MSCOCO dataset ......')

    elif args.version == 'yolo_v3':
        from models.yolo_v3 import myYOLOv3
        net = myYOLOv3(device,
                       input_size=cfg['min_dim'],
                       num_classes=num_classes,
                       anchor_size=config.MULTI_ANCHOR_SIZE_COCO)

    elif args.version == 'tiny_yolo_v2':
        from models.tiny_yolo_v2 import YOLOv2tiny
        net = YOLOv2tiny(device,
                         input_size=cfg['min_dim'],
                         num_classes=num_classes,
                         anchor_size=config.ANCHOR_SIZE_COCO)

    elif args.version == 'tiny_yolo_v3':
        from models.tiny_yolo_v3 import YOLOv3tiny

        net = YOLOv3tiny(device,
                         input_size=cfg['min_dim'],
                         num_classes=num_classes,
                         anchor_size=config.MULTI_ANCHOR_SIZE_COCO)

    net.load_state_dict(torch.load(args.trained_model, map_location='cuda'))
    net.to(device).eval()
    print('Finished loading model!')

    # evaluation
    test_net(net,
             device,
             testset,
             BaseTransform(net.input_size,
                           mean=(0.406, 0.456, 0.485),
                           std=(0.225, 0.224, 0.229)),
             thresh=args.visual_threshold)
예제 #27
0
        backbone = 'd-53'

        yolo_net = YOLOv3SPP(device,
                             input_size=input_size,
                             num_classes=num_classes,
                             anchor_size=anchor_size,
                             backbone=backbone,
                             diou_nms=args.diou_nms)
        print('Let us test yolo-v3-spp on the VOC dataset ......')

    else:
        print('Unknown version !!!')
        exit()

    # load net
    yolo_net.load_state_dict(
        torch.load(args.trained_model, map_location='cuda'))
    yolo_net.eval()
    print('Finished loading model!')
    # load data
    dataset = VOCDetection(
        args.voc_root, [('2007', set_type)],
        BaseTransform(yolo_net.input_size,
                      mean=(0.406, 0.456, 0.485),
                      std=(0.225, 0.224, 0.229)), VOCAnnotationTransform())
    yolo_net = yolo_net.to(device)

    # evaluation
    with torch.no_grad():
        test_net(yolo_net, dataset, device, input_size)
예제 #28
0
파일: train.py 프로젝트: wjgaas/PytorchSSD
def train():
    net.train()
    # loss counters
    loc_loss = 0  # epoch
    conf_loss = 0
    epoch = 0 + args.resume_epoch
    print('Loading Dataset...')

    if args.dataset == 'VOC':
        dataset = VOCDetection(VOCroot, train_sets,
                               preproc(img_dim, rgb_means, p),
                               AnnotationTransform())
    elif args.dataset == 'COCO':
        dataset = COCODetection(COCOroot, train_sets,
                                preproc(img_dim, rgb_means, p))
    else:
        print('Only VOC and COCO are supported now!')
        return

    epoch_size = len(dataset) // args.batch_size
    max_iter = args.max_epoch * epoch_size

    stepvalues_VOC = (150 * epoch_size, 200 * epoch_size, 250 * epoch_size)
    stepvalues_COCO = (90 * epoch_size, 120 * epoch_size, 140 * epoch_size)
    stepvalues = (stepvalues_VOC, stepvalues_COCO)[args.dataset == 'COCO']
    print('Training', args.version, 'on', dataset.name)
    step_index = 0

    if args.visdom:
        # initialize visdom loss plot
        lot = viz.line(X=torch.zeros((1, )).cpu(),
                       Y=torch.zeros((1, 3)).cpu(),
                       opts=dict(xlabel='Iteration',
                                 ylabel='Loss',
                                 title='Current SSD Training Loss',
                                 legend=['Loc Loss', 'Conf Loss', 'Loss']))
        epoch_lot = viz.line(X=torch.zeros((1, )).cpu(),
                             Y=torch.zeros((1, 3)).cpu(),
                             opts=dict(
                                 xlabel='Epoch',
                                 ylabel='Loss',
                                 title='Epoch SSD Training Loss',
                                 legend=['Loc Loss', 'Conf Loss', 'Loss']))
    if args.resume_epoch > 0:
        start_iter = args.resume_epoch * epoch_size
    else:
        start_iter = 0

    lr = args.lr
    log_file = open(log_file_path, 'a')
    for iteration in range(start_iter, max_iter):
        if iteration % epoch_size == 0:
            # create batch iterator
            batch_iterator = iter(
                data.DataLoader(dataset,
                                batch_size,
                                shuffle=True,
                                num_workers=args.num_workers,
                                collate_fn=detection_collate))
            loc_loss = 0
            conf_loss = 0
            if epoch % args.save_frequency == 0 and epoch > 0:
                torch.save(
                    net.state_dict(), save_folder + args.version + '_' +
                    args.dataset + '_epoches_' + repr(epoch) + '.pth')
            epoch += 1

        load_t0 = time.time()
        if iteration in stepvalues:
            step_index += 1
            if args.visdom:
                viz.line(
                    X=torch.ones((1, 3)).cpu() * epoch,
                    Y=torch.Tensor([loc_loss, conf_loss, loc_loss + conf_loss
                                    ]).unsqueeze(0).cpu() / epoch_size,
                    win=epoch_lot,
                    update='append')
        lr = adjust_learning_rate(optimizer, args.gamma, epoch, step_index,
                                  iteration, epoch_size)

        # load train data
        images, targets = next(batch_iterator)

        #print(np.sum([torch.sum(anno[:,-1] == 2) for anno in targets]))

        if args.cuda:
            images = Variable(images.cuda())
            targets = [
                Variable(anno.cuda(), volatile=True) for anno in targets
            ]
        else:
            images = Variable(images)
            targets = [Variable(anno, volatile=True) for anno in targets]
        # forward
        t0 = time.time()
        out = net(images)
        # backprop
        optimizer.zero_grad()
        loss_l, loss_c = criterion(out, priors, targets)
        loss = loss_l + loss_c
        loss.backward()
        optimizer.step()
        t1 = time.time()
        loc_loss += loss_l.data[0]
        conf_loss += loss_c.data[0]
        load_t1 = time.time()
        if iteration % 10 == 0:
            print('Epoch:' + repr(epoch) + ' || epochiter: ' +
                  repr(iteration % epoch_size) + '/' + repr(epoch_size) +
                  '|| Totel iter ' + repr(iteration) +
                  ' || L: %.4f C: %.4f||' % (loss_l.data[0], loss_c.data[0]) +
                  'Batch time: %.4f sec. ||' % (load_t1 - load_t0) +
                  'LR: %.8f' % (lr))
            log_file.write('Epoch:' + repr(epoch) + ' || epochiter: ' +
                           repr(iteration % epoch_size) + '/' +
                           repr(epoch_size) + '|| Totel iter ' +
                           repr(iteration) + ' || L: %.4f C: %.4f||' %
                           (loss_l.data[0], loss_c.data[0]) +
                           'Batch time: %.4f sec. ||' % (load_t1 - load_t0) +
                           'LR: %.8f' % (lr) + '\n')
            if args.visdom and args.send_images_to_visdom:
                random_batch_index = np.random.randint(images.size(0))
                viz.image(images.data[random_batch_index].cpu().numpy())
        if args.visdom:
            viz.line(X=torch.ones((1, 3)).cpu() * iteration,
                     Y=torch.Tensor([
                         loss_l.data[0], loss_c.data[0],
                         loss_l.data[0] + loss_c.data[0]
                     ]).unsqueeze(0).cpu(),
                     win=lot,
                     update='append')
            if iteration == 0:
                viz.line(X=torch.zeros((1, 3)).cpu(),
                         Y=torch.Tensor(
                             [loc_loss, conf_loss,
                              loc_loss + conf_loss]).unsqueeze(0).cpu(),
                         win=epoch_lot,
                         update=True)
    log_file.close()
    torch.save(
        net.state_dict(),
        save_folder + 'Final_' + args.version + '_' + args.dataset + '.pth')
예제 #29
0
def train():
    net.train()
    # loss counters
    loc_loss = 0  # epoch
    conf_loss = 0
    epoch = 0
    print('Loading Dataset...')

    dataset = VOCDetection(args.voc_root, train_sets, SSDAugmentation(
        ssd_dim, means), AnnotationTransform())

    epoch_size = len(dataset) // args.batch_size
    print('Training SSD on', dataset.name)
    step_index = 0
    if args.visdom:
        # initialize visdom loss plot
        lot = viz.line(
            X=torch.zeros((1,)).cpu(),
            Y=torch.zeros((1, 3)).cpu(),
            opts=dict(
                xlabel='Iteration',
                ylabel='Loss',
                title='Current SSD Training Loss',
                legend=['Loc Loss', 'Conf Loss', 'Loss']
            )
        )
        epoch_lot = viz.line(
            X=torch.zeros((1,)).cpu(),
            Y=torch.zeros((1, 3)).cpu(),
            opts=dict(
                xlabel='Epoch',
                ylabel='Loss',
                title='Epoch SSD Training Loss',
                legend=['Loc Loss', 'Conf Loss', 'Loss']
            )
        )
    batch_iterator = None
    data_loader = data.DataLoader(dataset, batch_size, num_workers=args.num_workers,
                                  shuffle=True, collate_fn=detection_collate, pin_memory=True)
    for iteration in range(args.start_iter, max_iter):
        if (not batch_iterator) or (iteration % epoch_size == 0):
            # create batch iterator
            batch_iterator = iter(data_loader)
        if iteration in stepvalues:
            step_index += 1
            adjust_learning_rate(optimizer, args.gamma, step_index)
            if args.visdom:
                viz.line(
                    X=torch.ones((1, 3)).cpu() * epoch,
                    Y=torch.Tensor([loc_loss, conf_loss,
                        loc_loss + conf_loss]).unsqueeze(0).cpu() / epoch_size,
                    win=epoch_lot,
                    update='append'
                )
            # reset epoch loss counters
            loc_loss = 0
            conf_loss = 0
            epoch += 1

        # load train data
        images, targets = next(batch_iterator)

        #print('--', images[0].size())

        if args.cuda:
            images = Variable(images.cuda())
            targets = [Variable(anno.cuda(), volatile=True) for anno in targets]
        else:
            images = Variable(images)
            targets = [Variable(anno, volatile=True) for anno in targets]
        # forward
        t0 = time.time()
        out = net(images)
        # backprop
        optimizer.zero_grad()
        loss_l, loss_c = criterion(out, targets)
        loss = loss_l + loss_c

        loss.backward()
        optimizer.step()
        t1 = time.time()
        loc_loss += loss_l.data[0]
        conf_loss += loss_c.data[0]
        if iteration % 10 == 0:
            print('Timer: %.4f sec.' % (t1 - t0))
            print('iter ' + repr(iteration) + ' || Loss: %.4f ||' % (loss.data[0]), end=' ')
            if args.visdom and args.send_images_to_visdom:
                random_batch_index = np.random.randint(images.size(0))
                viz.image(images.data[random_batch_index].cpu().numpy())
        if args.visdom:
            viz.line(
                X=torch.ones((1, 3)).cpu() * iteration,
                Y=torch.Tensor([loss_l.data[0], loss_c.data[0],
                    loss_l.data[0] + loss_c.data[0]]).unsqueeze(0).cpu(),
                win=lot,
                update='append'
            )
            # hacky fencepost solution for 0th epoch plot
            if iteration == 0:
                viz.line(
                    X=torch.zeros((1, 3)).cpu(),
                    Y=torch.Tensor([loc_loss, conf_loss,
                        loc_loss + conf_loss]).unsqueeze(0).cpu(),
                    win=epoch_lot,
                    update=True
                )
        if iteration % 5000 == 0:
            print('Saving state, iter:', iteration)
            torch.save(ssd_net.state_dict(), '/media/maxiaoyu/data/checkpoint/weights/ssd300_0712_' + repr(iteration) + '.pth')
        #print('finish one iterate')

    # used for eval
    torch.save(ssd_net.state_dict(), args.save_folder + '' + args.version + '.pth')
예제 #30
0
def do_test(args, model, detector, max_per_image=200, thresh=0.01):
    if args.dataset == 'VOC':
        dataset = VOCDetection(
            args, VOCroot, [('2007', 'test')], None,
            AnnotationTransform(0 if args.setting ==
                                'transfer' else args.split), True)
    elif args.dataset == 'COCO':
        dataset = COCODetection(COCOroot, [('2014', 'split_nonvoc_minival')],
                                None)
    else:
        raise ValueError(f"Unknown dataset: {args.dataset}")

    num_images = len(dataset)
    all_boxes = [[[] for _ in range(num_images)] for _ in range(num_classes)]
    transform = BaseTransform(model.size, rgb_means, (2, 0, 1))

    _t = {'im_detect': Timer(), 'misc': Timer()}
    det_file = os.path.join(args.save_folder, 'detections.pkl')

    if args.retest:
        f = open(det_file, 'rb')
        all_boxes = pickle.load(f)
        logger.info('Evaluating detections')
        dataset.evaluate_detections(all_boxes, args.save_folder)
        return

    for i in range(num_images):
        img = dataset.pull_image(i)
        scale = torch.Tensor(
            [img.shape[1], img.shape[0], img.shape[1],
             img.shape[0]]).to(model.device)
        with torch.no_grad():
            x = transform(img).unsqueeze(0)

        _t['im_detect'].tic()

        pred = model(x)  # forward pass
        boxes, scores = detector.forward(pred, priors)
        detect_time = _t['im_detect'].toc()
        boxes = boxes[0]  # percent and point form detection boxes
        scores = scores[0]  # [1, num_priors, num_classes]

        boxes *= scale  # scale each detection back up to the image
        boxes = boxes.cpu().numpy()
        scores = scores.cpu().numpy()

        _t['misc'].tic()

        for j in range(1, num_classes):
            inds = np.where(scores[:, j] > thresh)[0]
            if len(inds) == 0:
                all_boxes[j][i] = np.empty([0, 5], dtype=np.float32)
                continue
            c_bboxes = boxes[inds]
            c_scores = scores[inds, j]
            c_dets = np.hstack(
                (c_bboxes, c_scores[:, np.newaxis])).astype(np.float32,
                                                            copy=False)

            keep = nms(c_dets, 0.45, force_cpu=args.cpu)
            c_dets = c_dets[keep, :]
            all_boxes[j][i] = c_dets
        if max_per_image > 0:
            image_scores = np.hstack(
                [all_boxes[j][i][:, -1] for j in range(1, num_classes)])
            if len(image_scores) > max_per_image:
                image_thresh = np.sort(image_scores)[-max_per_image]
                for j in range(1, num_classes):
                    keep = np.where(all_boxes[j][i][:, -1] >= image_thresh)[0]
                    all_boxes[j][i] = all_boxes[j][i][keep, :]

        nms_time = _t['misc'].toc()

        if i % 20 == 0:
            logger.info('im_detect: {:d}/{:d} {:.3f}s {:.3f}s'.format(
                i + 1, num_images, detect_time, nms_time))
            _t['im_detect'].clear()
            _t['misc'].clear()

    with open(det_file, 'wb') as f:
        pickle.dump(all_boxes, f, pickle.HIGHEST_PROTOCOL)

    logger.info('Evaluating detections')
    dataset.evaluate_detections(all_boxes, args.save_folder)