在 RetinaNet 上使用迁移学习进行道路标志检测
+ 查看更多
我的同事 Murtaza 最近写了一篇很棒的博客,关于如何将人工智能与 Quanser 产品结合使用。其中介绍迁移学习的部分引起了我的注意。我们生活在一个人工智能技术蓬勃发展的时代。每年有超过数千篇与 AI 相关的论文发表,并且在学术和工业界我们一直致力于创建不同的机器学习算法。感谢开源社区,现在每个人都可以方便地通过从互联网下载来访问最先进的机器学习模型。通过迁移学习,人们可以重新训练这些下载的模型,使其适应自己的需求。所以在这个博客中,我想分享一些值得探索的开源链接,并展示在RetinaNet上使用迁移学习开发道路标志检测模型的结果。
在哪里可以找到?
如果你已经准备好开始使用迁移学习,那么你首先需要的是一个预先训练好的模型,其整体功能与你希望实现的功能相同;例如,进行文本分类的模型或检测图像中特定对象的模型。
Tensorflow Hub 是一个非常的资源站。你可以找到许多用户上传的pre-trained model,同时在网页上你还可以看到关于如何使用Tensorflow Hub的指导和教程。与此同时,当你完成了一个新的模型以后,你也可以将该模型上传至网上供大家使用。开源分享不仅帮助别人,也会提升自己的知名度,促进交流。
Tensorflow Hub 网站还引入了一个 API,其中包含许多函数,如绘图和标签,可以在开发过程中节省时间。
例如,查看TensorFlow对象检测API。我使用了一些工具,如label_map_util、visualization_utils和config_util来帮助我标记训练图像、可视化图像和设置模型。
请记住,涉及计算机视觉的机器学习模型通常会消耗计算机上的大量图形处理能力。如果您的显卡不够强大,则需要更长的时间来训练您的模型。此外,您加载的依赖项或包在不同模型之间会有所不同。因此,我建议您使用Google Colab,这是一个基于云的 Python 编辑器,不需要任何配置,提供对 GPU 和 TPU 的免费访问,并且易于与他人共享。
RetinaNet 上的迁移学习
我此次转移学习任务的目标是重新培训对象检测模型,该模型将检测Quanser QCar以及下图所示的道路标志。
在阅读了几篇论文并尝试了几个开源软件包之后,我确定了RetinaNet是最适合我预期应用的对象检测模型。
下面显示了RetinaNet网络架构。它由两个子网组成,一个子网用于分类,另一个子网用于预测边界框的位置。由于迁移学习的美妙之处,我决定保持网络体系结构,除此我将根据培训目标重新培训的班级子网。
在准备训练数据的时候,我使用了Object Detection API里的工具去对我ground-truth数据画了边界框。如下图所示,我将路标和QCar放在了不同的位置和大小。但是所有的路标都一定正面朝向摄像机,这样就可以确保相机只会捕捉正面看到的路标。而对于QCar来说,我尽量确保每一个角度都能涵盖得到。因为RetinaNet是一个已经训练好的模型,除了最后分类层外,其他层当中的神经元权重都以训练完毕,所以这里我只准备了20张训练数据方可达成迁移训练的目标。
关于RetinaNet的迁移学习,您只需要微调类子网和盒子网中的可训练变量。自定义训练过程是对图像进行预处理,进行预测,根据地面真实边界框计算损失,计算总损失的梯度,最后将梯度应用于需要微调的变量。下图显示了我使用的培训代码片段。请记住,在对象检测API中使用了model函数,这不是标准的TensorFlow模型,因此这里的model.predict和model.loss也将图像的形状作为输入。
对于测试数据集,我用其中一个QCAR上的RGBD摄像机录制了一段视频。然后我在不同的位置放置了标志,让两个QCAR在轨道上运行。最后,我将视频转换成数千张图像,并将它们传递到预测器中。预测器函数返回检测框、检测类和检测分数,这些都是可能的。
下面经过处理的视频显示了我训练模型的结果。该模型可以在大多数情况下检测道路标志和QCAR。一些可能的改进是当QCar在帧中移动时拍摄额外的训练图像。目前,所有训练图像都是在QCar静止时拍摄的。视频中显示的运动模糊未在训练数据集中捕获。总的来说,我对结果很满意,现在有了一个经过培训的模型来检测路标和我们的QCar!
最后的一些话
在人工智能领域中其实大家的着重点可能都不同。有些时候专注在算法本身的设计,有些在于调参,有些在于模型设计,那么对于研发工程师们,我们通常需要很多的快速验证模型。在这种情况下,迁移训练确实能帮助到我们,基于现在有那么多先进的已经训练好的模型。
该文章由我们研发工程师 Thomas Zhang
所写
分享到: