如何准备图像以使用Python / Keras训练ConvNet?

时间:2019-08-12 02:46:48

标签: machine-learning keras classification conv-neural-network

尝试使用Python + Keras训练cnn(卷积神经网络)。但是,即使是最简单的问题也似乎难以回答,那里的教程也没有我所寻求的答案。

我可以访问数千个我想识别的课程的图像。但是如何准备图像?例如:

  1. 是否应该将图像准确地裁剪为我想要识别的对象?在这种情况下,对象是完美的矩形,因此如果可以帮助训练,我可以将它们裁剪为完美。
  2. 图像应为多大?我是将它们保持高分辨率还是将其调整为较小尺寸?诸如MNIST之类的很多示例都使用18x18像素的图像,但是在这种尺寸下,这些类别的对象是毫无意义的模糊,彼此相似。
  3. 在培训期间,我应该只拥有要识别的班级图像吗?还是我应该在图像中插入一些我不关心的其他图像?
  4. 在培训期间,可以在单个图像中包含对象的多个实例吗?还是应该将训练图像限制为只有一个类的一个对象?

编辑:有人问我是否需要知道对象的位置。答案是我需要进行对象检测:

classification vs semantic segmentation vs object detection vs instance segmentation

(该图片是从blog post中获得的有关Mask-RCNN的图片,但是我的问题比这更新颖,它不是特定于Mask-RCNN的。)

2 个答案:

答案 0 :(得分:1)

回答每个问题:

  1. 否,因为在测试时,这不是网络将接收的内容。它会在某个位置接收到带有物体的图像,周围有很多杂讯,因此最好训练它以解决该问题。
  2. 在图像仍然可以区分的同时,请提供尽可能低的分辨率。如果您可以区分它们,那么解决方案就可以了。分辨率较低的原因是为了减少复杂性并增加历元/时间
  3. 这取决于您,这取决于您是否认为该网络实际上会收到完全随机的输入。如果您想知道一些处理方法,请参见:My CNN classifier gives wrong prediction on random images
  4. 是的,只要它在训练过程中多次出现并且不是异常值即可。您希望训练数据尽可能统一,因此理想情况下,如果有时有多个对象,并且只有一次,这两种情况下应该有相同数量的训练图像,以便网络统一学习。

其他准备方式:

  • 有时对图像进行灰度处理可以帮助降低 复杂性。

  • 集中数据(通过获取每个像素的平均像素值 跨整个数据集并将其从每个像素中减去)可以 也有帮助。

答案 1 :(得分:1)

我的建议是,从小而简单开始:首先使用通用的配置/参数/方法,然后根据要执行的实验结果根据需要进行更改。

  
      
  1. 是否将图像裁切成我想要识别的对象?在这种情况下,对象是完美的矩形,因此如果可以帮助训练,我可以将它们裁剪为完美。
  2.   

不,不一定。实际上,最好不要这样做,因为当您想在现实世界中使用模型时,图像不会被完美裁剪。例如,假设您在房间里拍摄了以下照片:

image of a chair in the room

您希望模型预测“椅子”作为输出,尽管背景中还有其他内容。因此,您的模型在现实世界中发现的许多图像中可能会更适用/更强壮,这些图像可能在背景中显得杂乱无章。此外,并非总是有包围对象的框的坐标可以将其裁剪掉。

  
      
  1. 图像应为多大?我是将它们保持高分辨率还是将其调整为较小尺寸?诸如MNIST之类的很多示例都使用18x18像素的图像,但是在这种尺寸下,这些类别的对象是毫无意义的模糊,彼此相似。
  2.   

粘贴到图像常用的尺寸。例如,在ImageNet上训练的大多数模型都将尺寸为224x224的图像作为输入。请记住,图像越大,模型的训练将在计算上涉及更多,因此需要花费更多的时间来训练。通常,越小越好,只要您在调整大小后不会丢失过多的图像信息/图像质量即可。

  
      
  1. 在培训期间,我应该只拥有要识别的班级图像吗?还是我应该在图像中插入一些我不关心的其他图像?
  2.   

通常,我们只有来自要分类的已知类的图像,而不考虑“其他”类。但是,如果您对模型能够将未知图像分类为一类感兴趣(请注意,仅对猫和狗的图像进行训练的模型可以将所有事物视为猫和猫,并且将其分类为猫和狗)或一棵树或烤箱),您可以添加另一个“未知” /“其他”类别,并将没有与之关联的所有图像分配给该类别。但是,在训练结束后,您不应指望模型可以完全识别任何未知对象并将其预测为“未知”类(即主要是因为属于“未知”类的图像非常多)导致您无法仅用数百或数千个未知图像示例来代表它们)。

  
      
  1. 在培训期间,可以在单个图像中包含对象的多个实例吗?还是应该将训练图像限制为只有一个类的一个对象?
  2.   

我不认为图像中具有同一对象的多个实例不会造成任何问题,这主要是由于CNN是平移不变的事实,因此,如果在图像区域中检测到特征,则可以检测到该特征图片中的其他位置(可能属于该对象的另一个实例)。如果您在训练数据中混合了单实例和多实例图像,则甚至可以提高模型的准确性。

最后一点,我建议您不要从头开始训练CNN分类模型。在ImageNet上已经有非常好的模型训练,因此您可以使用已经在这些模型中提取和积累的知识(即,这种方法称为“转移学习”,即您将知识从一个域/模型转换为另一域/模型) 。例如,您可以将VGG16用作模型的基础,而只需更改顶层(或仅更改分类器层)。这样,训练不仅会更快(因为已经对基础进行了训练,并且至少在我们看到的所有图像之间共享了诸如边缘或纹理之类的低级特征),但它也会更加准确(因为已经对数千张图片进行了训练)。我建议您阅读这篇official tutorial from Keras blog,它说明了如何使用这种培训。