使用深度神经网络的图像分类

使用深度神经网络的图像分类

介绍

深度学习的最新进展使诸如图像和语音识别等任务成为可能。

深度学习:机器学习算法的一个子集,它非常擅长识别模式,但通常需要大量的数据。

深度学习擅长识别图像中的对象,因为它使用3层或更多层的人工神经网络实现,其中每层负责提取图像的一个或多个特征(稍后会详细介绍)。

神经网络:一种计算模型,其工作方式与人类大脑中的神经元相似。每个神经元接受一个输入,执行一些操作,然后将输出传递给下一个神经元。

img

神经网络表示(src

我们将教计算机识别图像并将它们归类为以下10个类别之一:

img

为此,我们首先需要教给计算机一只猫,一只狗,一只鸟等在识别新物体之前的样子。计算机看到的猫越多,识别猫越好。这被称为监督学习。我们可以通过标记图像来执行这项任务,计算机将开始识别猫图片中存在的图案,这些图案缺少其他图案,并且将开始建立自己的认知。

我们将使用Python和TensorFlow来编写程序。TensorFlow是由Google创建的开源深度学习框架,它为开发人员提供了对每个神经元(在TensorFlow中称为“节点”)的粒度控制,因此您可以调整权重并实现最佳性能。TensorFlow拥有许多内置库(我们将用于图像分类的很少),并且拥有一个令人惊叹的社区,因此您可以找到几乎任何深度学习主题的开源实现。

所以让我们来做 - 让我们教计算机对图像进行分类!

机器学习图像

计算机能够对数字进行计算,并且无法以我们所做的方式解释图像。我们必须以某种方式将图像转换为计算机要理解的数字。

在图像处理中有两种常用的方法来做到这一点:

  1. 使用灰度:

图像将被转换为灰度(从白色到黑色的灰度范围),计算机将根据每个像素的黑暗程度分配一个值。所有数字都放入一个数组中,计算机在该数组上进行计算。这就是使用灰度显示数字8的方式:

img

图像转换为数字(src

然后,我们将生成的数组提供给计算机:

img

结果数组(src

2.使用RGB值:

颜色可以表示为RGB值(红色,绿色和蓝色的组合,范围从0到255)。计算机然后可以提取每个像素的RGB值并将结果放入数组中供解释。

当计算机解释新图像时,它将通过使用相同的技术将图像转换为数组,然后将数字模式与已知对象进行比较。计算机然后为每个班级分配信心分数。信心得分最高的班级通常是预测的班级。

简单句子(英语)“CNN”

卷积神经网络(Convolutional Neural Networks,简称CNN)是用于提高图像分类精度的最流行的技术之一。

卷积神经网络:一种特殊类型的神经网络,其工作方式与常规神经网络相同,只是它在开始时具有卷积层

而不是将整个图像作为数字数组输入,图像被分解成多个图块,然后机器会尝试预测每个图块的内容。最后,计算机根据预测的所有图块来预测图片中的内容。这允许计算机并行操作并检测对象,而不管它在图像中的位置。

数据集

我们决定使用CIFAR-10数据集,它包含60,000张大小为32 x 32像素的图像。数据集包含10个与每个包含6,000个图像的类互斥(不重叠)的类。图像很小,标签清晰,没有噪音,这使得数据集非常适合这项任务,而且预处理少得多。以下是从数据集中提取的几张照片:

img

步骤1:预处理

首先,我们需要为数据添加一点变化,因为来自数据集的图像非常有组织,包含很少或没有噪音。我们将使用名为imgaug的Python库人为添加噪音。我们将随机对图像进行如下组合:

  • 裁剪图像的部分
  • 水平翻转图像
  • 调整色调,对比度和饱和度

img

以上是结合上述效果的照片

以下是用于预处理图像的Python代码的样子:

def pre_process_image(image, training):
    # This function takes a single image as input,
    # and a boolean whether to build the training or testing graph.

    if training:
        # For training, add the following to the TensorFlow graph.

        # Randomly crop the input image.
        image = tf.random_crop(image, size=[img_size_cropped, img_size_cropped, num_channels])

        # Randomly flip the image horizontally.
        image = tf.image.random_flip_left_right(image)

        # Randomly adjust hue, contrast and saturation.
        image = tf.image.random_hue(image, max_delta=0.05)
        image = tf.image.random_contrast(image, lower=0.3, upper=1.0)
        image = tf.image.random_brightness(image, max_delta=0.2)
        image = tf.image.random_saturation(image, lower=0.0, upper=2.0)

        # Some of these functions may overflow and result in pixel
        # values beyond the [0, 1] range. It is unclear from the
        # documentation of TensorFlow 0.10.0rc0 whether this is
        # intended. A simple solution is to limit the range.

        # Limit the image pixels between [0, 1] in case of overflow.
        image = tf.minimum(image, 1.0)
        image = tf.maximum(image, 0.0)
    else:
        # For training, add the following to the TensorFlow graph.

        # Crop the input image around the centre so it is the same
        # size as images that are randomly cropped during training.
        image = tf.image.resize_image_with_crop_or_pad(image,
                                                       target_height=img_size_cropped,
                                                       target_width=img_size_cropped)

    return image

第2步:分割我们的数据集

使用整个大型数据集计算模型的梯度需要很长时间。因此,我们将在优化器的每次迭代期间使用一小批图像。批量大小通常为32或64,因为我们有相当多的图像,所以我们将使用64。然后将数据集分成包含50,000个图像的训练集和包含10,000个图像的测试集。

train_batch_size = 64
def random_batch():
    # Number of images in the training-set.
    num_images = len(images_train)

    # Create a random index.
    idx = np.random.choice(num_images,
                           size=train_batch_size,
                           replace=False)

    # Use the random index to select random images and labels.
    x_batch = images_train[idx, :, :, :]
    y_batch = labels_train[idx, :]

    return x_batch, y_batch

第3步:建立卷积神经网络

img

神经网络体系结构

现在我们已经完成了预处理和分割我们的数据集,我们可以开始实施我们的神经网络。我们将有3个卷积层,最大为2 x 2。

最大池化:一种技术,用于通过获取网格的最大像素值来减小图像的尺寸。这也有助于减少过度配合并使模型更通用。下面的示例显示了2 x 2最大池的工作原理

img

2 x 2最大池(src

之后,我们添加2个完全连接的图层。由于完全连接层的输入应该是二维的,并且卷积层的输出是四维的,所以我们需要它们之间的平坦化层。

完全连接的层的最后是softmax层。

参数识别是一项具有挑战性的任务,因为我们有很多参数需要调整。因此,我们阅读了大量资源并试图找出一种方法来实现它。但是,它似乎是基于经验。所以我们找到了Alex Krizhevsky制作的结构,他使用了这种结构并赢得了ImageNet LSVRC-2010的冠军。由于我们的工作比他的工作简单得多,所以我们只使用了3个卷积图层并在它们之间保持一个渐变。

结果

现在我们有一个训练有素的神经网络,我们可以使用它!然后我们让计算机翻译了10,000张未知图像,并获得了78.4%(7844/10000)的准确率。有趣的是,不正确的预测看起来非常接近电脑的想法。

img

错误预测的示例

例如,以右上角的图片为例,图片看起来像坐在卡车上的一只猫,它足以让电脑预测它为卡车。

结论

我们能够建立一个人造卷积神经网络,使用TensorFlow可以以78%的精度识别图像。我们通过预处理图像以使模型更通用,将数据集分成许多批次并最终构建和训练模型。

分享到