玩了十几年 3D 扫描,老问题一直没解决:透明、反光的东西,扫不出来,机器人看不见

打开网易新闻 查看精彩图片

前段时间新到了一台新的 3D 扫描设备 Revopoint MetroY,想看看新设备能不能好点,试了几样东西,emmmmm....还是那个样

打开网易新闻 查看精彩图片

比如我这个对讲机,透明玻璃罩,扫出来只剩后面的屏幕,罩子本身消失了

打开网易新闻 查看精彩图片
Hytera 对讲机,你值得拥有
打开网易新闻 查看精彩图片
玻璃罩子,你拥有不了一点

如果显示器会反光,那就直接空白了

打开网易新闻 查看精彩图片
比如这个小玩意儿
打开网易新闻 查看精彩图片
你就获得了这个
打开网易新闻 查看精彩图片
Mesh 一下更清晰:屏幕整块都丢了

玻璃瓶稍微好一点,但也缺了不少

打开网易新闻 查看精彩图片
Cocia 巧克力奶,山姆有售
打开网易新闻 查看精彩图片
看角度,有时候能捡回来一点

Revopoint MetroY 这玩意儿还不便宜,但该有的问题,是个个都在,反正也不知道啥时候能解决

也是在前段时间找方案的时候,和蚂蚁那边聊到他们在做一个东西,叫 LingBot-Depth,大致上能解决这些问题,方法就是:AI 补全

思路有点反直觉:把「测不准」的地方当作训练材料,让 AI 能够理解这些看不清的东西(思路很类似 Bert,这个后面讲)

在用了这个模型之后,机器人能稳定抓起透明玻璃杯、反光不锈钢杯

 左边原始深度图,透明物体大片缺失;右边补全后,机器人能抓了
打开网易新闻 查看精彩图片
左边原始深度图,透明物体大片缺失;右边补全后,机器人能抓了

而这个东西,今天也正式开源了,这里来说道说道

 https://github.com/robbyant/lingbot-depth?tab=readme-ov-file 老问题了
打开网易新闻 查看精彩图片
https://github.com/robbyant/lingbot-depth?tab=readme-ov-file 老问题了

说回前文,最早开始玩 3D,还得追溯到 14 年的时候, Google 发布 Project Tango,这是一个空间感知平台,手机或平板上集成了深度传感器、摄像头、IMU

 Project Tango
打开网易新闻 查看精彩图片
Project Tango

当时,第一时间搞了一台开发机,当时觉得这玩意要改变世界,结果扫自己家客厅,落地窗的位置是一个长方形的虚空

后来呢...Google 2017 年底宣布停止支持,2018 年 3 月正式关闭

我怀疑他们自己也扫不明白办公室的玻璃幕墙

如果强行算的话,我最早用上的3D 设备是 Kinect。不过我当时只是弄来玩舞力全开啥的,还没想到可以来开发

再往后,看到有些开发者朋友,拿它做一些交互应用,但碰到透明、反光、吸光的材质,深度图上直接出洞,而窗户经常是个窟窿

 Kinect
打开网易新闻 查看精彩图片
Kinect

以前的 Xbox 还有 Kinect,现在咋就没了

RealSense 用的是红外结构光,透明物体同样会造成深度缺失。比如拍桌面,透明塑料盒大面积丢数据

iPhone 的 LiDAR 好一点,但镜面和类镜面表面还是个坎

打开网易新闻 查看精彩图片

https://developer.apple.com/documentation/avfoundation/capturing-depth-using-the-lidar-camera

它的原理是往外发激光脉冲,测光往返的时间来算距离
但镜面和类镜面表面还是个坎

光打上去,直接被弹到别的方向去了,很少能散射回接收器

扫描 App 的教程都会写:尽量避开镜子和高反光表面

比如我现在在厨房,用水龙头往锅里倒水,会发现水的部分被完全忽视了

 软件是 Record3D:其实锅里,有半锅水了
打开网易新闻 查看精彩图片
软件是 Record3D:其实锅里,有半锅水了

再比如,如果去拍摄鱼缸,会发现玻璃缸的位置全是空洞,鱼倒是有几条,飘在虚空里

等等...是不是能拿这玩意儿去钓鱼...这个真没去试...钓鱼佬狂喜

然后,换了不知道多少设备,反正透明、反光的东西,特别容易出问题

为什么会这样

市面上的深度相机,测距原理大概有这么几种

ToF(飞行时间)

就是发一束光出去,测它飞回来用了多久,算出距离,然后算出来它的 3D 结构,苹果各种设备的 LiDAR(激光雷达)就是这个原理

结构光

投射一个已知的图案(比如点阵)到物体上,看图案怎么变形,反推深度,早期的 Kinect、Face ID 用的都是这个

双目

靠左右两个摄像头拍到的画面做匹配,通过视差算距离,有的纯靠物体表面本身的纹理,比如 ZED 系列

有的会主动往外打红外纹理来增加匹配点,比如 RealSense D 系列、Orbbec Gemini

 深度感知的几种方式 共同的弱点
打开网易新闻 查看精彩图片
深度感知的几种方式 共同的弱点

当知道了原理,就很自然的能明白为啥镜面、透明的物品,测 3D 总是崩:

  • • 透明的东西,光穿过去了,反射信号弱或者跑偏

  • • 镜面的东西,光弹到别处去了

  • • 纯色无纹理的表面,双目匹配找不到对应点

打开网易新闻 查看精彩图片

结果呢...就是深度图上出现缺失、噪声、错误的深度值,有时候是一片黑,有时候是乱跳的数据

对人来说无所谓,眼睛看一眼就知道那是玻璃杯,但机器人就不行了,需要精确的三维坐标,不然干不了一点活

一个思路:用「测不准」当训练素材

以前的做法,就是绕开这个问题
用更贵的传感器多传感器融合、或者干脆限制使用场景

但 AI 时代了,总是可以有点新的思路:既然这些「测不准」的区域是真实存在的,为什么不拿来当学习材料?

这个方法叫 Masked Depth Modeling,简称 MDM

大家都是经历过九年义务教育的优秀人才,熟悉古诗词鉴赏套路和英语完形填空的解题方法

当你在试卷里看到:「衬衣的价格是___
根据脑补,你就会知道要填「九磅十五便士

深度图也一样,根据周围的深度值和彩色图的内容,可以推断空的地方大概是多远

 MDM训练示意MDM 训练流程:把缺失的深度当作「填空题」
打开网易新闻 查看精彩图片
MDM训练示意MDM 训练流程:把缺失的深度当作「填空题」

BERT 的训练方式就是这样,随机挡住一些词,让模型猜
相当于老师出卷子,随便挑几个空让学生填

MDM 也是填空题,但出题方式不一样

  • • 深度相机测不准的地方,必考

  • • 测得不太稳的地方,大概率考

如果这些还凑不够一张卷子,再从测得准的地方随机挑一些
最后一张卷子大概有 60% 到 90% 是空

这样训练出来的模型,既会做难题,也会做简单题
深度相机哪里容易测不准,它就重点练哪里

搞点数据

做深度学习,数据是关键
(当然,做啥数据都是关键)

深度数据比普通图片难搞得多,需要专门的相机采集

现有的公开数据集还有个问题
大多是精心挑选的「好」数据,深度图很完整,没什么缺失

MDM 需要的,偏偏是带着缺失的数据
越多真实的「烂数据」,对它越有用

打开网易新闻 查看精彩图片

于是,蚂蚁联合奥比中光采集了一批真实数据,然后也制作了很多高质量合成数据

真实数据:210 万张

用 3D 打印做了一个采集支架,能挂不同型号的深度相机

包括主动双目的(RealSense、Orbbec)和被动双目的(ZED)

 采集设备长这样,一个支架挂多个相机,很朴实
打开网易新闻 查看精彩图片
采集设备长这样,一个支架挂多个相机,很朴实

蚂蚁的这次数据采集和效果验证,是和奥比中光合作的,这是国内做 3D 视觉的头部公司,很多人手上的深度相机可能就是他们的 Gemini 330 系列

打开网易新闻 查看精彩图片

为了收集这些数据,他们派人跑了住宅、办公室、商场、健身房、博物馆、停车场、医院、机场候机厅,总共二十多种场景

合成数据:100 万张

在 Blender 里用 3D 模型渲染,关键是要模拟「不完美」
你没看错,这里主动制造不完美,去复现真实相机的失效模式

这里的做法,就是渲染的时候故意用传统的立体匹配算法去算深度

加上 700 万的公开数据集,总共 1000 万张用于训练

最终的结果,就是....成功让 AI 学会了识别这些透明、反光物体

打开网易新闻 查看精彩图片

效果怎么样

下面这些内容,都来自技术报告

 https://github.com/Robbyant/lingbot-depth/blob/main/tech-report.pdf 深度补全
打开网易新闻 查看精彩图片
https://github.com/Robbyant/lingbot-depth/blob/main/tech-report.pdf 深度补全

在几个标准数据集上测,按难度分了四档:
从简单的随机遮挡,到极端的大面积缺失

LingBot-Depth 在所有档位上都是最好的
室内数据集上,「极端」档位的误差比第二名低 40% 以上

 效果对比 输入、真值、其他方法、LingBot-Depth 视频深度
打开网易新闻 查看精彩图片
效果对比 输入、真值、其他方法、LingBot-Depth 视频深度

只用图片训练,没有用视频,但模型在视频上表现出了时序一致性

拿着相机在玻璃大堂、健身房、水族馆隧道这些场景里走

原始深度图大片缺失,补全后的深度图则填上了空洞,帧与帧之间还很连贯

打开网易新闻 查看精彩图片

机器人抓取

这是最实际的应用

测试物体:不锈钢杯、透明玻璃杯、透明收纳盒、玩具车

物体

原始深度

补全后

不锈钢杯

13/20

17/20

透明玻璃杯

12/20

16/20

玩具车

9/20

16/20

透明收纳盒

抓不了

10/20

这里得说一下,透明收纳盒用原始深度完全抓不了,因为深度图上它大面积缺失

用 LingBot-Depth 补全后,成功率 50%;
50% 听起来不高,但之前是 0%
从「完全不行」到「一半能成」,质变

 左边原始深度(透明物体大片缺失),右边补全后的深度 最后
打开网易新闻 查看精彩图片
左边原始深度(透明物体大片缺失),右边补全后的深度 最后

本项目的代码、模型权重现已全部开源,而训练数据也将于近期开源x

  • • 代码:

  • https://github.com/robbyant/lingbot-depth

  • • 权重:

  • https://huggingface.co/robbyant/lingbot-depth

做具身和视觉的团队,可以直接拿来用,很利好具身了

另外:奥比中光也将基于 LingBot-Depth 推出新一代深度相机