使用 TensorFlow 和 Mobilenetv2 的乐高积木图像分类(上)


选自:Medium

作者:Alejandro J Rod

Lego 积木数据集预处理

我们想使用 CNN 创建深度学习模型,该模型能够按图像分类对 Lego 积木进行分类。第一步是选择数据集。

仔细检查了几个选项,我们发现并选择了一个非常适合这个项目的数据集:来自 kaggle的数据集。它包含 20,300 张 Lego 积木和普通积木的图像,但是我们选择仅使用 Lego 图像;它也包含正常图像和裁剪后的图像,我们仅使用裁剪后的图像——因为这样可以更好地训练模型。

现在有了数据集,就可以开始创建模型所需的结构。我们选择了一种使用文件夹结构作为定义类和子类的方法。对于本例来说,只需要 6 个类,因为数据集只包含这些类别。


使用 TensorFlow 和 Mobilenetv2 的乐高积木图像分类(上)

文件夹和应用程序类

在定义了数据集并按预期分离图像之后,我们继续对数据进行预处理。在这个阶段,我们要获取图像,将其传递到灰度级,再把所有图像的维度重新整形为相同的维度,转换为数组。

通过下方的 GitHub 托管链接可查看“预处理要用于 DeepLearning 模型的图像”的长代码:

https://gist.github.com/AlejoCR/a0ebba6e51df5913df8805282d3b60ba

数据准备好后,先将它保存起来,这样就不需要每次在数据集上运行测试时都重新进行处理。

对 Lego 积木图像分类器进行模型训练

_现在来选择要使用的框架和深度学习方法,由于我们将在 Jetson Nano 上运行推理模型,因此需要能够在限资源的 GPU 设备上运行。由于我们使用的是图像应用,因此我们将使用卷积神经网络(CNN),CNN 能提供良好的精度,也不需要强大的硬件。

TensorFlow

因为要在 Jetson Nano中部署项目,所以我们必须考虑到框架的问题。

TensorFlow 是用于机器学习的端到端开源平台。它是具有工具、库和社区资源的全面灵活的生态系统,可以让研究人员推动 ML 领域的最新发展,同时让开发人员轻松构建和部署 ML 支持的应用程序。

TensorFlow 最初是由 Google 机器智能研究组织内 Google Brain 团队的研究人员和工程师开发的,用于进行机器学习和深度神经网络研究。由于有足够的通用性,TensorFlow 也可以适用于多种其他领域。

TensorFlow 提供稳定的 Python 和 C ++ API,以及其他语言的非保证向后兼容 API 。

还有一个非常重要的功能是:TensorFlow 支持 GPU。因为 Jetson Nano 就有一个 GPU,所以我们想要使用处理器来提高深度学习应用程序的性能。

GPU 的操作可以通过 Nvidia 驱动程序,Cuda Toolkit 来完成。在最新版本上,我们也可以使用 TensorRT—— 一个高性能深度学习推理的平台。它包括深度学习推理优化器和运行时,可以为深度学习推理的应用程序提供低延迟和高吞吐量。在推理过程中,基于 TensorRT 的应用程序的运行速度,比仅基于 CPU 平台的快 40 倍。

MobileNetV2

通过对 Jetson Nano 的深度学习测试,我们发现 MobileNetV2 具有更好的性能。

使用 TensorFlow 和 Mobilenetv2 的乐高积木图像分类(上)

利用 Jetson Nano 和 TensorRT,使用 FP16 精度和批量大小对各种深度学习推理网络进行了性能分析

MobileNetV2 是由 Google 开发的卷积神经网络(CNN),旨在为视觉应用创建高性能和高精度的神经网络,并应用于资源有限的移动设备上。

MobileNetV2 也是 MobileNetV1 的改进,它使用了深度可分离卷积。此外,V2 为该体系结构引入了两个新功能:层之间的线性瓶颈和瓶颈之间的快捷连接。它的基本结构如下所示:

使用 TensorFlow 和 Mobilenetv2 的乐高积木图像分类(上)

MobileNetV2 基本结构

深度卷积是普通卷积的一种变体。常规的 2D 卷积,是在多个输入通道上执行的,滤波器与输入一样深,让我们自由地混合通道来生成输出中每个元素;但是深度卷积每个通道保持独立。

而深度可分卷积,在深度可分卷积完成之后,将执行另一个步骤:跨信道的 1x1 卷积。对于不同的输出通道,可以多次重复这个步骤。所有的输出通道均采用深度步进的输出,并将它与不同的 1x1 卷积混合在一起。


使用 TensorFlow 和 Mobilenetv2 的乐高积木图像分类(上)

深度可分卷积

Residual blocks 使用跳跃链接连接卷积块的开始和结束。通过添加这两种状态,可以让网络访问没有在卷积块中修改的早期激活,这个方法对于构建深度网络至关重要。

下图为 Inverted residual block。斜线阴影纹理表示不包含非线性的图层。它提供了构件块(瓶颈层)的输入/输出域与层转换(将输入转换为输出的非线性函数)之间的自然分离。前者可以看作是网络在每一层的容量,而后者则是表现力。


使用 TensorFlow 和 Mobilenetv2 的乐高积木图像分类(上)

我们之所以在神经网络中使用非线性激活函数,是因为多个矩阵乘法不能被简化为一个单一的数值运算,它允许构建多层的神经网络。同时,神经网络中常用的激活函数 ReLU 会丢弃小于 0 的值,为了提高网络的容量,可以通过增加信道的数量来解决信息丢失的问题。

对于 inverted residual blocks,我们做相反的事情,并挤压跳过连接所链接的层, 这会损害网络的性能。作者介绍了线性瓶颈的概念,其中残差块的最后卷积在将其添加到初始激活之前具有线性输出。将其放入代码非常简单,因为我们只是丢弃了卷积块的最后一个激活函数

MobileNetV2的结构如下图所示,其中每一行描述1个或多个相同(modulo stride)层的序列,重复n次。同一序列中的所有层具有相同数量的输出通道。每个序列的第一层有一个 stride s,其他都使用 stride 1,所有空间卷积都使用 3×3 的 kernels。

使用 TensorFlow 和 Mobilenetv2 的乐高积木图像分类(上)

MobilenetV2 结构

为 Lego 积木图像分类器重新训练 mobilenetV2

实现模型的障碍之一是时间和硬件资源。所以当我们尝试在短时间(约2周)内实施该项目时,并没有考虑使用带有硬件的 PC 来实现高性能的操作,而是选择了基于 MobilenetV2 的迁移学习进行实施的选项。

现代图像识别模型有数百万个参数,从头开始训练它们需要大量带标签的训练数据和大量计算能力(数百个 GPU 小时或更长时间)。而迁移学习就是一种简化的技巧,它可以选择一部分已经在相关任务上训练过的模型,然后重用在一个新的模型中。本教程将重用 ImageNet 上经过训练的强大图像分类器的特征提取功能,并在上面简单地训练新的分类层。

虽然这样比不上训练完整模型,但是对于许多应用程序来说却已经极其有效了。它可以处理少量的训练数据(数千个,而不是数百万个带标签的图像),并且在不使用 GPU 的笔记本电脑上运行30分钟。

为了在 MobilenetV2 上实施再训练,我们选择使用 TensorFlow Hub。TensorFlow Hub 是一个用于发布、发现和使用机器学习模型的可重用部分的库。模块是TensorFlow 图表的自包含部分,连同它的重量和资产,可以在迁移学习的过程中跨不同任务重用。迁移学习可以:

  • 用较小的数据集训练模型;
  • 提高泛化能力;
  • 加快训练速度。

为了安装 TensorFlow Hub,我们只需要在命令下方运行即可。

<code>$ pip install tensorflow-hub/<code>

训练用于 Lego 积木的 MobilenetV2

为了重新训练网络,我们在 Github 上使用了此脚本获取图像,并执行为推理模型创建冻结图和标签文件的过程。

使用此文件,我们运行以下命令:

<code>python retrain.py \\    --image_dir〜/ lego_bricks \\    --tfhub_module https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/3 \\    --random_crop = 5 \\    --random_brightness = 5 \\    --random_scale = 5 \\    --flip_left_right \\    --summaries_dir = mobilenetv2 \\    --learning_rate = 0.02 \\    --how_many_training_steps = 4000 \\/<code>

在这里,我们通过开关 tfhub_module 选择神经网络的类型。其他的开关则被用来在图像中加入“噪声”,包括剪裁、亮度、随机缩放和翻转。我们还将学习率调整为 0.02,以增加默认值 0.1。这个过程执行 4000 步。

这个过程之后,我们得到了经过训练的模型结果如下:

使用 TensorFlow 和 Mobilenetv2 的乐高积木图像分类(上)

训练模型的准确性

使用 TensorFlow 和 Mobilenetv2 的乐高积木图像分类(上)

训练模型的损耗变化

一旦获得此模型,就可以在 Jetson Nano 上继续实现。这个内容我们将在第三部分展开。


原文链接:

https://medium.com/lego-brick-image-classification-running-on-jetson

✄----------------------------------

本文由头条号「黑胡桃实验室」敲制,欢迎非商业转载。转载请带上头条号名称及原文链接,并在文章开头明显位置注明原文地址、原文作者、译文地址和译者,以表示对作者和译者的感谢。


>黑胡桃社区学习平台

黑胡桃社的 Codelabs 学习通道,继续为每一个想要学习人工智能技术的老师、同学提供学习内容和学习用 GPU。

想要“宅家学习”的老师或同学请用电脑访问:

https://blackwalnut.tech/tfboost/introduce ,可以跟随任务管理一步步学习,也可以在平台上进行自己的开发和研究。学习过程中如果遇到障碍欢迎随时联系“黑胡桃实验室小助手”获得帮助!


分享到:


相關文章: