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

时间:2019-02-25 07:16:00

标签: keras computer-vision artificial-intelligence conv-neural-network resnet

example image

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

举个例子,我们可以假设苹果或西红柿的腐烂程度被分为非常低,低,中,高和非常高(5个类别),并且在相邻的类别对中存在非常相似的图像即(非常低和低,低和中,中和高,高和非常高)

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

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

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

CNN正在学习琐碎的功能,而FC层正在深入研究。在这种情况下,您需要添加更深的层以提高准确性

答案 2 :(得分:0)

视觉相似性不一定是问题。一般而言,如果人类无法分类,那么CNN也可能会失败。作为困难的粗略指示,您可以要求朋友对一些困难的样本进行分类,如果她(或您自己)在挣扎,这实际上是不可能的。我不认为您显示的示例非常困难,但是我可以看到人类也很难很好地分离类,并且查看数据及其标签可能会发现这一点。

答案 3 :(得分:0)

您可以使用卷积神经网络轻松完成此操作。
使用一些 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'])

尝试使用学习率或模型超参数进行试验以获得良好的结果