网格合并之后物体的位置改变了_物体检测的过去、现在和未来

c30bf003e0cf31186db91272335d623b.png

本报告分为4个部分,物体检测的简介、物体检测的过去、现在以及未来,每个部分都从学术和工业两种角度进行分析介绍。

上图简单描述了物体检测的发展历程时间轴。2012年深度学习热潮兴起,接着2013年有学者将深度学习应用到检测领域,开启了传统方法向深度学习的过渡转变。我将2019年之前的发展视为物体检测的过去,2019年至2020年看作检测的现在,2020年以后属于检测的未来。

2013年之前检测方法大多以传统方法为主,特征提取加分类器是那些年检测的重心所在,2013年至2016年是检测的飞速发展阶段,多种神经网络结构的问世大大改变了检测算法的格局。

2020年开始,新方向的引出,使得深度学习研究者燃起了新的希望,那么,在未来多少年内可以真正解决检测问题(How far from solving)呢,是当下众多学者所关心的问题。从工业界领域来看,算法的实用性仍有不足,比如自动驾驶中检测的结果存在不稳定的抖动,遮挡严重的场景下检测效果不佳等。

01 物体检测的简介

视觉识别(Visual Recognition)是计算机视觉领域最核心的一环,物体检测(Object Detection)是其中一个子类。从视觉识别的角度来说,有很多种不同的表现形式,最简单的方式是bounding-box,这就是本报告所讲的检测任务,还有point的形式(即分割任务)以及key-point形式(即关键点检测任务)。

物体检测算法的评估标准常用AP(Average Precision)作为评价指标,AP会定义precision和recall两个指标。Precision是指检测结果的正确率,recall是指检测的召回率。

每个检测算法都可调整输出与groud truth之间匹配的IoU阈值,减小阈值,可以得到更高的recall,但同时precision也会有所下降,以recall为横轴,precision为纵轴可以画出一条曲线,AP就相当于对这条曲线求积分。

2014年,COCO数据集引入后,在原来的基础上提出新的评价标准mmAP,这个评价标准是先对所有类别的AP取平均得到mAP,然后再求0.5~0.95不同IoU阈值(step为0.05)下的mAP的均值得到最终mmAP。

fe893bac2600a4e3fee650349139675e.png

02 物体检测的过去

在深度学习之前,传统方法主要分为特征提取和分类器设计两个阶段。具体操作为用滑动窗(sliding window)遍历整张图像,并对窗内的图像提取特征,再进行分类器检测。

然而,滑动窗算法会有两大瓶颈:

(1)由于要对每一个滑动窗口进行计算,整体计算量很大;

(2)求解每个滑动窗时,可能会造成context信息(上下文信息或者全局信息)丢失。

特征提取阶段常用的方法有Haar、HOG、LBP、ACF等算子,常用的分类器有SVM、Boosting、Random Forest等。

传统方法的特征和分类器之间的关联较为微弱,但在深度学习中二者之间的联系更为紧密。一个卷积神经网络本身就具备特征提取能力,同时也具备分类的能力,因此深度学习很好的将特征和分类器整合在一起发挥更大的价值。

传统方法的特征是人工设计的,并且层次较浅,而深度学习网络的特征相对就更深一些,因此相对深度学习方法,传统方法的特征表达能力较为受限。但是,传统方法的一个好处在于层次简单因而方便调试(算法的可解释性较好)。

以下图的行人检测为例,从图像提取HOG特征,再把位置点乘上去,就可以得到很像人形的图片,可解释并且方便研究人员调试。

fe2e7b8e3a5a70ac95cff2cbd2e13173.png

总结来看,深度学习之前的传统检测方法优缺点如下:

优点

1. 在CPU上较为有效;

2. 易于调试,可解释性强;

3. 适用于数据量较少的情况。

缺点

1. 在大数据集上的表现性能较为局限;

2. 难以利用GPU来进行并行加速。

2013年-2014年是基于深度学习的物体检测飞速发展的阶段,主要分成两类:一种是one stage,代表作有Densebox、YOLO、SSD以及RetinaNet等,另一种是two stage,代表作有RCNN系列、RFCN、FPN、MaskRCNN等。

One Stage和Two Stage的不同是,One Stage是给定一张图,直接分类回归,Two Stage是给定一张图,先提出一系列proposal(非背景区域),然后再在proposal上进行分类回归(对非背景区域进行更细化的检测)。

21f375ac61e2ba7dafcc9c0bd58d947d.png

One Stage(单阶段法)

以Densebox算法为例,它的pipeline较为简单,图像经过CNN网络,在最后的feature map上的每个点直接生成一个框,然后进行回归。该方法在目标框有重叠(物体遮挡严重)时,不能正确的区分重叠的ground truth的归属性(算法中不容易进行assign)。

6aeb1db26100f7b3f14fa52aa8816ea1.png

DenseBox的问题在于L2损失对尺度的鲁棒性不佳(UnitBox对此进行改进)、ground truth分配问题(SSD对此进行改进)、定位精度不佳(后续引入Two Stage方法进行优化)、误检测情况较为常见(后续引入Two Stage方法进行优化)。

YOLO算法的输入是一张图片,然后对图片进行网格化的分割,在每个网格中生成一个类别和两个目标框,然后将框的分类和回归统一到一个loss进行学习。Yolo后来又提出v2,v3,v4版本(甚至还出现有些争议的v5版本)。

SSD检测算法也是经典检测算法之一,引入了Anchor概念,在每个点上设置9个anchor,回归时基于每个anchor分别进行回归,并将位置坐标回归问题转化为框的offset回归问题。不仅如此,SSD还在多个不同深度的feature map层次上进行anchor的分类回归,因为较浅的feature map上的anchor更容易关注小物体。

然而,较浅的feature map的语义信息较少,这点在后续的DSSD、RON、RetinaNet中进行了改进,比如在工业界常用的RetinaNet虽然也是多层次特征,但是相比SSD,采用了先下采样再上采样的方法,语义信息也得到了保证。

对one stage方法的总结, one stage方法主要关注三点:

1.anchor的设计;

2.feature信息流的设计(多层次特征融合);

3.loss的设计以及sample(随机采样或者难例挖掘等)的设计。

Two Stage(多阶段法)

Two stage精度高但是整体算法很复杂计算量大,因此该类的方法主要是在加速方面进行改进。RCNN算法在当时的检测领域是开创性的工作,当然也存在很多问题,如速度极慢以及没有端到端的优化。之后便相继提出了fast rcnn和faster rcnn,以softmax代替svm分类器,以RPN神经网络代替原始proposal生成网络。

之后,RFCN网络继续对速度进行优化,通过复用计算实现减小计算量的目的。在RFCN之后提出了Deformable Convolutional Networks,在网格上增添了一个可调整大小的offset,可以根据目的自适应的调整感受野,从而使得卷积的信息更为充分。

在Two Stage中还存在一个经典工作——FPN,现在FPN已经是一种非常常用的网络设计方式。后来提出的MaskRCNN,解决了ROIPooling的对齐问题并实现了多任务学习的目标(分类、检测、分割)。

总结来说,two stage方法主要关注两点:速度和性能。

2017年之后物体检测任务越走越难,陷入一个小低谷,已有的解决方法都较为成熟了,但实用性仍然不足。物体检测器的pipeline如下图所示,我们从这个框架的每个细节进行分析介绍。

3955a736e729b63facb4c2e65b003e04.png

Backbone 在早期的论文中,基本所有的backbone都是基于分类任务设计的,分类任务相比检测任务对特征的分辨率要求不高,其好处在于感受域很大,但空间上的损失也会很多,这对检测很不友好。

如果为了得到更多stage的高分辨率的feature,可以在网络添加额外的层(DetNet算法,如下图的最后两个16x层),但是这又会出现这些新层的随机初始化的问题。

c5b635ed3826f624a5bfaa53ae85e086.png

Head 如何设计一个更好更快的head进行检测。Light head RCNN从head通道上入手,通过减少channel数来提升速度,当然之后还有ThunderNet的继续改进等。

Pretraining 在分类任务上的预训练迁移到检测上会有很多问题,因此引入专门针对检测而设计的数据集——Objects365,该数据集量级为69万张图,V2版本有大约200万张图,每个检测框都会完整地进行标注,这对训练目标检测网络来说较为友好。同时,如果在检测任务上预训练再迁移到检测,还可以把head预训练,这也是通过预训练来提高性能的重要的点。

Scale 以人脸检测为例,人脸的尺度变化非常大。在之前的工作中,我们可以通过像SSD、FPN那种,采用多层feature来融合预测或者直接在图像预处理上进行缩放到不同尺度来训练。SFace算法是对于处理人脸检测任务中尺度变化较为有效的方法,其将anchor-based和anchor-free两种方法结合,前者可以对一些标准尺寸的人脸表现良好,后者可以对一些非标准的人脸进行自适应。

Batchsize 早期的工作如R-CNN、Faster RCNN、RetinaNet、Mask RCNN等都会将batchsize设定的很小,但这也会引出很多问题,比如小batchsize会导致训练时间增加、统计不准确、正负样本不均衡等。于是2018年,有人提出了MegDet算法解决了batchsize较小的问题。

Crowd 以密集场景的行人检测为例,遮挡问题非常严重,如何采用更好的策略解决遮挡下的检测问题也是目标检测领域很有意思的话题。

03 检测的现在

现在的物体检测方向可以从3个角度描述:

(1) upper bound,即更高的性能;

(2) few shot,即更少的数据集;

(3)more category,即更多的检测种类。

对于upper bound,课中主要介绍了MegDetV2和EfficientDet两篇工作,前者融合检测和分割任务,后者是用NAS搜索网络。

对于few shot,有些类别物体天生数据量少,因此希望用较少的数据量(小样本)得到较好的检测性能。Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector这篇论文提出了一个通用的小样本目标检测模型,不需要重新训练或者fine-tuning就能识别新种类的目标。这类领域有很多相关工作可以参考。

对于more category,如何在更多的种类信息下还能保持高的性能以及甚至让多种类信息反哺检测,也是研究的热点方向。

04 检测的未来

要真正解决物体检测问题,还要多远?虽然在物体检测方面我们已经做了很多研究工作,但实际上还有很长一段路要走。

在未来的研究中,我们希望mmAP能达到90以上的精度,FP(false positive)也能得到较好的处理。如何对大尺度的数据集进行处理,如何进行半监督训练和自监督训练,如何更好对上下文信息进行理解,如何设计新的pipeline都是值得研究的问题。

### 回答1: 要在Blender中使用Python将所有物体合并在一起,可以使用以下代码: ```python import bpy # 获取场景中所有的物体 objects = bpy.context.scene.objects # 选中所有的物体 for obj in objects: obj.select_set(True) # 合并选中的物体 bpy.ops.object.join() ``` 这段代码将获取场景中的所有物体,选中它们,并使用 `bpy.ops.object.join()` 合并它们在一起。请注意,合并后的物体将命名为第一个选定的物体的名称。 ### 回答2: 在Blender中使用Python合并所有物体,可以按照以下步骤编写代码: ```python import bpy # 选择所有物体 bpy.ops.object.select_all(action='SELECT') # 合并所有选中的物体 bpy.ops.object.join() # 创建一个新对象,并将合并后的物体分配给它 bpy.ops.object.mode_set(mode='OBJECT') bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS', center='BOUNDS') # 更改新对象的名称(可选) new_object = bpy.context.active_object new_object.name = "merged_object" # 将新对象设置为选中状态(可选) new_object.select_set(True) ``` 首先,我们导入`bpy`模块以及Python中常用的Blender API函数和操作。 然后,使用`bpy.ops.object.select_all(action='SELECT')`选择场景中的所有物体。 接下来,使用`bpy.ops.object.join()`合并所有选中的物体。 然后,切换回对象模式,使用`bpy.ops.object.mode_set(mode='OBJECT')`。 使用`bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS', center='BOUNDS')`将新对象的原点设置为质心(可选)。 根据需要,您可以使用`new_object.name = "merged_object"`更改新对象的名称。 最后,如果需要将新对象设置为选中状态,您可以使用`new_object.select_set(True)`。 请注意,这只是使用Blender Python合并所有物体的基本示例。具体代码可能需要根据场景的特定需求进行调整。 希望对您有所帮助! ### 回答3: 要在Blender中使用Python将所有物体合并在一起,可以使用以下代码: import bpy # 选择所有物体 bpy.ops.object.select_all(action='DESELECT') bpy.ops.object.select_by_type(type='MESH') # 合并物体 bpy.ops.object.join() 以上代码中,我们首先导入了bpy模块,这是Blender的Python API模块,用于访问和操作Blender中的对象和功能。 然后,我们使用bpy.ops.object.select_all()函数和action='DESELECT'参数取消选择所有物体,以确保我们从一个干净的状态开始合并的操作。 接下来,我们使用bpy.ops.object.select_by_type()函数和type='MESH'参数选择所有类型为MESH的物体。这将确保我们只选择了网格类型的物体,而不包括其他类型的物体,如灯光或摄像机。 最后,我们使用bpy.ops.object.join()函数将选定的所有物体合并为一个单一的物体。 可以将以上代码保存为.py文件,然后在Blender中的Python控制台或脚本编辑器中运行。在执行时,选定的所有物体将被合并为一个物体。 请注意,这个脚本将合并所有网格类型的物体,如果需要合并其他类型的物体,可以根据需要进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值