无监督图像分类?

数据挖掘 机器学习 深度学习 卷积
2022-02-12 20:04:50

这存在吗?什么算法或算法组合能够在没有监督的情况下对图像进行分类?

例如,如果你有很多猫和狗的照片,那么在没有先训练来区分它们的情况下,它会遍历图像并意识到有两组不同的图像(猫或狗)

或者,如果您有许多随机图片,但其中很大一部分有树,那么通过这些图像,算法会发现在一些图像(树)中有一个一致的模式

2个回答

作为起点,您可以将未经监督的图像分类视为一种图像聚类。例如,您可以使用 VGG16 权重,提取图像伪特征,并在此特征集上运行一些聚类。

这是一些“入门代码”(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 = "C:/outdir/" # 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("    Status: %s / %s" %(i, len(filelist)), end="\r")
        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("\n")
for i, m in enumerate(kmeans.labels_):
    try:
        print("    Copy: %s / %s" %(i, len(kmeans.labels_)), end="\r")
        shutil.copy(filelist[i], targetdir + str(m) + "_" + str(i) + ".jpg")
    except:
        continue

检查这篇论文他们使用来自 Instagram 的 1kkk 未标记图像在流行数据集上取得了开创性的分数。