【问题标题】:How to make an image recognition deep net detect small differences如何让图像识别深度网络检测细微差异
【发布时间】:2018-02-19 12:07:14
【问题描述】:
我目前正在使用 Apache MXNet 进行机器学习项目,我正在使用 Inception V3 模型(MXNet 模型动物园上的 imagenet1k-inception-bn 模型)。
我目前正在尝试训练一个模型来区分两种对象类型,但对象之间的差异很微妙。我发现该模型仍然混淆了另一件事,因为它看起来几乎相同。
例如,假设您正在尝试训练模型来区分短吻鳄和鳄鱼。乍一看,人类区分它们的方法之一是观察它们鼻子的形状。在训练机器学习模型时,我是给它整个短吻鳄和鳄鱼的图像并希望它弄清楚,还是只给它鼻子的图像,因为这是我关注的区别?
谢谢!
【问题讨论】:
标签:
machine-learning
image-recognition
mxnet
【解决方案1】:
像 Inception 这样的深度学习模型能够在提供足够数据的情况下学习这些特征。您不需要裁剪到您认为对区分这两个类别有用的特征。理想情况下,一个或多个卷积过滤器将检测到鼻子中的某些形状,并能够正确分类。
不过,您不应该对模型抱有不合理的期望。如果仅凭视觉数据不足以让专家对某些短吻鳄与鳄鱼进行分类,那么您不应期望该模型能够做得更好。您应该建立一个人类基准表现,并以此进行比较。
与所有模型一样,数据质量/数量是最重要的部分。我强烈建议你也考虑迁移学习;使用在更大数据集上学习的权重作为起点。以this blog post 为例。您可以在模型末尾训练全连接层,以区分短吻鳄和鳄鱼。甚至是 fine tune the convolutional layers 以提高性能。
您可以使用 MXNet Gluon 轻松开始迁移学习。在下面的 sn-p 中,我们将权重从已经在 ImageNet(具有 1000 个类)上训练的 Inception v3 模型转移到非常相似的二元分类模型(除了最后几层之外相同)。然后,您可以使用自己的数据训练此网络。
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)