docs: private AssignCluster<double[]> computeClusters() {
  		System.out.println("Image Features");
  
  		// computes features in the training image set
  		List<TupleDesc_F64> features = new ArrayList<>();
  		for( String scene : train.keySet() ) {
  			List<String> imagePaths = train.get(scene);
  			System.out.println("   " + scene);
  
  			for( String path : imagePaths ) {
  				GrayU8 image = UtilImageIO.loadImage(path, GrayU8.class);
  				describeImage.process(image);
  
  				// the descriptions will get recycled on the next call, so create a copy
  				for( TupleDesc_F64 d : describeImage.getDescriptions() ) {
  					features.add( d.copy() );
  				}
  			}
  		}
  		// add the features to the overall list which the clusters will be found inside of
  		for (int i = 0; i < features.size(); i++) {
  			cluster.addReference(features.get(i));
  		}
  
  		System.out.println("Clustering");
  		// Find the clusters.  This can take a bit
  		cluster.process(NUMBER_OF_WORDS);
  
  		UtilIO.save(cluster.getAssignment(), CLUSTER_FILE_NAME);
  
  		return cluster.getAssignment();
  	}