예제 #1
0
def test(test_loader, target_net):
    box_num = 0
    correct_cnt, total_cnt = 0., 0.
    print '========== Testing ======='

    results = []

    batch_time = network.AverageMeter()
    end = time.time()
    im_counter = 0
    for i, sample in enumerate(test_loader):
        correct_cnt_t, total_cnt_t = 0., 0.
        # Forward pass
        im_data = Variable(sample['visual'].cuda(), volatile=True)
        im_counter += im_data.size(0)
        im_info = sample['image_info']
        gt_objects = sample['objects']
        object_rois = target_net(im_data, im_info)[1]
        results.append(object_rois.cpu().data.numpy())
        box_num += object_rois.size(0)
        correct_cnt_t, total_cnt_t = check_recall(object_rois, gt_objects, 200)
        correct_cnt += correct_cnt_t
        total_cnt += total_cnt_t
        batch_time.update(time.time() - end)
        end = time.time()
        if (i + 1) % 100 == 0 and i > 0:
            print('[{0}/{6}]  Time: {1:2.3f}s/img).'
                  '\t[object] Avg: {2:2.2f} Boxes/im, Top-200 recall: {3:2.3f} ({4:.0f}/{5:.0f})'.format(
                    i + 1, batch_time.avg,
                    box_num / float(im_counter), correct_cnt / float(total_cnt)* 100, correct_cnt, total_cnt,
                    len(test_loader)))

    recall = correct_cnt / float(total_cnt)
    print '====== Done Testing ===='
    return recall, results
예제 #2
0
def test(loader, model, top_Ns, nms=-1., triplet_nms=-1., use_gt_boxes=False):

    print '========== Testing ======='
    model.eval()

    rel_cnt = 0.
    rel_cnt_correct = np.zeros(2)
    phrase_cnt_correct = np.zeros(2)
    pred_cnt_correct = np.zeros(2)
    total_region_rois_num = 0
    max_region_rois_num = 0
    result = []

    batch_time = network.AverageMeter()
    end = time.time()


    for i, sample in enumerate(loader): # (im_data, im_info, gt_objects, gt_relationships)
        assert len(sample['visual']) == 1
        input_visual = sample['visual'][0].cuda()
        gt_objects = sample['objects']
        gt_relationships = sample['relations']
        image_info = sample['image_info']
        # Forward pass
        total_cnt_t, cnt_correct_t, eval_result_t = model.module.evaluate(
            input_visual, image_info, gt_objects, gt_relationships,
            top_Ns = top_Ns, nms=nms, triplet_nms=triplet_nms,
            use_gt_boxes=use_gt_boxes)
        eval_result_t['path'] = sample['path'][0] # for visualization
        rel_cnt += total_cnt_t
        result.append(eval_result_t)
        rel_cnt_correct += cnt_correct_t[0]
        phrase_cnt_correct += cnt_correct_t[1]
        pred_cnt_correct += cnt_correct_t[2]
        total_region_rois_num += cnt_correct_t[3]
        max_region_rois_num = cnt_correct_t[3] if cnt_correct_t[3] > max_region_rois_num else max_region_rois_num
        batch_time.update(time.time() - end)
        end = time.time()
        if (i + 1) % 500 == 0 and i > 0:
            print('[Evaluation][%d/%d][%.2fs/img][avg: %d subgraphs, max: %d subgraphs]' %(i+1, len(loader), batch_time.avg, total_region_rois_num / float(i+1), max_region_rois_num))
            for idx, top_N in enumerate(top_Ns):
                print('\tTop-%d Recall:\t[Pred] %2.3f%%\t[Phr] %2.3f%%\t[Rel] %2.3f%%' % (
                    top_N, pred_cnt_correct[idx] / float(rel_cnt) * 100,
                    phrase_cnt_correct[idx] / float(rel_cnt) * 100,
                    rel_cnt_correct[idx] / float(rel_cnt) * 100))

    recall = [rel_cnt_correct / float(rel_cnt),
              phrase_cnt_correct / float(rel_cnt),
              pred_cnt_correct / float(rel_cnt)]
    print('\n====== Done Testing ====')

    return recall, result
예제 #3
0
def test(test_loader, target_net):
    box_num = np.array([0, 0])
    correct_cnt, total_cnt = np.array([0, 0]), np.array([0, 0])
    print '========== Testing ======='
    results_obj = []
    results_region = []

    batch_time = network.AverageMeter()
    end = time.time()
    im_counter = 0
    for i, sample in enumerate(test_loader):
        correct_cnt_t, total_cnt_t = np.array([0, 0]), np.array([0, 0])
        # Forward pass

        # measure the data loading time
        im_data = Variable(sample['visual'].cuda(), volatile=True)
        im_counter += im_data.size(0)
        im_info = sample['image_info']
        gt_objects = sample['objects']
        gt_regions = sample['regions']
        object_rois, region_rois = target_net(im_data, im_info)[1:]
        results_obj.append(object_rois.cpu().data.numpy())
        results_region.append(region_rois.cpu().data.numpy())
        box_num[0] += object_rois.size(0)
        box_num[1] += region_rois.size(0)
        correct_cnt_t[0], total_cnt_t[0] = check_recall(
            object_rois, gt_objects, 50)
        correct_cnt_t[1], total_cnt_t[1] = check_recall(
            region_rois, gt_regions, 50)
        correct_cnt += correct_cnt_t
        total_cnt += total_cnt_t
        batch_time.update(time.time() - end)
        end = time.time()
        if (i + 1) % 100 == 0 and i > 0:
            print(
                '[{0}/{10}]  Time: {1:2.3f}s/img).'
                '\t[object] Avg: {2:2.2f} Boxes/im, Top-50 recall: {3:2.3f} ({4:d}/{5:d})'
                '\t[region] Avg: {6:2.2f} Boxes/im, Top-50 recall: {7:2.3f} ({8:d}/{9:d})'
                .format(i + 1, batch_time.avg, box_num[0] / float(im_counter),
                        correct_cnt[0] / float(total_cnt[0]) * 100,
                        correct_cnt[0], total_cnt[0],
                        box_num[1] / float(im_counter),
                        correct_cnt[1] / float(total_cnt[1]) * 100,
                        correct_cnt[1], total_cnt[1], len(test_loader)))

    recall = correct_cnt / total_cnt.astype(np.float)
    print '====== Done Testing ===='
    return recall, results_obj, results_region
예제 #4
0
    default=-1.,
    help='NMS threshold for post object NMS (negative means not NMS)')
parser.add_argument(
    '--triplet_nms',
    type=float,
    default=0.4,
    help='Triplet NMS threshold for post object NMS (negative means not NMS)')
# parser.add_argument('--rerank', action='store_true', help='Whether to rerankt the object score')
# testing settings
parser.add_argument('--use_gt_boxes',
                    action='store_true',
                    help='Use ground truth bounding boxes for evaluation')

args = parser.parse_args()
# Overall loss logger
overall_train_loss = network.AverageMeter()
overall_train_rpn_loss = network.AverageMeter()
overall_gradients_norm_logger = network.LoggerMeter()

is_best = False
best_recall = [0., 0.]
best_recall_phrase = [0., 0.]
best_recall_pred = [0., 0.]


def main():
    global args, is_best, best_recall, best_recall_pred, best_recall_phrase
    # To set the model name automatically

    # Set options
    options = {
예제 #5
0
def train(train_loader, target_net, optimizer, epoch):
    batch_time = network.AverageMeter()
    data_time = network.AverageMeter()
    train_loss = network.AverageMeter()
    train_loss_obj_box = network.AverageMeter()
    train_loss_obj_entropy = network.AverageMeter()

    accuracy_obj = network.AccuracyMeter()

    target_net.train()
    end = time.time()
    for i, sample in enumerate(train_loader):

        # measure the data loading time
        data_time.update(time.time() - end)
        im_data = sample['visual'][0].cuda()
        im_info = sample['image_info']
        gt_objects = sample['objects']
        anchor_targets = [
            np_to_variable(sample['rpn_targets']['object'][0][0],
                           is_cuda=True,
                           dtype=torch.LongTensor),
            np_to_variable(sample['rpn_targets']['object'][0][1],
                           is_cuda=True),
            np_to_variable(sample['rpn_targets']['object'][0][2],
                           is_cuda=True),
            np_to_variable(sample['rpn_targets']['object'][0][3], is_cuda=True)
        ]
        # Forward pass
        target_net(im_data, im_info, rpn_data=anchor_targets)
        # record loss
        loss = target_net.loss
        # total loss
        train_loss.update(loss.data[0], im_data.size(0))
        # object bbox reg
        train_loss_obj_box.update(target_net.loss_box.data[0], im_data.size(0))
        # object score
        train_loss_obj_entropy.update(target_net.loss_cls.data[0],
                                      im_data.size(0))
        # accuracy
        accuracy_obj.update(target_net.tp, target_net.tf, target_net.fg_cnt,
                            target_net.bg_cnt)

        # backward
        optimizer.zero_grad()
        torch.cuda.synchronize()
        loss.backward()
        if not args.disable_clip_gradient:
            network.clip_gradient(target_net, 10.)
        torch.cuda.synchronize()
        optimizer.step()

        # measure elapsed time
        batch_time.update(time.time() - end)
        end = time.time()

        if (i + 1) % args.log_interval == 0:
            print(
                'Epoch: [{0}][{1}/{2}]\t'
                'Batch_Time: {batch_time.avg:.3f}s\t'
                'lr: {lr: f}\t'
                'Loss: {loss.avg:.4f}\n'
                '\t[object]:\t'
                'tp: {accuracy_obj.true_pos:.3f}, \t'
                'tf: {accuracy_obj.true_neg:.3f}, \t'
                'fg/bg=({accuracy_obj.foreground:.1f}/{accuracy_obj.background:.1f})\t'
                'cls_loss: {cls_loss_object.avg:.3f}\t'
                'reg_loss: {reg_loss_object.avg:.3f}'.format(
                    epoch,
                    i + 1,
                    len(train_loader),
                    batch_time=batch_time,
                    lr=args.lr,
                    data_time=data_time,
                    loss=train_loss,
                    cls_loss_object=train_loss_obj_entropy,
                    reg_loss_object=train_loss_obj_box,
                    accuracy_obj=accuracy_obj))
예제 #6
0
def test(loader, model, top_Ns, nms=-1., triplet_nms=-1., use_gt_boxes=False):

    print '========== Testing ======='
    model.eval()  # pytorch:将模式设置为evaluation模式
    print 'set eval Success!'
    rel_cnt = 0.  # 已测试的batch个数
    rel_cnt_correct = np.zeros(2)  # 正确的batch个数
    phrase_cnt_correct = np.zeros(2)  # 正确的phrase个数
    pred_cnt_correct = np.zeros(2)  # 正确的predicate(relationship)个数
    total_region_rois_num = 0
    max_region_rois_num = 0
    result = []

    batch_time = network.AverageMeter()
    end = time.time()

    print 'before loop!'
    # enumerate: (index, element)
    for i, sample in enumerate(
            loader):  # (im_data, im_info, gt_objects, gt_relationships)
        print 'in loop 1'
        assert len(sample['visual']
                   ) == 1  # 检查batch_size:author规定evaluation的batch_size必须为1
        input_visual = sample['visual'][0].cuda()  # 将图片放到GPU上
        gt_objects = sample['objects']
        gt_relationships = sample['relations']
        image_info = sample['image_info']
        # Forward pass
        print 'in loop 2'
        # 测试函数(对单个batch): model.module.evaluate->models/HDN_v2/factorizable_network_v4.py
        # cnt_correct_t(四元,正确数量)
        total_cnt_t, cnt_correct_t, eval_result_t = model.module.evaluate(
            input_visual,
            image_info,
            gt_objects,
            gt_relationships,
            top_Ns=top_Ns,
            nms=nms,
            triplet_nms=triplet_nms,
            use_gt_boxes=use_gt_boxes)
        eval_result_t['path'] = sample['path'][0]  # for visualization
        rel_cnt += total_cnt_t
        result.append(eval_result_t)
        rel_cnt_correct += cnt_correct_t[0]
        phrase_cnt_correct += cnt_correct_t[1]
        pred_cnt_correct += cnt_correct_t[2]
        total_region_rois_num += cnt_correct_t[3]
        max_region_rois_num = cnt_correct_t[3] if cnt_correct_t[
            3] > max_region_rois_num else max_region_rois_num
        batch_time.update(time.time() - end)
        end = time.time()
        if (i + 1) % 500 == 0 and i > 0:
            print(
                '[Evaluation][%d/%d][%.2fs/img][avg: %d subgraphs, max: %d subgraphs]'
                % (i + 1, len(loader), batch_time.avg,
                   total_region_rois_num / float(i + 1), max_region_rois_num))
            for idx, top_N in enumerate(top_Ns):
                print(
                    '\tTop-%d Recall:\t[Pred] %2.3f%%\t[Phr] %2.3f%%\t[Rel] %2.3f%%'
                    % (top_N, pred_cnt_correct[idx] / float(rel_cnt) * 100,
                       phrase_cnt_correct[idx] / float(rel_cnt) * 100,
                       rel_cnt_correct[idx] / float(rel_cnt) * 100))

    recall = [
        rel_cnt_correct / float(rel_cnt), phrase_cnt_correct / float(rel_cnt),
        pred_cnt_correct / float(rel_cnt)
    ]
    print('\n====== Done Testing ====')

    return recall, result