Exemple #1
0
    bboxes = []
    for i in range(detections.size(1)):
        j = 0
        while detections[0, i, j, 0] >= thresh:
            box = []
            score = detections[0, i, j, 0]
            pt = (detections[0, i, j, 1:] * scale).cpu().numpy().astype(np.int)
            j += 1
            box += [pt[0], pt[1], pt[2] - pt[0], pt[3] - pt[1], score]
            bboxes += [box]

    return bboxes


if __name__ == '__main__':
    net = build_net('test', cfg.NUM_CLASSES)
    net.load_state_dict(torch.load(args.model))
    net.eval()

    if use_cuda:
        net.cuda()
        cudnn.benckmark = True

    #transform = S3FDBasicTransform(cfg.INPUT_SIZE, cfg.MEANS)

    counter = 0

    for i in range(10):
        txt_in = os.path.join(FDDB_FOLD_DIR, 'FDDB-fold-%02d.txt' % (i + 1))
        txt_out = os.path.join(FDDB_RESULT_DIR, 'fold-%02d-out.txt' % (i + 1))
        answer_in = os.path.join(FDDB_FOLD_DIR,
Exemple #2
0
def train():
    iteration = 0
    start_epoch = 0
    step_index = 0
    per_epoch_size = len(train_dataset) // args.batch_size

    pyramidbox = build_net('train', cfg.NUM_CLASSES)
    net = pyramidbox
    if args.resume:
        print(('Resuming training, loading {}...'.format(args.resume)))
        state_dict = torch.load(args.resume)
        net.load_state_dict(state_dict)
        #iteration = int(args.resume[args.resume.rfind('pyramidbox_')+len('pyramidbox_'):-4])
        #start_epoch = iteration // per_epoch_size
        #print('Start iteration: %d (epoch %d)'%(iteration, start_epoch))
    else:
        vgg_weights = torch.load(args.save_folder + args.basenet)
        print('Load base network....')
        net.vgg.load_state_dict(vgg_weights)

    if args.cuda:
        torch.backends.cudnn.benchmark = True
        if args.multigpu:
            net = torch.nn.DataParallel(pyramidbox)
        net = net.cuda()

    if not args.resume:
        print('Initializing weights...')
        pyramidbox.extras.apply(pyramidbox.weights_init)
        pyramidbox.lfpn_topdown.apply(pyramidbox.weights_init)
        pyramidbox.lfpn_later.apply(pyramidbox.weights_init)
        pyramidbox.cpm.apply(pyramidbox.weights_init)
        pyramidbox.loc_layers.apply(pyramidbox.weights_init)
        pyramidbox.conf_layers.apply(pyramidbox.weights_init)


    optimizer = optim.SGD(net.parameters(), lr=args.lr, momentum=args.momentum,
                          weight_decay=args.weight_decay)
    criterion1 = MultiBoxLoss(cfg, args.cuda)
    criterion2 = MultiBoxLoss(cfg, args.cuda, use_head_loss=True)
    print('Loading wider dataset...')
    print('Using the specified args:')
    print(args)
    for step in cfg.LR_STEPS:
        if iteration > step:
            step_index += 1
            adjust_learning_rate(optimizer, args.gamma, step_index)

    net.train()
    for epoch in range(start_epoch, cfg.EPOCHES):
        losses = 0
        for batch_idx, (images, face_targets, head_targets) in enumerate(train_loader):
            with torch.no_grad():
                if args.cuda:
                    images = Variable(images.cuda())
                    face_targets = [Variable(ann.cuda())
                                    for ann in face_targets]
                    head_targets = [Variable(ann.cuda())
                                    for ann in head_targets]
                else:
                    images = Variable(images)
                    face_targets = [Variable(ann)
                                    for ann in face_targets]
                    head_targets = [Variable(ann)
                                    for ann in head_targets]

            if iteration in cfg.LR_STEPS:
                step_index += 1
                adjust_learning_rate(optimizer, args.gamma, step_index)

            t0 = time.time()
            out = net(images)
            # backprop
            optimizer.zero_grad()
            face_loss_l, face_loss_c = criterion1(out, face_targets)
            head_loss_l, head_loss_c = criterion2(out, head_targets)
            loss = face_loss_l + face_loss_c + head_loss_l + head_loss_c
            losses += loss.item()
            loss.backward()
            optimizer.step()
            t1 = time.time()
            face_loss = (face_loss_l + face_loss_c).item()
            head_loss = (head_loss_l + head_loss_c).item()

            if iteration % 10 == 0:
                loss_ = losses / (batch_idx + 1)
                print(('Timer: {:.4f} sec.'.format(t1 - t0)))
                print(('epoch ' + repr(epoch) + ' iter ' +
                      repr(iteration) + ' || Loss:%.4f' % (loss_)))
                print(('->> face Loss: {:.4f} || head loss : {:.4f}'.format(
                    face_loss, head_loss)))
                print(('->> lr: {}'.format(optimizer.param_groups[0]['lr'])))

            if iteration != 0 and iteration % 5000 == 0:
                print(('Saving state, iter:', iteration))
                file = 'pyramidbox_' + repr(iteration) + '.pth'
                torch.save(pyramidbox.state_dict(),
                           os.path.join(args.save_folder, file))
            iteration += 1
        logger.add_scalar('data/loss', loss, epoch)
        logger.add_scalar('data/face_loss', face_loss, epoch)
        logger.add_scalar('data/head_loss', head_loss, epoch)
        val(epoch, net, pyramidbox, criterion1, criterion2)