深度学习和计算机视觉中的对象检测

在深度学习和计算机视觉领域,技术与框架层出不穷,令人兴奋不已。构建深度学习模型和计算机视觉模型的真正乐趣在于,能够看到它们在现实世界中的应用,如面部识别和板球比赛中的球跟踪等。

最喜欢的计算机视觉和深度学习概念之一是对象检测。能够构建一个模型,通过图像告诉存在哪些对象——这是一种无价的感觉!人类在看图像时,几秒钟内就能认出感兴趣的对象。机器则不然。因此,对象检测是计算机视觉中定位图像中对象实例的问题。

好消息是,现在开发对象检测应用比以往任何时候都容易。当前的方法侧重于端到端的流程,这显著提高了性能,并帮助开发了实时用例。

在本文中,将带了解如何使用流行的TensorFlow API构建对象检测模型。如果是深度学习、计算机视觉和对象检测领域的新手,建议先浏览以下资源:

对象检测算法的逐步介绍

深度学习基础

使用深度学习的计算机视觉

目录

对象检测的世界

对象检测的通用框架

什么是API?为什么需要API?

TensorFlow对象检测API

MobileNet-SSD

如何加载模型?

Inception-SSD

Faster RCNN

常见问题解答

应该选择哪个对象检测模型?

对象检测的通用框架

通常,在构建对象检测框架时,遵循三个步骤:首先,使用深度学习模型或算法生成覆盖整个图像的大量边界框(即对象定位组件);其次,为每个边界框提取视觉特征。根据视觉特征评估它们,并确定框中是否存在以及存在哪些对象(即对象分类组件);最后,在后处理步骤中,将重叠的框合并为一个边界框(即非最大抑制)。

就这样——已经准备好了第一个对象检测框架!

什么是API?为什么需要API?

API代表应用程序编程接口。API为开发人员提供了一组通用操作,使他们不必从头开始编写代码。将API想象成餐厅的菜单,提供了一系列菜肴以及每个菜肴的描述。当指定想要的菜肴时,餐厅会完成工作并提供成品菜肴。不需要确切知道餐厅是如何准备食物的,也不需要知道。

因此,在本文中,将查看为对象检测任务开发的TensorFlowAPI。

TensorFlow对象检测API

TensorFlow对象检测API是用于创建解决对象检测问题的深度学习网络的框架。他们的框架中已经有预训练的模型,他们称之为模型动物园。这包括在COCO数据集、KITTI数据集和Open Images数据集上训练的一系列预训练模型。如果只对这些数据集中的类别感兴趣,这些模型可以用于推理。

它们还适用于在新数据集上训练时初始化模型。预训练模型中使用的各种架构在这张表中有所描述:

MobileNet-SSD

SSD架构是一个单卷积网络,它学习预测边界框位置并一次性对这些位置进行分类。因此,SSD可以端到端训练。SSD网络由基础架构(本例中为MobileNet)和几个卷积层组成:

SSD在特征图上操作以检测边界框的位置。记住——特征图的大小为Df * Df * M。对于每个特征图位置,预测k个边界框。每个边界框都附带以下信息:

4个角的边界框偏移量(cx, cy, w, h)C类概率(c1, c2, …cp)

SSD不预测框的形状,而只是预测框的位置。k个边界框每个都有一个预定的形状。这些形状在实际训练之前就设定好了。例如,在上图中,有4个框,意味着k=4。

MobileNet-SSD中的损失

有了最终的匹配框集合,可以这样计算损失:

L = 1/N (L_class + L_box)

这里,N是匹配框的总数。L_class是分类的softmax损失,而‘L_box’是表示匹配框误差的L1平滑损失。L1平滑损失是对L1损失的修改,对异常值更加健壮。如果N为0,则损失也设置为0。

MobileNet

MobileNet模型基于深度可分离卷积,这是一种分解卷积的形式。这些将标准卷积分解为深度卷积和1×1卷积,称为点卷积。

对于MobileNets,深度卷积对每个输入通道应用一个单独的过滤器。然后点卷积应用1×1卷积来组合深度卷积的输出。

标准卷积在一步中既过滤又组合输入到一组新的输出中。深度可分离卷积将此分成两个层——一个单独的过滤层和一个单独的组合层。

这种分解大大减少了计算和模型大小。

如何加载模型?

以下是在Google Colab上遵循的逐步过程,以便轻松地可视化对象检测。也可以跟随代码。

安装模型

# 确保已安装pycocotools

获取tensorflow/models或cd到仓库的父目录:

# 编译protobuf并安装object_detection包

导入所需库

# 导入对象检测模块

模型准备

加载器

加载标签映射

标签映射将索引映射到类别名称,以便当卷积网络预测5时,知道这对应于飞机:

# 为了简单起见,将在2张图像上进行测试

使用TensorFlow API的对象检测模型

加载对象检测模型:

# 检查模型的输入签名(它期望一批3色图像,类型为int8)

添加一个包装函数来调用模型并清理输出:

# 在每个测试图像上运行它并显示结果

以下是在ssd_mobilenet_v1_coco(在COCO数据集上训练的MobileNet-SSD)上测试的示例图像:

Inception-SSD

Inception-SSD模型的架构与上述MobileNet-SSD相似。不同之处在于,这里的基架构是Inception模型。要了解更多关于Inception网络的信息,请访问——

从头开始理解Inception网络。

如何加载模型?

只需在API的检测部分更改模型名称:

# 然后使用之前遵循的步骤进行预测。瞧!

Faster RCNN

最先进的对象检测网络依赖于区域提议算法来假设对象位置。像SPPnet和Fast R-CNN这样的进步减少了这些检测网络的运行时间,暴露了区域提议计算作为瓶颈。

在Faster RCNN中,将输入图像输入到卷积神经网络以生成卷积特征图。从卷积特征图中,识别出提议区域,并将它们变形为正方形。通过使用RoI(感兴趣区域层)池化层,将其重塑为固定大小,以便可以输入到全连接层。

从RoI特征向量中,使用softmax层来预测提议区域的类别,以及边界框的偏移值。要深入了解Faster RCNN,请阅读这篇精彩的文章——

Faster R-CNN算法的实际实现用于对象检测(第2部分——带Python代码)。

如何加载模型?

再次在API的检测部分更改模型名称:

# 然后使用之前遵循的相同步骤进行预测。如下是给定Faster RCNN模型的示例图像:

如所见,这比SSD-Mobilenet模型要好得多。但它有一个权衡——它比之前的模型慢得多。这些就是在为深度学习计算机视觉项目选择正确的对象检测模型时需要做出的决定。

常见问题解答

Q1. TensorFlow在对象检测中是什么?

A.TensorFlow是一个开源的机器学习框架,包括一套全面的库和算法,用于构建和训练机器学习模型。TensorFlow的对象检测API提供了预训练模型和工具,用于训练自定义的对象检测模型,允许开发人员快速构建和部署应用程序,以识别和跟踪图像和视频中的对象。

Q2. 如何使用TensorFlow训练对象检测模型?

A. 使用TensorFlow训练对象检测模型,可以采取以下步骤:

1. 收集并标记图像数据集。

2. 选择预训练模型或创建自定义模型架构。

3. 使用TensorFlow的对象检测API配置和训练模型。

4. 评估模型的性能并根据需要进行微调。

5. 将训练好的模型导出以在生产环境中部署。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485