Exemplo n.º 1
0
  def run(self):
    iterator = "Aloi"
    
    if iterator=='Bikes':
      num_cats = 365
      image_shape = (480, 640)
      images_per_category = 1
      image_iter = ImageListIterator("bikes", num_cats)
      
    if iterator=='Flowers':
      num_cats = 500
      image_shape = (500,500)
      images_per_category = 1
      image_iter = ImageListIterator("flowers", num_cats, randomize=True)
    
    if iterator=='Aloi':
      num_cats = 500
      images_per_category = 1
      image_shape = (144,192)
      image_iter = AloiIterator(num_cats, images_per_category)
      
    self.pickle_name = "%s-%s-%s.pkl" % (iterator, num_cats, images_per_category)
    
    print "Creating gabor region..."
    gabor = GaborRegion(image_shape, rotations=3, 
                        initial_wavelength=3, 
                        num_wavelengths=2 )
    
    
    # precompute all gabor activations
    print colored("Computing gabor activations...", 'green')
    images = []
    i = 0
    while image_iter.has_next():
      image, category, img_idx = image_iter.next()
      gabor.do_inference(numpy.array(image))
      active = gabor.node_values.copy()
      images.append((active, active.sum(), (category, img_idx)))
      i += 1
      if i%10==0: print i

    print colored("Computing overlap...", 'green')
    self.num_merges = num_merges = 10
    
    overlap_results = [[] for i in range(num_merges)]
    cxn_results = [[] for i in range(num_merges)]
    i = 0
    for active, size, idx in images:
      merged_idxs = [idx]
      cum_size = size
      
      for merge_idx in range(num_merges):
        max_overlap = 0
        max_percent = 0
        max_merge = None
        max_cidx = None
        max_size = None
        num_parents = merge_idx + 2
        
        for comp_active, csize, cidx in images:
          if cidx in merged_idxs: continue
          
          merge = numpy.logical_and(active, comp_active)
          overlap = merge.sum()
          if overlap > max_overlap:
            max_overlap = overlap
            max_merge = merge
            max_cidx = cidx
            max_size = csize
        
        active = max_merge
        cum_size += max_size
        merged_idxs.append(max_cidx)
        overlap_results[merge_idx].append(max_overlap)
        
        cxn_results[merge_idx].append(max_overlap * (num_parents-1) - num_parents)
        
      i += 1
      if i%10==0: print i
    
    fig = plt.figure(1)
    fig.set_size_inches(5, 10)
    plt.subplot(1,2,1)
    
    colors = '#008800 #880000 #000088 #888800'.split()
    
    start, end = 1000000, 0
    for color, merge_idx in zip(colors, range(num_merges)):
      start = min(start, min(overlap_results[merge_idx]))
      end = max(end, max(overlap_results[merge_idx]))
      
    for color, merge_idx in zip(colors, reversed(range(num_merges))):
      plt.hist(overlap_results[merge_idx], 20, range=(start, end), 
               facecolor=color, alpha=0.75)
      
    plt.xlabel("# shared features")
    plt.ylabel("# occurrences")
    plt.title("Component sharing\n%s categories, %s images." % \
              (num_cats, images_per_category))
    plt.grid(True)
    
    
    plt.subplot(1,2,2)
    start, end = 1000000, 0
    for color, merge_idx in zip(colors, range(num_merges)):
      start = min(start, min(cxn_results[merge_idx]))
      end = max(end, max(cxn_results[merge_idx]))
      
    for color, merge_idx in zip(colors, reversed(range(num_merges))):
      plt.hist(cxn_results[merge_idx], numpy.arange(start, end, (end-start)/20), 
               facecolor=color, alpha=0.75)
      
    plt.xlabel("# fewer connections")
    plt.ylabel("# occurrences")
    plt.title("Component sharing\n%s categories, %s images." % \
              (num_cats, images_per_category))
    plt.grid(True)
      
    plt.show()
     
    print colored("Analysis complete", "green")
    
    self.cxn_results = cxn_results
    self.overlap_results = overlap_results
    
    self.save_results()
    self.report()