如何使图像识别深网检测出微小的差异

时间:2018-02-19 12:07:15

标签: machine-learning image-recognition mxnet

我目前正在使用Apache MXNet开展机器学习项目,我使用的是Inception V3模型(MXNet模型动物园上的imagenet1k-inception-bn模型)。

我目前正在尝试训练模型以区分两种对象类型,但对象之间的差异是微妙的。我发现该模型仍然混淆了另一件事,因为它看起来大致相同。

例如,假设您正在尝试训练模型以区分鳄鱼和鳄鱼。人类乍看之下告诉他们的方式之一是通过观察他们的鼻子的形状。在训练机器学习模型的时候,我会给它整个短吻鳄和鳄鱼的图像并希望它能够解决它,或者我会给它只是他们的鼻子的图像,因为那是我关注的差异吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

像Inception这样的深度学习模型能够在给定足够数据的情况下学习这些功能。您不应该裁剪到认为对于区分这两个类有用的功能。理想情况下,一个或多个卷积滤波器将检测到口鼻部的某些形状,并能够正确分类。

尽管如此,你不应该对模型抱有不合理的期望。如果单独的视觉数据不足以让专家对鳄鱼与鳄鱼进行分类,那么你不应该期望模型能够做得更好。您应该建立人类基线表现,并将其用于比较。

与所有型号一样,数据质量/数量是最重要的部分。我强烈建议你也考虑转学习;使用在更大的数据集上学习的权重作为起点。查看this blog post以获取示例。您可以在模型末端训练完全连接的层,以区分短吻鳄和鳄鱼。甚至fine tune the convolutional layers以提高性能。

您可以使用MXNet Gluon轻松开始转学。在下面的片段中,我们将权重从已经在ImageNet上训练的Inception v3模型(具有1000个类)转移到用于二进制分类的非常相似的模型(与最后的层相同)。然后,您可以使用自己的数据训练此网络。

import mxnet as mx

pretrained_net = mx.gluon.model_zoo.vision.get_model(name='inceptionv3', pretrained=True, classes=1000, prefix='aligcroc_')
net = mx.gluon.model_zoo.vision.get_model(name='inceptionv3', classes=2, prefix='aligcroc_')
net.features = pretrained_net.features
net.output.initialize()

batch_size = 1
channels = 3
height = width = 299
data_batch = mx.ndarray.random.normal(shape=(batch_size, channels, height, width))
net(data_batch)