Machine learning 基于迁移学习的单类数据集图像分类

Machine learning 基于迁移学习的单类数据集图像分类,machine-learning,classification,conv-neural-network,transfer-learning,Machine Learning,Classification,Conv Neural Network,Transfer Learning,我只有大约1000张电脑图像。我需要训练一个模型,可以识别图像是计算机还是非计算机。我没有用于非计算机的数据集,因为它可以是任何东西 我想最好的方法是运用迁移学习。我试图在预先训练过的VGG19模型上训练数据。但是,我仍然不知道如何训练一个只有计算机图像而没有任何非计算机图像的模型 总的来说,我对ML还不熟悉,所以如果问题不切题,我很抱歉。不行,我很抱歉。您将需要大量(至少其他1000张图像)非计算机图像。您可以从任何地方获取它们,它们“变化”越多,您的模型就越能够提取计算机的特征 想象一下,如

我只有大约1000张电脑图像。我需要训练一个模型,可以识别图像是计算机还是非计算机。我没有用于非计算机的数据集,因为它可以是任何东西

我想最好的方法是运用迁移学习。我试图在预先训练过的VGG19模型上训练数据。但是,我仍然不知道如何训练一个只有计算机图像而没有任何非计算机图像的模型


总的来说,我对ML还不熟悉,所以如果问题不切题,我很抱歉。

不行,我很抱歉。您将需要大量(至少其他1000张图像)非计算机图像。您可以从任何地方获取它们,它们“变化”越多,您的模型就越能够提取计算机的特征

想象一下,如果你是一个被训练成总是在某件事面前说“是”的婴儿,那么下次当你看到某件事的时候,无论你面前是什么,你都会说“是”

机器学习模型也是如此,你需要正面的例子和负面的例子,否则你的模型会有100%的准确度,预测总是“是”

如果要从数学/几何角度查看,可以将每个样本(在您的示例中为图像)视为要素空间中的一个点:想象为每个属性(x、y、z等)绘制一个轴,图像将是该空间中的一个点

为简单起见,我们考虑一个二维空间,这意味着每个图像可以用2个属性来描述(不是图像的情况,通常特征是很多的,但是为了简单起见,想象特征1=颜色的数量,特征2=角度的数量),在这个例子中,我们可以简单地在笛卡尔图中画一个点,每个图像一个:

分类器的目标是划出一条线,这条线可以更好地将红点和蓝点分开,这意味着将正面的例子和负面的例子分开

如果您只给模型正的样本(这就是您要做的),您将拥有100%准确度的无限模型!因为您可以在任何地方放置一行数据,所以唯一的要求是不要“剪切”数据集

考虑到我认为你是一个初学者,我只会告诉你该做什么,而不是怎么做,因为这需要很多年;)

1) 收集数据——正如我告诉你的,即使是负面的例子,至少还有1000个样本

2) 将数据拆分为训练/测试-良好的拆分可能是训练集中样本的2/3和测试集中样本的1/3。[记住]保持最终类别分布的一致性,即如果您有50%-50%的类别为“计算机”-“非计算机”,则您应保持列车组和测试组的百分比

3) 训练一个模型-看看链接中的示例,它使用MNIST数据集,这是一个著名的图像分类数据集,你应该使用你的数据


4) 在测试集上测试模型并查看性能

虽然只获取属于一类数据的数据,然后使用方法对其他数据是否属于同一类进行分类并非不可能,但这样做通常不会获得太高的准确性

一种方法是使用“自动编码器”。这里的要点是,您使用相同的图像作为输入和目标,并确保(通常是神经网络)以某种方式压缩图像,使其仅存储重建计算机图像的重要内容。理想情况下,这将导致一个模型,它擅长于重建计算机图像,而不擅长其他任何事情,这意味着您可以测试输出的损失有多大,如果它高于您决定的某个阈值,您将认为它是其他东西。同样,这样做可能无法获得接近90%的准确率,但这是解决问题的一种方法

一种更好的方法是寻找在某些数据集上预先训练过的模型,这些数据集包含计算机作为数据集的一部分,获取相同的数据集并将所有计算机设置为一个类(+您自己的图像,确保它们符合数据集格式),并将其他图像的选择设置为另一个类。确保不要使类过于不平衡,否则您的模型将受到影响。将预先训练好的模型扩展为两层,完全连接可能会很好,并使模型的预先训练部分不可训练,这样当你实际上告诉它忽略所有不是计算机的东西时,你就不会把好的权重搞乱。 这可能是您的最佳选择,但您需要付出更多的努力才能找到实现这一目标所需的所有部分,并了解如何将这些代码集成到您的代码中。

没问题

第一步:安装您选择的深度学习工具包。这些天他们都有很好的教程

第二步:获取预先训练好的imagenet模型。在该模型中,已经内置了一些计算机类!(“台式电脑”、“笔记本电脑”、“笔记本电脑”和另一类手提电脑“手提电脑”)

第三步:使用模型进行预测。为此,您需要使图像具有正确的大小

更多步骤:进一步微调模型…更高级一点,但会给你一些好处

需要考虑的是你的目标是什么?准确度?误报/否定,等等?从一开始就有一个你需要完成的目标总是好的

编辑:可能最简单的入门方法(如果你没有库、gpu等)是转到GoogleColab(),在浏览器中制作一个笔记本,然后运行以下代码

#some code take and modded from https://www.learnopencv.com/keras-tutorial-    using-pre-trained-imagenet-models/

import keras
import numpy as np
from keras.applications import vgg16

from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.applications.imagenet_utils import decode_predictions
import matplotlib.pyplot as plt
from PIL import Image
import requests
from io import BytesIO

%matplotlib inline
vgg_model = vgg16.VGG16(weights='imagenet')

def predict_image(image_url, model):

    response = requests.get(image_url)
    original = Image.open(BytesIO(response.content))

    newsize = (224, 224) 
    original = original.resize(newsize) 

    # convert the PIL image to a numpy array
    # IN PIL - image is in (width, height, channel)
    # In Numpy - image is in (height, width, channel)
    numpy_image = img_to_array(original)

    # Convert the image / images into batch format
    # expand_dims will add an extra dimension to the data at a particular axis
    # We want the input matrix to the network to be of the form (batchsize, height, width, channels)
    # Thus we add the extra dimension to the axis 0.
    image_batch = np.expand_dims(numpy_image, axis=0)
    plt.imshow(np.uint8(image_batch[0]))
    plt.show()

    # prepare the image for the VGG model
    processed_image = vgg16.preprocess_input(image_batch.copy())

    # get the predicted probabilities for each class
    predictions = model.predict(processed_image)

    # convert the probabilities to class labels
    # We will get top 5 predictions which is the default
    label = decode_predictions(predictions)
    print label[0][0:2]  #just display top 2


urls = ['https://4.imimg.com/data4/CO/YS/MY-29352968/samsung-desktop-computer-500x500.jpg', 'https://cdn.britannica.com/77/170477-050-1C747EE3/Laptop-computer.jpg']

for u in urls:
    predict_image(u, vgg_model)

这应该是一个很好的起点。哦,如果预测的最高标签不在计算机、笔记本电脑等集合中,那么它就不是一台计算机

  • 您可以使用imagenet数据集上的预训练模型使用迁移学习