def __call__(self, inputs,target):
applied_angle = random.uniform(-self.angle,self.angle)
diff = random.uniform(-self.diff_angle,self.diff_angle)
angle1 = applied_angle - diff/2
angle2 = applied_angle + diff/2
angle1_rad = angle1*np.pi/180
angle2_rad = angle2*np.pi/180
h, w, _ = inputs[0].shape
def rotate_flow(i,j,k):
return -k*(j-w/2)*(diff*np.pi/180) + (1-k)*(i-h/2)*(diff*np.pi/180)
rotate_flow_map = np.fromfunction(rotate_flow, target.shape)
target += rotate_flow_map
inputs[0] = ndimage.interpolation.rotate(inputs[0], angle1, reshape=True, order=self.order)
inputs[1] = ndimage.interpolation.rotate(inputs[1], angle2, reshape=True, order=self.order)
target = ndimage.interpolation.rotate(target, angle1, reshape=True, order=self.order)
#flow vectors must be rotated too!
target_=np.array(target, copy=True)
target[:,:,0] = np.cos(angle1_rad)*target_[:,:,0] - np.sin(angle1_rad)*target_[:,:,1]
target[:,:,1] = np.sin(angle1_rad)*target_[:,:,0] + np.cos(angle1_rad)*target_[:,:,1]
#keep angle1 and angle2 within [0,pi/2] with a reflection at pi/2: -1rad is 1rad, 2rad is pi - 2 rad
angle1_rad = np.pi/2 - np.abs(angle1_rad%np.pi - np.pi/2)
angle2_rad = np.pi/2 - np.abs(angle2_rad%np.pi - np.pi/2)
c1 = np.cos(angle1_rad)
s1 = np.sin(angle1_rad)
c2 = np.cos(angle2_rad)
s2 = np.sin(angle2_rad)
c_diag = h/np.sqrt(h*h+w*w)
s_diag = w/np.sqrt(h*h+w*w)
ratio = c_diag/max(c1*c_diag+s1*s_diag,c2*c_diag+s2*s_diag)
crop = CenterCrop((int(h*ratio),int(w*ratio)))
scale = Scale(self.size)
inputs, target = crop(inputs, target)
return scale(inputs,target)
flow_transforms.py 文件源码
python
阅读 32
收藏 0
点赞 0
评论 0
评论列表
文章目录