Perform 1 step of training
(args, data, model, pose, img_idx, hwf, optimizer, half_res, device, **render_kwargs_test)
| 226 | return total_loss_mean, total_psnr_mean |
| 227 | |
| 228 | def train_on_batch(args, data, model, pose, img_idx, hwf, optimizer, half_res, device, **render_kwargs_test): |
| 229 | ''' Perform 1 step of training''' |
| 230 | H, W, focal = hwf |
| 231 | target_ = deepcopy(data) |
| 232 | pose_ = inference_pose_regression(args, data, device, model) |
| 233 | device_cpu = torch.device('cpu') |
| 234 | pose_ = pose_.to(device_cpu) # put predict pose back to cpu |
| 235 | pose_nerf = pose_.clone() |
| 236 | if args.NeRFH: |
| 237 | # rescale the predicted pose to nerf scales |
| 238 | pose_nerf = fix_coord_supp(args, pose_nerf) |
| 239 | |
| 240 | batch_rays, target = prepare_batch_render(args, pose_nerf, args.batch_size, target_, H, W, focal, half_res) |
| 241 | batch_rays = batch_rays.to(device) |
| 242 | target = target.to(device) |
| 243 | pose = pose.to(device) |
| 244 | img_idx = img_idx.to(device) |
| 245 | |
| 246 | # # every new tensor from onward is in GPU |
| 247 | torch.set_default_tensor_type('torch.cuda.FloatTensor') |
| 248 | if half_res: |
| 249 | rgb, disp, acc, extras = render(H//2, W//2, focal/2, chunk=args.chunk, rays=batch_rays, img_idx=img_idx, **render_kwargs_test) |
| 250 | else: |
| 251 | rgb, disp, acc, extras = render(H, W, focal, chunk=args.chunk, rays=batch_rays, img_idx=img_idx, **render_kwargs_test) |
| 252 | |
| 253 | ### Loss Design Here ### |
| 254 | # Compute RGB MSE Loss |
| 255 | photo_loss = rgb_loss(rgb, target, extras) |
| 256 | |
| 257 | # Compute Combine Loss if needed |
| 258 | if args.combine_loss: |
| 259 | pose_loss = PoseLoss(args, pose_, pose, device) |
| 260 | loss = args.combine_loss_w[0] * pose_loss + args.combine_loss_w[1] * photo_loss |
| 261 | # print("img_idx: {}, pose_loss: {}, rgb_loss {}, total_loss {}".format(img_idx, args.combine_loss_w[0] * pose_loss, args.combine_loss_w[1] * photo_loss, loss)) |
| 262 | |
| 263 | ### Loss Design End |
| 264 | loss.backward() |
| 265 | optimizer.step() |
| 266 | optimizer.zero_grad() |
| 267 | psnr = mse2psnr(img2mse(rgb, target)) |
| 268 | |
| 269 | # end of every new tensor from onward is in GPU |
| 270 | torch.set_default_tensor_type('torch.FloatTensor') |
| 271 | |
| 272 | iter_loss = loss.to(device_cpu).detach().numpy() |
| 273 | iter_loss = np.array([iter_loss]) |
| 274 | |
| 275 | iter_psnr = psnr.to(device_cpu).detach().numpy() |
| 276 | return iter_loss, iter_psnr |
| 277 | |
| 278 | |
| 279 | def train_on_epoch(args, data_loaders, model, hwf, optimizer, half_res, device, **render_kwargs_test): |
no test coverage detected