换个dataloader函数, COCO提升3mAP ,上海交大MVIG团队提出InstaBoost

简介: 近年来最新的一系列实例分割模型,例如 Mask R-CNN 等,其高准确度很大程度上依赖于大量的训练数据(COCO 数据集包含 20 余万张训练图片)。但是获取像素级别的标注是一项成本高昂且复杂精细的工作。为此,上海交通大学 MVIG 实验室(卢策吾团队)提出了 InstaBoost——一种基于 crop-paste 的实例分割数据增强方法。实验表明,在 Mask R-CNN 和 Cascade R-CNN 等框架中应用 InstaBoost,可以在 COCO 实例分割数据集上达到 2.2 mAP 的提升。同时,该方法还能够将物体检测的精度在 COCO 数据集上最高提升 4mAP。该论文已被I

目前,研究团队已将代码及训练好的模型全部开源,包括 Res50, Res101 base 的 Mask R-CNN, Cascade Mask R-CNN, SSD 等,未来还将有更多模型开源,如 yolact 等。


该方法的操作非常简单,目前已发布为 pip 包,只需 python 中加一行代码,import instaboost,换一个 dataloader 函数就可以在 COCO 实例分割数据集上实现显著的性能提升。

近年来,基于 CNN 的深度学习算法,如 Mask R-CNN 等,在实例分割任务中有了非常广泛的应用。但是出于像素级别的标注成本高,周期长,难度大等原因,这些深度学习框架的潜力因为缺少大量的训练数据而难以被充分挖掘出来。
此前我们报道过,Google 研究团队曾研究利用 bounding box 标签,运用强化学习进行数据增强,并获得了一定提升。不过,在实例分割领域,如何利用 mask 标签在 COCO 数据集上获得提升,仍是一个需要探索的问题。


然而实例分割这种像素级的分类要比目标检测难很多,对应的数据增强也要困难很多,这主要体现在它并不能随意把目标切割并移到另外的背景上,因为它们对分割结果也有很大的影响。


来自上海交通大学 MVIG 实验室的研究人员在实例分割应用中对其进行改进优化,成功的将模型的实例分割精度大幅提升,同时也能实现目标检测的提升。

微信图片_20211201204545.jpg



实例分割任务中的数据增强


早期一些方法使用 domain adaptation 等思路,将其他领域的数据作为信息来源辅助数据增强,但是这些方法没有充分利用训练集的 mask 标注信息。


近期一些研究使用基于 crop-paste 的方法在目标检测任务中取得了不错的效果。简单来说,这些方法将物体按照 mask 标注的信息从原图片中剪下来,然后粘贴到一个随机的背景图片上。但是研究者发现这种方法在分割任务中,由于实例和背景契合程度较差,在实验中表现比 baseline 要差。为了解决这一问题,一些论文提出了使用 context model 去为二者一致性打分,但是这种该方法计算成本过高,难以在实际场景中应用。


研究者在这篇论文中提出了两种递进的实例层面的数据增强算法:Random InstaBoost 和 Map-guided InstaBoost。这类算法极大地提高了检测和分割精度。

Matting 和 Inpainting


在将图片前景和背景按照标注进行分离的过程中,如果完全按照标注去切割前景,前景的边界处会呈不自然的多边形锯齿状,这与 COCO 数据标注方式有关。为了解决这一问题,研究者使用《A global sampling method for alpha matting》一文中提出的方法对前景轮廓做 matting 处理,以得到与物体轮廓契合的边界。


在前景背景分离后,背景上会存在若干个空白区域,这些区域可以使用 inpainting 算法进行填补。论文中使用了《Navier-stokes, fluid dynamics, and image and videoinpainting》文章中提出的 inpainting 算法。

微信图片_20211201204543.jpg

从左至右:原图,inpainting 处理后的背景,matting 处理后的前景。


Random InstaBoost


为了尽可能保证粘贴后前景和背景融合的契合程度,直觉上来说将前景粘贴到原位置的附近是最可靠的。Random InstaBoost 方法即是在上述先验的判断下提出的。研究者通过定义一个四元数 (tx, ty, s, r) 来映射前景在数据增强前后的变换。四个参数从左至右分别表示了水平位移,垂直位移,放缩程度和旋转角度。将这四个参数在 (0, 0, 1, 0) 附近进行独立的随机扰动,即可生成一系列符合外观一致性的增强图片。

微信图片_20211201204540.jpg


Map-guided InstaBoost


在 Random InstaBoost 方法中,前景的中心位置 (x,y) 被严格限制在了原位置 (x0,y0) 附近。为了解决这一问题,作者提出了使用外观一致性热度图(appearance consistency heatmap)来引导前景中心粘贴的位置。外观一致性热度图计算原理大致如下。


外观描述符 D(•)

image.gif

公式中,(cx, cy) 表示实例的中心坐标,Ci 表示第 i 个轮廓线,wi 表示其对应的权重,i=1 表示最内部的轮廓线。轮廓线通过将实例轮廓膨胀后取差集获得。如下图所示,内外黑色区域之前的三个不同深度区域即为果盘的三个轮廓线。在 w 的取值上,我们按照先验,规定越靠近实例影响越大,权重越大,即 w1>w2>w3。

微信图片_20211201204537.jpg


外观距离


外观距离定义为,外观描述符之间局部外观一致性的度量。由于我们已经定义了具有三个轮廓区域和相应权重关联描述符,D1=D(c1x, c1y) 和 D2=D(c2x, c2y) 之间的外观距离被定义为:

微信图片_20211201204535.jpg


其中 Ik(x, y) 表示图片 k 在 (x, y) 坐标像素点的 RGB 值,Δ可以表示任何距离公式,在实验中作者使用了欧氏距离。对于部分坐标点移出图片的情况,我们将其距离定义为无穷大。


热度图生成与引导平移


通过固定 D0 为实例的原始位置,遍历图片中其余像素点,计算背景上所有可能的 d(D, D0),并通过下列公式将其归一化:

微信图片_20211201204533.jpg


其中 M=max(d(D, D0)),m=min(d(D, D0))。通过将 h(•) 映射到背景图片上的每一个像素,即可获得一个热度图。通过热度与概率之间的映射,可以使用蒙特卡洛方法进行采样,得到高外观一致性的粘贴位置。下图为几则热度图与增强后的实例。

微信图片_20211201204530.jpg


实验结果


在实验过程中,作者使用 Mask R-CNN 和 Cascade R-CNN 两个框架在 COCO 数据集上分别进行了测试,测试结果如下图所示。结果显示,在目标检测和实例分割任务上,InstaBoost 在 mAP 标准下最高带来 4mAP 和 2.2mAP 的提升。


微信图片_20211201204528.jpg


研究人员还使用 Mask R-CNN 在 VOCSDS 数据集上进行实验,目标检测和实例分割提升分别是 4.2mAP 和 3.9mAP,仍旧十分可观。

微信图片_20211201204525.jpg


随后,研究人员从速度和鲁棒性方面将 InstaBoost 与现有方法进行对比。
从速度上来看,InstaBoost 可以作为在线算法嵌入到 dataloader 内部,在 Mask R-CNN 上对比,使用前后每轮迭代仅增加了 0.03s 的时间成本。而使用 context model 的算法,需要对特定数据集预先进行训练等操作,花费大量额外时间,并且难以作为在线算法内嵌到代码框架内。

微信图片_20211201204523.jpg


从鲁棒性的角度来看,传统的 Mask R-CNN 的框架,在训练到 24 个 Epoch 的时候,出现比较严重的过拟合现象,精度开始下降。使用 InstaBoost 之后,模型在 48 个 Epoch 之后精度仍然呈上升趋势。说明 InstaBoost 很大程度上提升了分割框架的鲁棒性。

微信图片_20211201204520.jpg


为了更直观的反应 InstaBoost 对实例分割效果的提升,这里列出部分可视化对比结果:

微信图片_20211201204517.jpg



相关文章
|
11月前
|
JavaScript 前端开发
不能直接在GEE的Map函数中使用循环结构
不能直接在GEE的Map函数中使用循环结构
150 3
|
6月前
Google Earth Engine(GEE)——从列表中少选所需要的数字不用map函数,还能如何实现?简单方法介绍
Google Earth Engine(GEE)——从列表中少选所需要的数字不用map函数,还能如何实现?简单方法介绍
42 0
|
5月前
|
Python
高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作
【6月更文挑战第20天】高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作。装饰器如`@timer`接收或返回函数,用于扩展功能,如记录执行时间。`timer`装饰器通过包裹函数并计算执行间隙展示时间消耗,如`my_function(2)`执行耗时2秒。
33 3
|
2月前
|
数据处理 Python
Pandas中的map函数应用
Pandas中的map函数应用
18 2
WK
|
2月前
|
Python
map函数
在Python中,`map()` 是一个内置的高阶函数,接受一个函数和一个或多个可迭代对象作为参数,将指定函数应用于每个元素,并返回包含应用结果的迭代器。若有多个可迭代对象,其元素会并行地传递给函数。`map()` 返回一个迭代器,需用 `list()` 转换。在Python 3中,`map()` 返回迭代器而非列表,并支持 `lambda` 表达式,适用于多种应用场景。注意,当输入的可迭代对象长度不同时,结果仅包含最短对象的长度。
WK
26 1
|
5月前
|
JavaScript 前端开发
JavaScript 数组的函数 map/forEach/reduce/filter
JavaScript 数组的函数 map/forEach/reduce/filter
|
6月前
|
Python
【Python 基础】解释map函数的工作原理
【5月更文挑战第6天】【Python 基础】解释map函数的工作原理
|
6月前
|
JavaScript 安全 前端开发
js的map函数
js的map函数
41 0
|
存储 Go 开发者
100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用
100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用
53 0
|
6月前
|
Python
Python内置函数map、split、join讲解
Python内置函数map、split、join讲解
120 0
下一篇
无影云桌面