def predict(st, en, step, instance_list): global pred_prob global bbox_cnt for th in range(st, en, step): if (step == 1): warp_prob = flo.get_warp_label(flow1[th - 1], flow2[th], combine_prob(pred_prob[th - 1])) elif (step == -1): warp_prob = flo.get_warp_label(flow2[th + 1], flow1[th], combine_prob(pred_prob[th + 1])) bbox = gen_bbox(prob_to_label(warp_prob), range(instance_num), True) new_instance_list = [] abort = True temp = prob_to_label(combine_prob(pred_prob[th - step])) for i in range(instance_num): if (th == st) or (np.count_nonzero(orig_mask[i]) <= np.count_nonzero(temp == (i + 1)) * 10): if np.abs(bbox_cnt[th][i] - th) <= np.abs((st - step) - th): continue if i in instance_list: abort = False bbox_cnt[th][i] = (st - step) new_instance_list.append(i) else: for j in instance_list: if IoU(bbox[i, :], bbox[j, :]) > 1e-6: new_instance_list.append(i) break if abort: break new_instance_list = sorted(new_instance_list) temp_image = frames[th].astype(float) f_prob = [ np.zeros( [bbox[idx, 3] - bbox[idx, 1], bbox[idx, 2] - bbox[idx, 0], 2]) for idx in new_instance_list ] image_patch = np.zeros( (len(new_instance_list), patch_shape[1], patch_shape[0], 3), float) flow_patch = np.zeros( (len(new_instance_list), patch_shape[1], patch_shape[0], 2), float) warp_label_patch = np.zeros( (len(new_instance_list), patch_shape[1], patch_shape[0], 1), float) for i in range(len(new_instance_list)): idx = new_instance_list[i] warp_label_patch[i, ..., 0] = cv2.resize( warp_prob[bbox[idx, 1]:bbox[idx, 3], bbox[idx, 0]:bbox[idx, 2], idx + 1], patch_shape).astype(float) image_patch[i, ...] = cv2.resize( temp_image[ int(0.5 + bbox[idx, 1] * fr_h_r):int(0.5 + bbox[idx, 3] * fr_h_r), int(0.5 + bbox[idx, 0] * fr_w_r):int(0.5 + bbox[idx, 2] * fr_w_r), :], patch_shape).astype(float) if (step == 1): flow_patch[i, ...] = cv2.resize( flow2[th][bbox[idx, 1]:bbox[idx, 3], bbox[idx, 0]:bbox[idx, 2], :], patch_shape).astype(float) else: flow_patch[i, ...] = cv2.resize( flow1[th][bbox[idx, 1]:bbox[idx, 3], bbox[idx, 0]:bbox[idx, 2], :], patch_shape).astype(float) image_patch = torch.from_numpy(image_patch.transpose( 0, 3, 1, 2)).contiguous().float().cuda() warp_label_patch = torch.from_numpy( warp_label_patch.transpose(0, 3, 1, 2)).contiguous().float().cuda() flow_patch = torch.from_numpy(flow_patch.transpose( 0, 3, 1, 2)).contiguous().float().cuda() with torch.no_grad(): prob = model(image_patch, flow_patch, warp_label_patch) prob = torch.nn.functional.softmax(prob, dim=1) if use_flip: image_patch = flip(image_patch, 3) warp_label_patch = flip(warp_label_patch, 3) flow_patch = flip(flow_patch, 3) flow_patch[:, 0, ...] = -flow_patch[:, 0, ...] with torch.no_grad(): prob_f = model(image_patch, flow_patch, warp_label_patch) prob_f = torch.nn.functional.softmax(prob_f, dim=1) prob_f = flip(prob_f, 3) prob = (prob + prob_f) / 2.0 prob = prob.data.cpu().numpy().transpose(0, 2, 3, 1) for i in range(len(new_instance_list)): idx = new_instance_list[i] f_prob[i] += cv2.resize( prob[i, ...], (bbox[idx, 2] - bbox[idx, 0], bbox[idx, 3] - bbox[idx, 1])) for i in range(len(new_instance_list)): idx = new_instance_list[i] pred_prob[th][..., idx * 2] = 1 pred_prob[th][..., idx * 2 + 1] = 0 pred_prob[th][bbox[idx, 1]:bbox[idx, 3], bbox[idx, 0]:bbox[idx, 2], idx * 2] = f_prob[i][..., 0] pred_prob[th][bbox[idx, 1]:bbox[idx, 3], bbox[idx, 0]:bbox[idx, 2], idx * 2 + 1] = f_prob[i][..., 1]
def predict(st, en, step, instance_list): # st = 1, step =1, instance_list: obj number id. global pred_prob global bbox_cnt global count for th in range(st, en, step): if (step == 1): temp_prob_ = combine_prob(pred_prob[th - 1]) # print (temp_prob_.shape) # (720, 1280, 3) # temp_prob_[temp_prob_ > mask_th] = 1 warp_prob = flo.get_warp_label(flow1[th - 1], flow2[th], temp_prob_) elif (step == -1): temp_prob_ = combine_prob(pred_prob[th + 1]) # temp_prob_[temp_prob_ > mask_th] = 1 warp_prob = flo.get_warp_label(flow2[th + 1], flow1[th], temp_prob_) bbox = gen_bbox(prob_to_label(warp_prob), range(instance_num), True) new_instance_list = [] abort = True temp = prob_to_label(combine_prob(pred_prob[th - step])) for i in range(instance_num): if (th == st) or (np.count_nonzero(orig_mask[i]) <= np.count_nonzero(temp == (i + 1)) * 10): if np.abs(bbox_cnt[th][i] - th) <= np.abs((st - step) - th): continue if i in instance_list: abort = False bbox_cnt[th][i] = (st - step) new_instance_list.append(i) else: for j in instance_list: if IoU(bbox[i, :], bbox[j, :]) > 1e-6: new_instance_list.append(i) break if abort: break new_instance_list = sorted(new_instance_list) temp_image = frames[th].astype(float) f_prob = [ np.zeros( [bbox[idx, 3] - bbox[idx, 1], bbox[idx, 2] - bbox[idx, 0], 2]) for idx in new_instance_list ] image_patch = np.zeros( (len(new_instance_list), patch_shape[1], patch_shape[0], 3), float) flow_patch = np.zeros( (len(new_instance_list), patch_shape[1], patch_shape[0], 2), float) warp_label_patch = np.zeros( (len(new_instance_list), patch_shape[1], patch_shape[0], 1), float) for i in range(len(new_instance_list)): idx = new_instance_list[i] warp_label_patch_temp = cv2.resize( warp_prob[bbox[idx, 1]:bbox[idx, 3], bbox[idx, 0]:bbox[idx, 2], idx + 1], patch_shape).astype(float) # print (warp_label_patch_temp.shape) # (433, 433) warp_label_patch_temp[warp_label_patch_temp >= mask_th] = 1 warp_label_patch_temp[warp_label_patch_temp < mask_th] = 0 warp_label_patch[i, ..., 0] = warp_label_patch_temp image_patch[i, ...] = cv2.resize( temp_image[ int(0.5 + bbox[idx, 1] * fr_h_r):int(0.5 + bbox[idx, 3] * fr_h_r), int(0.5 + bbox[idx, 0] * fr_w_r):int(0.5 + bbox[idx, 2] * fr_w_r), :], patch_shape).astype(float) if (step == 1): flow_patch[i, ...] = cv2.resize( flow2[th][bbox[idx, 1]:bbox[idx, 3], bbox[idx, 0]:bbox[idx, 2], :], patch_shape).astype(float) else: flow_patch[i, ...] = cv2.resize( flow1[th][bbox[idx, 1]:bbox[idx, 3], bbox[idx, 0]:bbox[idx, 2], :], patch_shape).astype(float) image_patch = torch.from_numpy(image_patch.transpose(0, 3, 1, 2)) warp_label_patch = torch.from_numpy( warp_label_patch.transpose(0, 3, 1, 2)).contiguous().float().cuda() flow_patch = torch.from_numpy(flow_patch.transpose( 0, 3, 1, 2)).contiguous().float().cuda() print(image_patch.size(), 'image_patch') print(warp_label_patch.size(), 'warp_label_patch') print(flow_patch.size(), 'flow_patch') #notice here!!!!!!! if annotate it, you will be mad. print((image_patch[0]).cpu().numpy().transpose(1, 2, 0).shape) cv2.imwrite('output/%3d_prob.png' % count, (image_patch[0]).cpu().numpy().transpose(1, 2, 0)) count += 1 cv2.imwrite('output/%3d_prob.png' % count, (warp_label_patch[0][0] * 255).cpu().numpy()) count += 1 value_scale = 255 mean = [0.485, 0.456, 0.406] mean = [item * value_scale for item in mean] std = [0.229, 0.224, 0.225] std = [item * value_scale for item in std] for i in range(len(new_instance_list)): for t, m, s in zip(image_patch[i], mean, std): t.sub_(m).div_(s) # notice here!!!!!!! if annotate it, you will be mad. image_patch = image_patch.contiguous().float().cuda() with torch.no_grad(): prob = model( image_patch, warp_label_patch, flow_patch) #model = torch.nn.DataParallel(model).cuda() prob = torch.nn.functional.softmax(prob, dim=1) cv2.imwrite( 'output/%3d_prob.png' % count, (torch.argmax(prob[0], dim=0, keepdim=False)).cpu().numpy() * 100) count += 1 # warp_label_patch debug1 # probxxx = prob.data.cpu().numpy().transpose(0, 2, 3, 1) # print (probxxx[0].shape) # out = np.argmax(probxxx[0], axis=2) # print (out.shape) # cv2.imwrite("debugs/"+str(th)+"_out.png", (out * 255)) if use_flip: image_patch = flip(image_patch, 3) warp_label_patch = flip(warp_label_patch, 3) flow_patch = flip(flow_patch, 3) flow_patch[:, 0, ...] = -flow_patch[:, 0, ...] with torch.no_grad(): prob_f = model(image_patch, warp_label_patch, flow_patch) #cv2.imwrite('output/%d_probf.png' % count, (prob_f[0][0]*255).cpu().numpy()) #count += 1 prob_f = torch.nn.functional.softmax(prob_f, dim=1) prob_f = flip(prob_f, 3) prob = (prob + prob_f) / 2.0 prob = prob.data.cpu().numpy().transpose(0, 2, 3, 1) for i in range(len(new_instance_list)): idx = new_instance_list[i] f_prob[i] += cv2.resize( prob[i, ...], (bbox[idx, 2] - bbox[idx, 0], bbox[idx, 3] - bbox[idx, 1])) for i in range(len(new_instance_list)): idx = new_instance_list[i] pred_prob[th][..., idx * 2] = 1 pred_prob[th][..., idx * 2 + 1] = 0 pred_prob[th][bbox[idx, 1]:bbox[idx, 3], bbox[idx, 0]:bbox[idx, 2], idx * 2] = f_prob[i][..., 0] pred_prob[th][bbox[idx, 1]:bbox[idx, 3], bbox[idx, 0]:bbox[idx, 2], idx * 2 + 1] = f_prob[i][..., 1]