def train(
    epoch: int,
    dataset: tf.data.Dataset,
    model: tf.keras.models.Model,
    loss_fn: LossFunction,
    optimizer: tf.optimizers.Optimizer,
    args: dict,
    metrics: dict,
):
    #for batch_idx, data in enumerate(dataset):
    train_iter = dataset.take(10000 // hvd.size())
    compress = args.get('fp16_allreduce', True)
    log_interval = args.get('log_interval', 10)
    for batch_idx, data in enumerate(train_iter):
        first_batch = (epoch == 0 and batch_idx == 0)
        loss, output = train_step(data,
                                  model,
                                  loss_fn,
                                  optimizer,
                                  first_batch,
                                  compress=compress)
        metrics['train_accuracy'].update_state(data[1], output)

        if batch_idx % log_interval == 0:
            metrics_ = {
                'epoch': epoch,
                'loss': loss,
                'accuracy': metrics['train_accuracy'].result(),
            }
            io.print_metrics(metrics_, pre=f'[{hvd.rank()}] ', logger=logger)
示例#2
0
def evaluate_mcmot_seq(gt_path, res_path):
    """
    """
    if not (os.path.isfile(gt_path) and os.path.isfile(gt_path)):
        print('[Err]: invalid file path.')
        return

    # metric_name2id = defaultdict(int)
    # metric_id2name = defaultdict(str)
    # for id, name in enumerate(metric_names):
    #     metric_id2name[id] = name
    #     metric_name2id[name] = id

    # read txt file
    trackDB = read_txt_to_struct(res_path)
    gtDB = read_txt_to_struct(gt_path)

    # compute for each object class
    metrics = np.zeros((len(id2cls.keys()), len(metric_names)), dtype=float)
    for cls_id in id2cls.keys():
        selected = np.where(cls_id == gtDB[:, 7])[0]
        cls_gtDB = gtDB[selected]
        print('gt: {:d} items for object class {:s}'.format(
            len(cls_gtDB), id2cls[cls_id]))
        if len(cls_gtDB) == 0:
            continue

        selected = np.where(cls_id == trackDB[:, 7])[0]
        cls_resDB = trackDB[selected]
        print('res: {:d} items for object class {:s}'.format(
            len(cls_resDB), id2cls[cls_id]))
        if len(cls_resDB) == 0:
            continue

        # ---------- main function to do evaluation
        cls_metrics, cls_extra_info = evaluate_seq(cls_resDB,
                                                   cls_gtDB,
                                                   distractor_ids=None)
        metrics[cls_id] = cls_metrics
        # ----------

        print_metrics('Seq evaluation for class {:s}'.format(id2cls[cls_id]),
                      cls_metrics)

    # ---------- mean of the metrics
    mean_metrics = metrics.mean(axis=0)  # mean value of each column
    print_metrics('Seq evaluation mean metrics:', mean_metrics)
示例#3
0
def evaluate_tracking(sequences, track_dir, gt_dir):
    all_info = []
    for seqname in sequences:
        track_res = os.path.join(track_dir, seqname, 'res.txt')
        gt_file = os.path.join(gt_dir, seqname, 'gt.txt')
        assert os.path.exists(track_res) and os.path.exists(
            gt_file
        ), 'Either tracking result or groundtruth directory does not exist'

        trackDB = read_txt_to_struct(track_res)
        gtDB = read_txt_to_struct(gt_file)

        gtDB, distractor_ids = extract_valid_gt_data(gtDB)
        metrics, extra_info = evaluate_sequence(trackDB, gtDB, distractor_ids)
        print_metrics(seqname + ' Evaluation', metrics)
        all_info.append(extra_info)
    all_metrics = evaluate_bm(all_info)
    print_metrics('Summary Evaluation', all_metrics)
示例#4
0
def evaluate_seqs(seqs, track_dir, gt_dir):
    all_info = []
    for seq_name in seqs:  # process every seq
        track_res = os.path.join(track_dir, seq_name, 'res.txt')
        gt_file = os.path.join(gt_dir, seq_name, 'gt.txt')
        assert os.path.exists(track_res) and os.path.exists(gt_file), \
            'Either tracking result {} or ' \
            'groundtruth directory {} does not exist'.format(track_res, gt_file)

        trackDB = read_txt_to_struct(track_res)  # track result
        gtDB = read_txt_to_struct(gt_file)  # ground truth

        # filtering for specific class id
        gtDB, distractor_ids = extract_valid_gt_data(gtDB)

        # ---------- main function to do evaluation
        metrics, extra_info = evaluate_seq(trackDB, gtDB, distractor_ids)
        # ----------

        print_metrics(seq_name + ' Evaluation', metrics)
        all_info.append(extra_info)

    all_metrics = evaluate_bm(all_info)
    print_metrics('Summary Evaluation', all_metrics)
def train(
    epoch: int,
    data: DistributedDataObject,
    device: torch.device,
    rank: int,
    model: nn.Module,
    loss_fn: LossFunction,
    optimizer: optim.Optimizer,
    args: dict,
    scaler: GradScaler = None,
):
    model.train()
    # Horovod: set epoch to sampler for shuffling
    data.sampler.set_epoch(epoch)
    running_loss = torch.tensor(0.0)
    training_acc = torch.tensor(0.0)
    if torch.cuda.is_available():
        running_loss = running_loss.to(device)
        training_acc = training_acc.to(device)

    for batch_idx, (batch, target) in enumerate(data.loader):
        if torch.cuda.is_available():
            batch, target = batch.to(device), target.to(device)

        optimizer.zero_grad()
        output = model(batch)
        loss = loss_fn(output, target)

        if scaler is not None:
            scaler.scale(loss).backward()
            scaler.step(optimizer)
            scaler.update()
        else:
            loss.backward()
            optimizer.step()

        pred = output.data.max(1, keepdim=True)[1]
        acc = pred.eq(target.data.view_as(pred)).cpu().float().sum()

        training_acc += acc
        running_loss += loss.item()

        if batch_idx % args.log_interval == 0:
            metrics_ = {
                'epoch': epoch,
                'batch_loss': loss.item() / args.batch_size,
                'running_loss': running_loss / len(data.sampler),
                'batch_acc': acc.item() / args.batch_size,
                'training_acc': training_acc / len(data.sampler),
            }

            jdx = batch_idx * len(batch)
            frac = 100. * batch_idx / len(data.loader)
            pre = [
                f'[{rank}]',
                f'[{jdx:>5}/{len(data.sampler):<5} ({frac:>03.1f}%)]'
            ]
            io.print_metrics(metrics_, pre=pre, logger=logger)

    running_loss = running_loss / len(data.sampler)
    training_acc = training_acc / len(data.sampler)
    loss_avg = metric_average(running_loss)
    training_acc = metric_average(training_acc)
    if rank == 0:
        logger.log(f'training set; avg loss: {loss_avg:.4g}, '
                   f'accuracy: {training_acc * 100:.2f}%')