def forward(self, theta): b = theta.size(0) if theta.size(1) == 9: H = theta else: H = homography_mat_from_4_pts(theta) h0 = H[:, 0].unsqueeze(1).unsqueeze(2).unsqueeze(3) h1 = H[:, 1].unsqueeze(1).unsqueeze(2).unsqueeze(3) h2 = H[:, 2].unsqueeze(1).unsqueeze(2).unsqueeze(3) h3 = H[:, 3].unsqueeze(1).unsqueeze(2).unsqueeze(3) h4 = H[:, 4].unsqueeze(1).unsqueeze(2).unsqueeze(3) h5 = H[:, 5].unsqueeze(1).unsqueeze(2).unsqueeze(3) h6 = H[:, 6].unsqueeze(1).unsqueeze(2).unsqueeze(3) h7 = H[:, 7].unsqueeze(1).unsqueeze(2).unsqueeze(3) h8 = H[:, 8].unsqueeze(1).unsqueeze(2).unsqueeze(3) grid_X = expand_dim(self.grid_X, 0, b) grid_Y = expand_dim(self.grid_Y, 0, b) grid_Xp = grid_X * h0 + grid_Y * h1 + h2 grid_Yp = grid_X * h3 + grid_Y * h4 + h5 k = grid_X * h6 + grid_Y * h7 + h8 grid_Xp /= k grid_Yp /= k return torch.cat((grid_Xp, grid_Yp), 3)
def forward(self, theta, matches, seg_mask=None, return_outliers=False): if isinstance(theta,Variable): # handle normal batch transformations batch_size=theta.size()[0] theta=theta.clone() mask = self.geometricTnf(expand_dim(self.mask_id,0,batch_size),theta) if return_outliers: mask_outliers = self.geometricTnf(expand_dim(1.0-self.mask_id,0,batch_size),theta) if self.normalize: epsilon=1e-5 mask = torch.div(mask, torch.sum(torch.sum(torch.sum(mask+epsilon,3),2),1).unsqueeze(1).unsqueeze(2).unsqueeze(3).expand_as(mask)) if return_outliers: mask_outliers = torch.div(mask_outliers, torch.sum(torch.sum(torch.sum(mask_outliers+epsilon,3),2),1).unsqueeze(1).unsqueeze(2).unsqueeze(3).expand_as(mask_outliers)) if self.seg_mask: score = torch.sum(torch.sum(torch.mul(torch.sum(torch.mul(mask,matches),1),seg_mask),2),1) else: score = torch.sum(torch.sum(torch.sum(torch.mul(mask,matches),3),2),1) if return_outliers: score_outliers = torch.sum(torch.sum(torch.sum(torch.mul(mask_outliers,matches),3),2),1) #return (score,score_outliers) return (score,score_outliers) elif isinstance(theta,list): # handle multiple transformations per batch item, batch is in list format (used for RANSAC) batch_size = len(theta) score = [] for b in range(batch_size): sample_size=theta[b].size(0) s=self.forward(theta[b],expand_dim(matches[b,:,:,:].unsqueeze(0),0,sample_size)) score.append(s) return score
def forward(self, theta_aff, theta_aff_tps, matches, seg_mask=None, return_outliers=False): batch_size=theta_aff.size()[0] mask = self.compGeometricTnf(image_batch=expand_dim(self.mask_id,0,batch_size), theta_aff=theta_aff, theta_aff_tps=theta_aff_tps) if return_outliers: mask_outliers = self.compGeometricTnf(image_batch=expand_dim(1.0-self.mask_id,0,batch_size), theta_aff=theta_aff, theta_aff_tps=theta_aff_tps) if self.normalize: epsilon=1e-5 mask = torch.div(mask, torch.sum(torch.sum(torch.sum(mask+epsilon,3),2),1).unsqueeze(1).unsqueeze(2).unsqueeze(3).expand_as(mask)) if return_outliers: mask_outliers = torch.div(mask, torch.sum(torch.sum(torch.sum(mask_outliers+epsilon,3),2),1).unsqueeze(1).unsqueeze(2).unsqueeze(3).expand_as(mask_outliers)) if self.seg_mask: score = torch.sum(torch.sum(torch.mul(torch.sum(torch.mul(mask,matches),1),seg_mask),2),1) else: score = torch.sum(torch.sum(torch.sum(torch.mul(mask,matches),3),2),1) if return_outliers: score_outliers = torch.sum(torch.sum(torch.sum(torch.mul(mask_outliers,matches),3),2),1) return (score,score_outliers) return score
def forward(self, theta, matches, return_outliers=False): if isinstance(theta,Variable): # handle normal batch transformations batch_size=theta.size()[0] theta=theta.clone() mask = self.geometricTnf(expand_dim(self.mask_id,0,batch_size),theta) if return_outliers: mask_outliers = self.geometricTnf(expand_dim(1.0-self.mask_id,0,batch_size),theta) if self.normalize: epsilon=1e-5 mask = torch.div(mask, torch.sum(torch.sum(torch.sum(mask+epsilon,3),2),1).unsqueeze(1).unsqueeze(2).unsqueeze(3).expand_as(mask)) if return_outliers: mask_outliers = torch.div(mask_outliers, torch.sum(torch.sum(torch.sum(mask_outliers+epsilon,3),2),1).unsqueeze(1).unsqueeze(2).unsqueeze(3).expand_as(mask_outliers)) score = torch.sum(torch.sum(torch.sum(torch.mul(mask,matches),3),2),1) if return_outliers: score_outliers = torch.sum(torch.sum(torch.sum(torch.mul(mask_outliers,matches),3),2),1) return (score,score_outliers) elif isinstance(theta,list): # handle multiple transformations per batch item, batch is in list format (used for RANSAC) batch_size = len(theta) score = [] for b in range(batch_size): sample_size=theta[b].size(0) s=self.forward(theta[b],expand_dim(matches[b,:,:,:].unsqueeze(0),0,sample_size)) score.append(s) return score
def forward(self, theta): b = theta.size(0) if not theta.size() == (b, 6): theta = theta.view(b, 6) theta = theta.contiguous() t0 = theta[:, 0].unsqueeze(1).unsqueeze(2).unsqueeze(3) t1 = theta[:, 1].unsqueeze(1).unsqueeze(2).unsqueeze(3) t2 = theta[:, 2].unsqueeze(1).unsqueeze(2).unsqueeze(3) t3 = theta[:, 3].unsqueeze(1).unsqueeze(2).unsqueeze(3) t4 = theta[:, 4].unsqueeze(1).unsqueeze(2).unsqueeze(3) t5 = theta[:, 5].unsqueeze(1).unsqueeze(2).unsqueeze(3) X = expand_dim(self.grid_X, 0, b) Y = expand_dim(self.grid_Y, 0, b) Xp = X * t0 + Y * t1 + t2 Yp = X * t3 + Y * t4 + t5 return torch.cat((Xp, Yp), 3)
def forward(self, theta): b=theta.size(0) if not theta.size()==(b,6): theta = theta.view(b,6) theta = theta.contiguous() t0=theta[:,0].unsqueeze(1).unsqueeze(2).unsqueeze(3) t1=theta[:,1].unsqueeze(1).unsqueeze(2).unsqueeze(3) t2=theta[:,2].unsqueeze(1).unsqueeze(2).unsqueeze(3) t3=theta[:,3].unsqueeze(1).unsqueeze(2).unsqueeze(3) t4=theta[:,4].unsqueeze(1).unsqueeze(2).unsqueeze(3) t5=theta[:,5].unsqueeze(1).unsqueeze(2).unsqueeze(3) X = expand_dim(self.grid_X,0,b) Y = expand_dim(self.grid_Y,0,b) Xp = X*t0 + Y*t1 + t2 Yp = X*t3 + Y*t4 + t5 return torch.cat((Xp,Yp),3)
def forward(self, theta_aff, theta_aff_tps, matches,return_outliers=False): batch_size=theta_aff.size()[0] mask = self.compGeometricTnf(image_batch=expand_dim(self.mask_id,0,batch_size), theta_aff=theta_aff, theta_aff_tps=theta_aff_tps) if return_outliers: mask_outliers = self.compGeometricTnf(image_batch=expand_dim(1.0-self.mask_id,0,batch_size), theta_aff=theta_aff, theta_aff_tps=theta_aff_tps) if self.normalize: epsilon=1e-5 mask = torch.div(mask, torch.sum(torch.sum(torch.sum(mask+epsilon,3),2),1).unsqueeze(1).unsqueeze(2).unsqueeze(3).expand_as(mask)) if return_outliers: mask_outliers = torch.div(mask, torch.sum(torch.sum(torch.sum(mask_outliers+epsilon,3),2),1).unsqueeze(1).unsqueeze(2).unsqueeze(3).expand_as(mask_outliers)) score = torch.sum(torch.sum(torch.sum(torch.mul(mask,matches),3),2),1) if return_outliers: score_outliers = torch.sum(torch.sum(torch.sum(torch.mul(mask_outliers,matches),3),2),1) return (score,score_outliers) return score