如何从AlexNet获取多个图像标签

时间:2017-06-06 20:02:18

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

所以,我正在做我的硕士论文,关于超分辨率算法对AlexNet图像标记准确率的影响。我正在使用Matlab和预先训练的AlexNet版本。

问题在于,使用

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

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

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

1 个答案:

答案 0 :(得分:2)

scores矩阵告诉您在分类数据时每个类的得分情况。具体来说,每个列i都会告诉您在尝试使用类i对输入进行分类时,i类的得分是如何得分的。每行都是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个元素。因此,根据我上面编写的代码中的类变量,您可以这样做:

out = net.Layers(end).ClassNames(classes);
因此,

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