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

v8wbuo2f  于 2022-12-13  发布在  其他
关注(0)|答案(4)|浏览(179)

我有一个数据集,我需要在其中对某组已标记的图像进行分类。目前这是由人类Maven完成的,因此可用的数据集质量很好。图像具有一些非常相似的特征。
为了说明一个示例,我们可以假设苹果或番茄的腐烂量被分类为非常低、低、中、高和非常高(5类),并且非常相似的图像存在于相邻类对即:(极低和低、低和中、中和高、高和极高)
有没有办法克服这一点?
似乎具有挑战性,因为相邻类别之间的区分非常复杂和混乱,因为非常相似的图像存在于不止一个类别中。

umuewwlo

umuewwlo1#

我建议您仅使用一个评分值(如0.0~1.0)作为“不合格评分”,并根据不合格评分结果对该值进行分组。
例如:0.0~0.2:极低腐烂度0.2~0.4:低腐型0.4~0.6:中腐0.6~0.8:高腐型0.8~1.0:极高腐烂

vs91vp4v

vs91vp4v2#

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

j8ag8udp

j8ag8udp3#

视觉相似性并不一定是个问题。一般来说,如果人类无法分类,那么CNNs也可能失败。作为难度的粗略指示,你可以让朋友分类一些困难的样本,如果她/他很吃力的话我不认为你举的这个例子是非常困难的,但我可以看到人类也有困难很好地分离类,看看数据和它的标签可能会揭示这一点。

wvyml7n5

wvyml7n54#

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

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

相关问题