def main(): opt = opts().parse() model = torch.load(opt.loadModel) img = cv2.imread(opt.demo) s = max(img.shape[0], img.shape[1]) * 1.0 c = np.array([img.shape[1] / 2., img.shape[0] / 2.]) img = Crop(img, c, s, 0, ref.inputRes) / 256. input = torch.from_numpy(img.copy()).float() input = input.view(1, input.size(0), input.size(1), input.size(2)) input_var = torch.autograd.Variable(input).float() if opt.GPU > -1: model = model.cuda(opt.GPU) input_var = input_var.cuda(opt.GPU) output = model(input_var) hm = output[-1].data.cpu().numpy() debugger = Debugger() img = (input[0].numpy().transpose(1, 2, 0) * 256).astype(np.uint8).copy() inp = img.copy() star = (cv2.resize(hm[0, 0], (ref.inputRes, ref.inputRes)) * 255) star[star > 255] = 255 star[star < 0] = 0 star = np.tile(star, (3, 1, 1)).transpose(1, 2, 0) trans = 0.8 star = (trans * star + (1. - trans) * img).astype(np.uint8) ps = parseHeatmap(hm[0], thresh=0.1) canonical, pred, color, score = [], [], [], [] for k in range(len(ps[0])): x, y, z = ((hm[0, 1:4, ps[0][k], ps[1][k]] + 0.5) * ref.outputRes).astype(np.int32) dep = ((hm[0, 4, ps[0][k], ps[1][k]] + 0.5) * ref.outputRes).astype( np.int32) canonical.append([x, y, z]) pred.append([ps[1][k], ref.outputRes - dep, ref.outputRes - ps[0][k]]) score.append(hm[0, 0, ps[0][k], ps[1][k]]) color.append((1.0 * x / ref.outputRes, 1.0 * y / ref.outputRes, 1.0 * z / ref.outputRes)) cv2.circle(img, (ps[1][k] * 4, ps[0][k] * 4), 4, (255, 255, 255), -1) cv2.circle(img, (ps[1][k] * 4, ps[0][k] * 4), 2, (int(z * 4), int(y * 4), int(x * 4)), -1) pred = np.array(pred).astype(np.float32) canonical = np.array(canonical).astype(np.float32) pointS = canonical * 1.0 / ref.outputRes pointT = pred * 1.0 / ref.outputRes R, t, s = horn87(pointS.transpose(), pointT.transpose(), score) rotated_pred = s * np.dot( R, canonical.transpose()).transpose() + t * ref.outputRes debugger.addImg(inp, 'inp') debugger.addImg(star, 'star') debugger.addImg(img, 'nms') debugger.addPoint3D(canonical / ref.outputRes - 0.5, c=color, marker='^') debugger.addPoint3D(pred / ref.outputRes - 0.5, c=color, marker='x') debugger.addPoint3D(rotated_pred / ref.outputRes - 0.5, c=color, marker='*') debugger.showAllImg(pause=True) debugger.show3D()
def main(): # use the model trained with dropout enabled model_path = '/home/erl/moshan/orcvio_gamma/orcvio_gamma/pytorch_models/starmap/trained_models/with_dropout/model_cpu.pth' img_path = './images/car.png' det_name = './det/car.png' # by default img size is 256 inputRes = 256 outputRes = 64 CUDA = torch.cuda.is_available() model = torch.load(model_path) img = cv2.imread(img_path) s = max(img.shape[0], img.shape[1]) * 1.0 c = np.array([img.shape[1] / 2., img.shape[0] / 2.]) # img = cv2.resize(img, (320, 240)) # print(img.shape) # crop only change h, w, c to c, h, w for images with size 256 x 256 img = Crop(img, c, s, 0, inputRes).astype(np.float32).transpose(2, 0, 1) / 256. input = torch.from_numpy(img.copy()).float() # change to b, c, h, w input = input.view(1, input.size(0), input.size(1), input.size(2)) input_var = torch.autograd.Variable(input).float() if CUDA: model.cuda() input_var = input_var.cuda() output = model(input_var) hm = output[-1].data.cpu().numpy() # convert to bgr, uint8 for display img = (input[0].numpy().transpose(1, 2, 0) * 256).astype(np.uint8).copy() inp = img.copy() # hm[0, 0] is an image, since 1st dim is batch star = (cv2.resize(hm[0, 0], (inputRes, inputRes)) * 255) # clip the values to 0-255 star[star > 255] = 255 star[star < 0] = 0 # tile Construct an array by repeating A the number of times given by reps. # convert to 3 channels, for bgr star = np.tile(star, (3, 1, 1)).transpose(1, 2, 0) trans = 0.8 star = (trans * star + (1. - trans) * img).astype(np.uint8) # select peaks and perform nms # set nms threshold heat_thresh = 0.25 ps = parseHeatmap(hm[0], heat_thresh) canonical, pred, color, score = [], [], [], [] # mc dropout f1 = plt.figure() ax1 = f1.add_subplot(111) ax1.imshow(img) uncertainty_test(model, input_var, heat_thresh, ax1) for k in range(len(ps[0])): # camviewfeature x, y, z = ((hm[0, 1:4, ps[0][k], ps[1][k]] + 0.5) * outputRes).astype( np.int32) dep = ((hm[0, 4, ps[0][k], ps[1][k]] + 0.5) * outputRes).astype( np.int32) canonical.append([x, y, z]) pred.append([ps[1][k], outputRes - dep, outputRes - ps[0][k]]) # kp confidence score score.append(hm[0, 0, ps[0][k], ps[1][k]]) color.append( (1.0 * x / outputRes, 1.0 * y / outputRes, 1.0 * z / outputRes)) # cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]]) → img # -1 means that a filled circle is to be drawn cv2.circle(img, (ps[1][k] * 4, ps[0][k] * 4), 6, (0, 0, 255), -1) cv2.circle(img, (ps[1][k] * 4, ps[0][k] * 4), 2, (int(z * 4), int(y * 4), int(x * 4)), -1) # plot cov # pos = kps_mean[k] # covar = kps_cov[k] # draw_ellipse(pos, covar, ax1) plt.axis('off') ax1.get_xaxis().set_visible(False) ax1.get_yaxis().set_visible(False) plt.show() f1.savefig('kp_cov.png', bbox_inches='tight', pad_inches=0) # plt.pause(5) pred = np.array(pred).astype(np.float32) canonical = np.array(canonical).astype(np.float32) pointS = canonical * 1.0 / outputRes pointT = pred * 1.0 / outputRes # calculate viewpoint R, t, s = horn87(pointS.transpose(), pointT.transpose(), score) rotated_pred = s * np.dot( R, canonical.transpose()).transpose() + t * outputRes