(self, theta)
| 459 | self.grid_Y = self.grid_Y.cuda() |
| 460 | |
| 461 | def forward(self, theta): |
| 462 | b = theta.size(0) |
| 463 | if theta.size(1) == 9: |
| 464 | H = theta |
| 465 | else: |
| 466 | H = homography_mat_from_4_pts(theta) |
| 467 | h0 = H[:, 0].unsqueeze(1).unsqueeze(2).unsqueeze(3) |
| 468 | h1 = H[:, 1].unsqueeze(1).unsqueeze(2).unsqueeze(3) |
| 469 | h2 = H[:, 2].unsqueeze(1).unsqueeze(2).unsqueeze(3) |
| 470 | h3 = H[:, 3].unsqueeze(1).unsqueeze(2).unsqueeze(3) |
| 471 | h4 = H[:, 4].unsqueeze(1).unsqueeze(2).unsqueeze(3) |
| 472 | h5 = H[:, 5].unsqueeze(1).unsqueeze(2).unsqueeze(3) |
| 473 | h6 = H[:, 6].unsqueeze(1).unsqueeze(2).unsqueeze(3) |
| 474 | h7 = H[:, 7].unsqueeze(1).unsqueeze(2).unsqueeze(3) |
| 475 | h8 = H[:, 8].unsqueeze(1).unsqueeze(2).unsqueeze(3) |
| 476 | |
| 477 | grid_X = expand_dim(self.grid_X, 0, b) |
| 478 | grid_Y = expand_dim(self.grid_Y, 0, b) |
| 479 | |
| 480 | grid_Xp = grid_X * h0 + grid_Y * h1 + h2 |
| 481 | grid_Yp = grid_X * h3 + grid_Y * h4 + h5 |
| 482 | k = grid_X * h6 + grid_Y * h7 + h8 |
| 483 | |
| 484 | grid_Xp /= k |
| 485 | grid_Yp /= k |
| 486 | |
| 487 | return torch.cat((grid_Xp, grid_Yp), 3) |
| 488 | |
| 489 | |
| 490 | def homography_mat_from_4_pts(theta): |
nothing calls this directly
no test coverage detected