def optimize(self, search='rigid', method='powell', start=None, radius=BRAIN_RADIUS_MM, tol=1e-1, ftol=1e-2): """ radius: a parameter for the 'typical size' in mm of the object being registered. This is used to reformat the parameter vector (translation+rotation+scaling+shearing) so that each element roughly represents a variation in mm. """ if start == None: T = Affine(subtype=search, radius=radius) else: T = Affine(subtype=search, vec12=start.vec12, radius=radius) tc0 = T.to_param() # Loss function to minimize def loss(tc): T.from_param(tc) return -self.eval(T) def callback(tc): T.from_param(tc) print(T) print(self.similarity + ' = %s' % self.eval(T)) print('') # Switching to the appropriate optimizer print('Initial guess...') print(T) if method=='simplex': print ('Optimizing using the simplex method...') tc = sp.optimize.fmin(loss, tc0, callback=callback, xtol=tol, ftol=ftol) elif method=='powell': print ('Optimizing using Powell method...') tc = sp.optimize.fmin_powell(loss, tc0, callback=callback, xtol=tol, ftol=ftol) elif method=='conjugate_gradient': print ('Optimizing using conjugate gradient descent...') tc = sp.optimize.fmin_cg(loss, tc0, callback=callback, gtol=ftol) else: raise ValueError('Unrecognized optimizer') # Output T.from_param(tc) return T