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
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
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
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 = {
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))
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