def learn_filterbank(fhs,configs): fhs = [fh[0] for fh in fhs] config = configs[0][0].copy() num_slices = config['model']['num_slices'] filterbank = filter_generation.get_filterbank(config['model']) fh,fw,num_filters = filterbank.shape filter_kshape = (fh,fw) counts = np.zeros(num_filters) for fh in fhs: array = image2array(config['model'],fh)[:,:,0] slices = [get_random_slice(array,filter_kshape) for i in range(num_slices)] for s in slices: patch = array[s] distarray = [] for i in range(num_filters): d = dist(filterbank[:,:,i],patch) distarray.append(d) distarray = np.array(distarray) imax = distarray.argmax() counts[imax] += 1 lr = .0001 #lr = 1./counts[imax] filterbank[:,:,imax] = normalize(filterbank[:,:,imax]*(1 - lr) + patch*lr) return cPickle.dumps(filterbank)
def extract_features(fhs,config,convolve_func): image_config = config[0] model_config = config[1]['model'] image_fh = fhs[0] filter_fh = fhs[1] conv_mode = model_config['conv_mode'] #preprocessing array = image2array(model_config,image_fh) preprocessed,orig_imga = preprocess(array,model_config) #input normalization norm_in = norm(preprocessed,conv_mode,model_config.get('normin')) #filtering filtered = convolve(norm_in, filter_fh, model_config, convolve_func) #nonlinear activation activ = activate(filtered,model_config.get('activ')) #output normalization norm_out = norm(activ,conv_mode,model_config.get('normout')) #pooling pooled = pool(norm_out,conv_mode,model_config.get('pool')) #postprocessing fvector_l = postprocess(norm_in,filtered,activ,norm_out,pooled,orig_imga,model_config.get('featsel')) output = sp.concatenate(fvector_l).ravel() return cPickle.dumps(output)
def center_surround_orth(model_config): conv_mode = model_config['conv_mode'] L = np.empty((2*len( model_config['filter']['base_images'] ),) + tuple(model_config['filter']['kshape']) ) for (ind,image_config) in enumerate(model_config['filter']['base_images']): image_fh = rendering.cairo_render(image_config,returnfh=True) #preprocessing array = processing.image2array(model_config ,image_fh) preprocessed,orig_imga = processing.preprocess(array,model_config ) norm_in = norm(preprocessed,conv_mode,model_config.get('normin')) array = make_array(norm_in) array = array[:,:,:2].max(2).astype(np.float) arr_box = cut_bounding_box(array) s = model_config['filter']['kshape'] X = np.zeros(s) (hx,wx) = X.shape (ha,wa) = arr_box.shape hx0 = max((hx - ha) / 2, 0) hx1 = min(ha + hx0,hx) ha0 = max((ha - hx) / 2, 0) ha1 = min(hx + ha0, ha) wx0 = max((wx - wa) / 2, 0) wx1 = min(wa + wx0,wx) wa0 = max((wa - wx) / 2, 0) wa1 = min(wx + wa0, wa) X[hx0:hx1, wx0:wx1] = arr_box[ha0:ha1, wa0:wa1] X = normalize(X) L[2*ind,:,:] = X L[2*ind + 1,:,:] = X.T return L
def get_filterbank(config): model_config = config config = config['filter'] model_name = config['model_name'] fh, fw = config.get('kshape',config.get('ker_shape')) if model_name == 'really_random': num_filters = config['num_filters'] filterbank = get_random_filterbank((num_filters,fh,fw),normalization=config.get('normalize',True)) elif model_name == 'random_gabor': num_filters = config['num_filters'] xc = fw/2 yc = fh/2 filterbank = np.empty((num_filters,fh,fw)) orients = [] freqs = [] phases = [] df = config.get('divfreq') for i in range(num_filters): orient = config.get('orient',2*np.pi*np.random.random()) orients.append(orient) if not df: freq = 1./np.random.randint(config['min_wavelength'],high = config['max_wavelength']) else: freq = 1./df freqs.append(freq) phase = config.get('phase',2*np.pi*np.random.random()) phases.append(phase) filterbank[i,:,:] = v1m.gabor2d(xc,yc,xc,yc, freq,orient,phase, (fw,fh)) #return SON([('filterbank',filterbank),('orients',orients),('phases',phases),('freqs',freqs)]) return filterbank elif model_name == 'gridded_gabor': norients = config['norients'] orients = [ o*np.pi/norients for o in xrange(norients) ] divfreqs = config['divfreqs'] freqs = [1./d for d in divfreqs] phases = config['phases'] xc = fw/2 yc = fh/2 values = list(itertools.product(freqs,orients,phases)) num_filters = len(values) filterbank = np.empty((num_filters,fh,fw)) for (i,(freq,orient,phase)) in enumerate(values): filterbank[i,:,:] = v1m.gabor2d(xc,yc,xc,yc, freq,orient,phase, (fw,fh)) elif model_name == 'pixels': return np.ones((1,fh,fw)) elif model_name == 'specific_gabor': orients = config['orients'] divfreqs = config['divfreqs'] phases = config['phases'] xc = fw/2 yc = fh/2 freqs = [1./d for d in divfreqs] values = zip(freqs,orients,phases) num_filters = len(values) filterbank = np.empty((num_filters,fh,fw)) for (i,(freq,orient,phase)) in enumerate(values): filterbank[i,:,:] = v1m.gabor2d(xc,yc,xc,yc, freq,orient,phase, (fw,fh)) elif model_name == 'cairo_generated': specs = config.get('specs') if not specs: specs = [spec['image'] for spec in rendering.cairo_config_gen(config['spec_gen'])] filterbank = np.empty((len(specs),fh,fw)) for (i,spec) in enumerate(specs): im_fh = rendering.cairo_render(spec,returnfh=True) arr = processing.image2array({'color_space':'rgb'},im_fh).astype(np.int32) arr = arr[:,:,0] - arr[:,:,1] arrx0 = arr.shape[0]/2 arry0 = arr.shape[1]/2 dh = fh/2; dw = fw/2 filterbank[i,:,:] = normalize(arr[arrx0-dh:arrx0+(fh - dh),arry0-dw:arry0+(fw-dw)]) elif model_name == 'center_surround': if config.get('orth',True): return center_surround_orth(model_config) else: return center_surround(model_config) filterbank = np.cast[np.float32](filterbank) return filterbank