对属于不同类别的具有非常相似特征的图像进行分类

Posted

技术标签:

【中文标题】对属于不同类别的具有非常相似特征的图像进行分类【英文标题】:Classifying images with very similar features belonging to different classes 【发布时间】:2019-07-18 13:28:07 【问题描述】:

我有一个数据集,我需要在其中对某些标记图像集进行分类。目前这是由人类专家完成的,因此可用的数据集质量很好。这些图像有一些非常相似的特征。

举个例子,我们可以假设苹果或番茄的腐烂量被分类为非常低、低、中、高和非常高(5 类),并且相邻类对中存在非常相似的图像即; (非常低和低、低和中、中和高、高和非常高)

有没有办法克服这个问题?

似乎具有挑战性,因为区分相邻类别非常复杂且令人困惑,因为一个非常相似的图像存在于多个类别中。

【问题讨论】:

您尝试过什么还是只是在猜测? 相似的图像显然比具有高度不同特征的图像类更难区分。恐怕您的问题没有神奇的解决方案,无论您选择哪种特征或分类器,一个困难的分类任务都将难以解决。 @BlackBear 我尝试使用 ResNet50 通过冻结基本模型架构并仅训练我在下面添加的 Dense 层(也尝试使用 BatchNorm 和 Dropout),使用 SGD 优化器(尝试不同的学习率范围从 0.1 到 0.001)。输出是训练准确率和训练损失提高到 78%,但验证准确率在 53% 之后才停止增加。 你有多少张图片?越多越好。也许你可以减少课程的数量。也尝试使用序数回归,例如kaggle.com/c/diabetic-retinopathy-detection/discussion/13115 您应该会看到 40 倍数据的显着改进 :) 至于实施,请参见例如github.com/JHart96/keras_ordinal_categorical_crossentropy 【参考方案1】:

我建议您只使用一个分数值(例如 0.0~1.0)作为“烂分数”,并根据烂分数结果对值进行分箱。

例如: 0.0~0.2:极低腐烂 0.2~0.4:低腐 0.4~0.6:中腐 0.6~0.8:高腐 0.8~1.0 : 非常高的腐烂

【讨论】:

【参考方案2】:

CNN 正在学习微不足道的特征,而 FC 层则更加深入。在这种情况下,您需要添加更深的层以获得更好的准确性

【讨论】:

【参考方案3】:

视觉相似性不一定是问题。一般来说,如果人类无法分类,CNN 也可能会失败。作为难度的粗略指示,您可能会要求朋友对一些困难的样本进行分类,如果她/他(或您自己)挣扎,这几乎是不可能的。我不认为您展示的示例非常困难,但我可以看到人类也很难很好地区分类别,查看数据及其标签可能会揭示这一点。

【讨论】:

【参考方案4】:

您可以使用卷积神经网络轻松做到这一点。 使用一些Conv2D 块从图像中提取特征,然后在最后使用完全连接的Dense 层。 由于您有 5 个类要预测,所以最后一层的 softmax 激活函数就足够了。 并通过除以 255.0 来归一化图像像素值,以加快训练速度。 并且标签应该是整数编码的。

model = Sequential()
model.add(Conv2D(32,(3,3),activation='relu',padding='same'))
model.add(Conv2D(32,(3,3),activation='relu',padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64,(3,3),activation='relu',padding='same'))
model.add(Conv2D(64,(3,3),activation='relu',padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dropout(0.15))
model.add(Dense(100, activation='relu'))
model.add(Dropout(0.15))
model.add(Dense(50,activation='relu'))
model.add(Dense(5,activation='softmax'))

然后用sparse_categorical_crossentropy损失函数编译模型

model.compile(optimizer=Adam(0.001),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

尝试使用学习率或模型超参数来获得好的结果

【讨论】:

以上是关于对属于不同类别的具有非常相似特征的图像进行分类的主要内容,如果未能解决你的问题,请参考以下文章

KNN算法的实现

细粒度图像分类

K近邻算法——多分类问题

TensorFlow实现knn(k近邻)算法

数据挖掘干货(k-NN)

Inception Score