我们的Self-Supervised Scene De-occlusion [1]很荣幸被接收为CVPR2020的oral presentation。无监督的去遮挡和场景分解这个问题从18年底就开始思考了,因为并没有之前的工作很好地定义场景去遮挡这个问题,更别说解决,更别说用无监督的方法解决,所以前期踩了不少坑。那为什么要用无监督呢?有监督当然能解决,但是太没有挑战性了(划掉),因为amodal mask(包括可见的和被遮挡的区域)的标注是很困难的,具有较大不确定性和歧义性。当首次发现自监督学习可以解决场景遮挡问题,这也是一件令人兴奋的事情。虽然中间经历了长时间的磕磕碰碰起起伏伏伏伏伏伏,但历时一年多最终在2020年的CVPR上与大家见面了。
1. 问题定义
进入正题。我们先来看看我们希望达到什么效果,如下图:
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/89a106e859_v2-60dd74c2e866b1c50210eb67494d05dd-b.jpg)
我们希望将一张真实场景图片分解为完整的物体和背景,物体间根据遮挡关系组成一个有向图。我们将场景去遮挡这个问题分解为如下步骤:
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/89a106e859_v2-103533afcd891e54030097383218a2ef-b.jpg)
- 两两邻接的物体之间的顺序恢复。有了pair-wise ordering之后,我们就可以得到一个描述场景遮挡关系的有向图,称之为遮挡关系图(occlusion graph)。
- Amodal completion。在遮挡关系图中,我们可以检索到任意一个物体被哪些物体遮挡了,这样我们就可以进行amodal completion步骤,把物体完整的mask恢复出来。
- Content completion。有了amodal mask之后,我们就知道了物体的被遮挡区域(不可见部分),那么下一步就可以想办法在不可见部分填充RGB内容,使得这个物体完整的样子被恢复出来。
我们现在有的数据包括RGB的图片,modal mask和物体类别。modal mask是指物体可见部分的mask,其实就是一般意义的instance segmentation的mask。这些其实正好构成了一个instance segmentation的数据集,例如COCO,KITTI,LVIS这些。注意这样的数据集里并没有遮挡关系和amodal mask的标注,所以用有监督学习的思路是无法解决上述问题的。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/d07d4005fd_v2-6fba1a5f96e79b00625a7d9f0bb607e1-b.jpg)
2. 自监督的部分补全机制
下面来介绍一个重要的概念,部分补全。在此之前,我们先来介绍完整补全。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/74e5fef48b_v2-54b1aa26685706eb86eae3cf066fdb56-b.jpg)
完整补全是指给定被遮挡的物体和它的遮挡物,一次性将物体完整的amodal mask补全,当然它的前提是需要有ground truth amodal mask作为监督。我们发现一次完整补全等价于一系列的部分补全。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/4780e8efb4_v2-246f7783d4ff7fdc6439902f3dc1c787-b.jpg)
这里的部分补全(partial completion)是指,给定某一个遮挡物,只补全目标物体被当前遮挡物遮挡的部分。例如给定上图中的圆形遮挡物,把M0补全为M1。然而,这些部分补全过程还是无法训练的,因为补全的中间状态例如M1和最终状态例如M2都是未知的。
接下来则是最关键的操作。如下图,我们将M0再“切一刀”,即从数据集中随机选一个物体,用它的modal mask来盖住M0,得到M-1,然后我们训练部分补全,从M-1恢复M0。这个过程是可训练的。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/4780e8efb4_v2-d593d6bde7a5e9a6054914c66e59d7de-b.jpg)
有了部分补全机制之后,为了方便后续的步骤,我们还需要引入一个正则机制,即下图case 2。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/092a8d4d27_v2-2cd16f9ff06700c07f26388cf0675d3f-b.jpg)
Case 1是之前介绍的用随机选择的surrogate object来遮挡住目标物体。用case 1来训练的部分补全会永远增加物体的面积。我们又引入了case 2,将surrogate object放在目标物体下面,然后要求在部分补全过程中保持目标物体不变。训练过程在case 1和2之间随机切换,那么网络在训练过程中需要从输入中挖掘信息来判断目标物体是否被surrogate object遮挡,只有在目标物体被遮挡的时候,它才会被部分地补全,否则就会保持不变。
3. 部分补全网络的训练
我们用一个神经网络来模拟这个部分补全过程。部分补全网络(Partial Completion Network – Mask,简称PCNet-M)的训练过程如下,其中A物体为目标物体,B为surrogate object,对于case 1和2,PCNet-M都需要恢复出A的初始modal mask。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/f66405dab1_v2-520a61ed952be70e46f2180ba105fbac-b.jpg)
4. 顺序恢复的推理过程
如下图,有了训练好的PCNet-M之后,我们设计了如下推理过程来恢复遮挡顺序。给定A1和A2两个邻接的物体,我们分别以A1为目标物体,A2为surrogate object,我们发现PCNet-M并没有增加A1的面积;反过来,我们以A2为目标物体,A1为surrogate object,我们发现A2的面积增加了。由此我们可以判断出来,A1遮挡了A2。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/f66405dab1_v2-943e0b301cd4633092f8ef24e0326b38-b.jpg)
这个策略看似简单,实际上很巧妙地利用了正则化后的部分补全机制的选择性补全的特性,获得了很好的效果。我们在COCOA和KINS两个数据集上获得了和有监督方案非常接近的结果。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/c269db0275_v2-6eb4d23c11bd151df8e35547475ea09a-b.jpg)
5. 基于遮挡顺序的Amodal Completion
如下图,有了遮挡顺序之后,我们可以构建出一个遮挡顺序图。图中的边从遮挡物指向被遮挡物,这样一来,从图中对于任意一个物体,我们可以得到它的所有祖先节点,即为它的所有遮挡物。其中一阶祖先节点为直接遮挡物,高阶祖先节点为间接遮挡物。例如下图例子中,我们可以得到,物体3有两个直接遮挡物,分别为2和4。判断出遮挡物之后,我们就可以再次利用部分补全网络(PCNet-M)来恢复出amodal mask。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/70c372d80a_v2-7cbd4a9e9b6aef8a4aaf9b062508a010-b.jpg)
我们还需要解释一下为何要选取所有祖先节点作为遮挡物,而非仅仅直接遮挡的一阶祖先节点。如下图,我们需要补全物体1。从遮挡关系图中,它的一阶祖先节点(即直接遮挡物)是2和4,高阶祖先节点(间接遮挡物)是3。我们发现,只考虑一阶遮挡物,无法完整地补全物体1被物体3间接遮挡的部分。只有考虑所有祖先节点,才可以获得正确的补全结果。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/12f6133c8d_v2-086fc1f83dd7ccfe6f1bd96798ffd1fe-b.jpg)
下面是amodal completion的结果。同样,我们在amodal completion这个子任务上也达到了和有监督方案非常接近的结果。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/12f6133c8d_v2-aa39f8cf38e7fe34529cdcd755289abe-b.jpg)
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/c992a94e23_v2-f585c3bd4f54322ce60cc463d739fa8d-b.jpg)
6. 内容补全
内容补全网络(Partial Completion Network – Content,缩写PCNet-C)的训练方式和PCNet-M类似。同样地,我们无法在训练的时候用完整内容补全的结果来监督,我们设计了如下的部分内容补全的训练策略。给定目标物体A和surrogate object B,我们用A∩B来擦除图片的RGB,作为缺失的需要填充的内容,然后用A\B来代表缺失的内容属于哪个物体。训练的目标是恢复原图。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/194825cf16_v2-3abc185b0912a0a6f1c977c2c14a2ed8-b.jpg)
测试的时候,我们有了遮挡物(occluders)和目标物体的amodal mask,取交集,就得到了需要填充内容的区域(即被遮挡的区域)。同时目标物体的modal mask也作为输入,用来表示缺失的区域属于该目标物体而非其他物体。最后PCNet-C将物体完整的样子补全了出来。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/564c281d85_v2-28c86ab03f396f8a61efa354876ebc7e-b.jpg)
(说得这么花里胡哨,这不就是image inpainting吗?
还真不太一样,我们往下看。
如下图,关键的不同之处在于,image inpainting没有modal mask这个输入,因为image inpainting并不care缺失的部分属于哪个物体,只要结果看起来合理就行。那么如果我们直接使用image inpainting,缺失的区域就会被填充为其他物体的RGB,例如下面的咖啡杯。这个结果对于image inpainting是非常合理的,但是对于物体的内容补全来说,则是不正确的。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/532bac0701_v2-eb7e98a5fbd864438781b62780c49c17-b.jpg)
当然PCNet-C的其他训练方式,包括网络结构,loss等,都跟image inpainting大同小异。所以以后image inpainting做得更好了,也能帮助提升内容补全的效果。
7. 应用1: amodal mask自动生成
给一个普通的instance segmentation dataset,例如下图中的KITTI training set,我们训练PCNet-M并且仍旧在training set上应用我们的amodal completion方法,就可以得到pseudo amodal masks。这样我们相当于在training set上免费拿到了一批amodal mask。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/532bac0701_v2-af1f97f530936b20de9fdee0c5b1e2ea-b.jpg)
我们来看看这些amodal mask质量和人工标注的amodal mask的对比。我们使用不同来源的amodal mask作为监督,用Mask R-CNN在KITTI上训练了amodal instance segmentation任务,并在人工标注的测试集上测试。我们发现我们的方法获得的amodal mask和人工标注获得了正好一样的结果。这意味着以后可能再也不需要标amodal mask了。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/3bce46c6b6_v2-a660e66a3df3a678391a39f01406218c-b.jpg)
8. 应用2: 场景编辑和重组
既然我们现在能将场景分解开,那么就可以对场景进行编辑和重组。如下图,其中的baseline modal-based manipulation是基于普通的image inpainting做的,只有modal mask,没有ordering和amodal mask。我们的方法基于ordering和amodal mask,能做更加自然的场景编辑。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/6b8dfd0477_v2-afe76303f07e1b9626cdefac52a7938b-b.jpg)
我们也做了一个图片编辑的GUI,demo如下(完整高清demo见文末链接):
场景编辑和重组https://www.zhihu.com/video/1232757208338493440
9. 其他潜在应用
- Instance segmentation的data augmentation。还记得去年有一篇很棒的工作(InstaBoost [2], ICCV2019),通过移动物体来做data augmentation,但是不能解决移动物体过程中的遮挡问题。现在配合scene de-occlusion,也许可以做得更好。
- 帮助panoptic segmentation后处理中的mask fusion步骤。
- 应用到增强现实(AR)中。例如下图,对真实场景做de-occlusion之后,就可以将虚拟的物体放在真实物体的后面。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/44d08be891_v2-90fa5692e5c4cc0b686a4398b92076d5-b.jpg)
10. 讨论
- 可以解决两个物体互相遮挡吗?不能。因为如下图中的互相遮挡的情况中,无法定义ordering graph。ordering graph是object level的,而互相遮挡则需要boundary-level de-occlusion。也相当于留下了一个open question供大家思考。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/d69d2cf42d_v2-acf294bd7ef0363eeeb729188ebb70ff-b.jpg)
2. 可以解决多个物体循环遮挡吗?可以。因为我们的方法是按照pairwise来恢复顺序的,所以循环遮挡不会有问题。如下图(因为循环遮挡例子比较少见,我自己用剪刀剪了几张纸片来摆了这么一张图,然后跑了一下测试),预测出来的ordering graph也是一个环。
![](http://www.shanxinwen.com/wp-content/plugins/wp-o-matic/cache/f840fd3532_v2-f8aac420de003b5fd338620a86f832fe-b.jpg)
各种链接:
论文:
Self-Supervised Scene De-occlusion
代码:
https://github.com/XiaohangZhan/deocclusion
Demo视频(YouTube):
https://www.youtube.com/watch?v=xIHCyyaB5gU
Demo视频(B站):
[CVPR2020 oral] Self-Supervised Scene De-occlusion_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
Reference:
[1] Xiaohang Zhan, Xingang Pan, Bo Dai, Ziwei Liu, Dahua Lin, and Chen Change Loy. Self-Supervised Scene De-occlusion. In CVPR 2020.
[2] Hao-Shu Fang, Jianhua Sun, Runzhong Wang, Minghao Gou, Yong-Lu Li, and Cewu Lu. Instaboost: Boosting instance segmentation via probability map guided copy-pasting. In ICCV 2019.
来源:知乎 www.zhihu.com
【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载