【问题标题】:How to get from AlexNet multiple image labels如何从 AlexNet 中获取多个图像标签
【发布时间】:2017-11-07 23:49:49
【问题描述】:

所以,我的硕士论文是关于超分辨率算法对 AlexNet 图像标注准确率的影响。我将 Matlab 与 AlexNet 的预训练版本一起使用。

问题是,通过使用

[label, scores] = classify(net, 'image')

我只得到一个标签,而我想得到多个标签,例如,五个,以及 AlexNet 的相应分数。

我不知道该怎么做,如果有人能给我至少一个提示,我将非常感激。

【问题讨论】:

    标签: image matlab machine-learning neural-network computer-vision


    【解决方案1】:

    scores 矩阵告诉您在对数据进行分类时每个类别的得分情况。具体来说,i 的每一列都会告诉您在尝试使用类 i 对输入进行分类时,ith 类的得分是如何变化的。每一行都是 AlexNet 的一个输入。

    如果您想获得每个输入的最高 k 分数,您可以 sort - 具体查看第二个输出变量并对每一行单独排序。之后,您可以提取结果的前k 列,这些列告诉您与输入关联的前 5 个类或标签。如果您关心实际的类,请查看第一个输出。

    % First classify the image(s) you would like
    [label, scores] = classify(net, ...);
    
    k = 5; % We want 5 classes
    [scores_sorted, classes] = sort(scores, 2); % Sort each row individually
    scores_sorted = scores_sorted(:, 1 : k);
    classes = classes(:, 1 : k);
    

    scores_sortedclasses 现在将为您提供k 列矩阵,其中每一行告诉您为每个输入分配的顶级k 类(存储在classes)以及AlexNet 提供的分数( scores_sorted)。

    为了最终确定实际的类是什么,当您创建 AlexNet 时,最后一层具有分类的类别。假设您创建了默认网络:

    net = alexnet;
    

    ...您可以通过以下方式确定每个标签 ID 的类:

    c = net.Layers(end).ClassNames;
    

    这是一个类元胞数组,总共应该有 1000 个元素。因此,鉴于我上面编写的代码中的 classes 变量,您可以这样做:

    out = net.Layers(end).ClassNames(classes);
    

    classes 因此将用于索引单元格数组,因此它将为您提供一个 N x k 单元格数组,其中该单元格数组中的每一行都告诉您 AlexNet 为顶级 k 类分配的标签每个输入图像。

    【讨论】:

    • 哇,这很快,非常感谢你:)) 我知道分数矩阵与不同的类相关联,但我不知道如何。它们是否以某种方式与预训练的 AlexNet 的 1000 个类(或同义词集)列表相关联?有没有办法将课程映射到分数?
    • classes 会给你一个整数索引,你可以用它来索引 AlexNet 提供的实际分类数据。例如,如果 AlexNet 将输出分配为类别 400,这意味着它属于类别 400,假设您使用的是 ILSVRC2010 数据。将课程映射到分数已经为您完成。 scores 为您提供分配给 AlexNet 的分数,而 classes 为您提供每个班级如何为输入分配相应的分数。
    • 问题是,当使用 matlab 的 classify 函数时,我只得到 1 个标签(即一个类或同义词集),但我不知道如何获得更多标签。您似乎暗示我可以获得一个名为class 的变量,其中所有类都将根据ILSVRC2010 定义,但我不知道该怎么做。如果您能告诉我如何在 matlab 中执行此操作,我将不胜感激。谢谢你,真的,非常感谢你想帮助我:)
    • 我已经告诉过你怎么做。但是,如果您真的希望我详细介绍,这超出了您问题的原始范围。创建 AlexNet 时,最后一层具有分类类别。假设您创建了默认网络:net = alexnet;,您可以通过以下方式确定每个标签 ID 的类:c = net.Layers(end).ClassNames;。这是一个类元胞数组,总共应该有 1000 个元素。因此,鉴于我在上面编写的代码中的classes 变量,您可以这样做:out = net.Layers(end).ClassNames(classes);(下文继续)。
    • classes 因此将用于索引单元格数组,因此它将为您提供一个 N x k 单元格数组,其中该单元格数组中的每一行都告诉您 AlexNet 为每个输入图像的顶部 k 类。
    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2018-09-10
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多