Unsupervised image classification? Does this exist? What algorithm or combinations of algorithms would be able to classify images without supervision? 

For example if you have many pictures of cats and dogs, then without being trained to distinguish them first, it would go through the images and realize there are two distinctive groups of images (either cat or dog)

Or if you have many random pictures but a good portion of them have trees, then going through the images, the algorithm realizes there is one consistent pattern within some of the images (trees)
As a starting point, you can think about unsuvervized image classification as a type of image clustering. You can - for instance - use VGG16 weights, extract image pseudo-features, and run some clustering on this feature set.
Here is some &quot;starter code&quot; (Python):
# Imports
from keras.preprocessing import image
from keras.applications.vgg16 import VGG16
from keras.applications.vgg16 import preprocess_input
import numpy as np
from sklearn.cluster import KMeans
import os, shutil, glob, os.path
from PIL import Image as pil_image
image.LOAD_TRUNCATED_IMAGES = True 
model = VGG16(weights='imagenet', include_top=False)

# Variables
imdir = 'C:/indir/' # DIR containing images
targetdir = &quot;C:/outdir/&quot; # DIR to copy clustered images to
number_clusters = 10

# Loop over files and get features
filelist = glob.glob(os.path.join(imdir, '*.jpg'))
filelist.sort()
featurelist = []
for i, imagepath in enumerate(filelist):
    try:
        print(&quot;    Status: %s / %s&quot; %(i, len(filelist)), end=&quot;\r&quot;)
        img = image.load_img(imagepath, target_size=(224, 224))
        img_data = image.img_to_array(img)
        img_data = np.expand_dims(img_data, axis=0)
        img_data = preprocess_input(img_data)
        features = np.array(model.predict(img_data))
        featurelist.append(features.flatten())
    except:
        continue

# Clustering
kmeans = KMeans(n_clusters=number_clusters, random_state=0).fit(np.array(featurelist))

# Copy images renamed by cluster 
# Check if target dir exists
try:
    os.makedirs(targetdir)
except OSError:
    pass
# Copy with cluster name
print(&quot;\n&quot;)
for i, m in enumerate(kmeans.labels_):
    try:
        print(&quot;    Copy: %s / %s&quot; %(i, len(kmeans.labels_)), end=&quot;\r&quot;)
        shutil.copy(filelist[i], targetdir + str(m) + &quot;_&quot; + str(i) + &quot;.jpg&quot;)
    except:
        continue