玩了十几年 3D 扫描,老问题一直没解决:透明、反光的东西,扫不出来,机器人看不见
前段时间新到了一台新的 3D 扫描设备 Revopoint MetroY,想看看新设备能不能好点,试了几样东西,emmmmm....还是那个样
比如我这个对讲机,透明玻璃罩,扫出来只剩后面的屏幕,罩子本身消失了
如果显示器会反光,那就直接空白了
玻璃瓶稍微好一点,但也缺了不少
Revopoint MetroY 这玩意儿还不便宜,但该有的问题,是个个都在,反正也不知道啥时候能解决
也是在前段时间找方案的时候,和蚂蚁那边聊到他们在做一个东西,叫 LingBot-Depth,大致上能解决这些问题,方法就是:AI 补全
思路有点反直觉:把「测不准」的地方当作训练材料,让 AI 能够理解这些看不清的东西(思路很类似 Bert,这个后面讲)
在用了这个模型之后,机器人能稳定抓起透明玻璃杯、反光不锈钢杯
而这个东西,今天也正式开源了,这里来说道说道
说回前文,最早开始玩 3D,还得追溯到 14 年的时候, Google 发布 Project Tango,这是一个空间感知平台,手机或平板上集成了深度传感器、摄像头、IMU
当时,第一时间搞了一台开发机,当时觉得这玩意要改变世界,结果扫自己家客厅,落地窗的位置是一个长方形的虚空
后来呢...Google 2017 年底宣布停止支持,2018 年 3 月正式关闭
我怀疑他们自己也扫不明白办公室的玻璃幕墙
如果强行算的话,我最早用上的3D 设备是 Kinect。不过我当时只是弄来玩舞力全开啥的,还没想到可以来开发
再往后,看到有些开发者朋友,拿它做一些交互应用,但碰到透明、反光、吸光的材质,深度图上直接出洞,而窗户经常是个窟窿
以前的 Xbox 还有 Kinect,现在咋就没了
RealSense 用的是红外结构光,透明物体同样会造成深度缺失。比如拍桌面,透明塑料盒大面积丢数据
iPhone 的 LiDAR 好一点,但镜面和类镜面表面还是个坎
https://developer.apple.com/documentation/avfoundation/capturing-depth-using-the-lidar-camera
它的原理是往外发激光脉冲,测光往返的时间来算距离
但镜面和类镜面表面还是个坎
光打上去,直接被弹到别的方向去了,很少能散射回接收器
扫描 App 的教程都会写:尽量避开镜子和高反光表面
比如我现在在厨房,用水龙头往锅里倒水,会发现水的部分被完全忽视了
再比如,如果去拍摄鱼缸,会发现玻璃缸的位置全是空洞,鱼倒是有几条,飘在虚空里
等等...是不是能拿这玩意儿去钓鱼...这个真没去试...钓鱼佬狂喜
然后,换了不知道多少设备,反正透明、反光的东西,特别容易出问题
为什么会这样
市面上的深度相机,测距原理大概有这么几种
ToF(飞行时间)
就是发一束光出去,测它飞回来用了多久,算出距离,然后算出来它的 3D 结构,苹果各种设备的 LiDAR(激光雷达)就是这个原理
结构光
投射一个已知的图案(比如点阵)到物体上,看图案怎么变形,反推深度,早期的 Kinect、Face ID 用的都是这个
双目
靠左右两个摄像头拍到的画面做匹配,通过视差算距离,有的纯靠物体表面本身的纹理,比如 ZED 系列
有的会主动往外打红外纹理来增加匹配点,比如 RealSense D 系列、Orbbec Gemini
当知道了原理,就很自然的能明白为啥镜面、透明的物品,测 3D 总是崩:
• 透明的东西,光穿过去了,反射信号弱或者跑偏
• 镜面的东西,光弹到别处去了
• 纯色无纹理的表面,双目匹配找不到对应点
结果呢...就是深度图上出现缺失、噪声、错误的深度值,有时候是一片黑,有时候是乱跳的数据
对人来说无所谓,眼睛看一眼就知道那是玻璃杯,但机器人就不行了,需要精确的三维坐标,不然干不了一点活
一个思路:用「测不准」当训练素材
以前的做法,就是绕开这个问题
用更贵的传感器、多传感器融合、或者干脆限制使用场景
但 AI 时代了,总是可以有点新的思路:既然这些「测不准」的区域是真实存在的,为什么不拿来当学习材料?
这个方法叫 Masked Depth Modeling,简称 MDM
大家都是经历过九年义务教育的优秀人才,熟悉古诗词鉴赏套路和英语完形填空的解题方法
当你在试卷里看到:「衬衣的价格是___」
根据脑补,你就会知道要填「九磅十五便士」
深度图也一样,根据周围的深度值和彩色图的内容,可以推断空的地方大概是多远
BERT 的训练方式就是这样,随机挡住一些词,让模型猜
相当于老师出卷子,随便挑几个空让学生填
MDM 也是填空题,但出题方式不一样
• 深度相机测不准的地方,必考
• 测得不太稳的地方,大概率考
如果这些还凑不够一张卷子,再从测得准的地方随机挑一些
最后一张卷子大概有 60% 到 90% 是空
这样训练出来的模型,既会做难题,也会做简单题
深度相机哪里容易测不准,它就重点练哪里
搞点数据
做深度学习,数据是关键
(当然,做啥数据都是关键)
深度数据比普通图片难搞得多,需要专门的相机采集
现有的公开数据集还有个问题
大多是精心挑选的「好」数据,深度图很完整,没什么缺失
MDM 需要的,偏偏是带着缺失的数据
越多真实的「烂数据」,对它越有用
于是,蚂蚁联合奥比中光采集了一批真实数据,然后也制作了很多高质量合成数据
真实数据:210 万张
用 3D 打印做了一个采集支架,能挂不同型号的深度相机
包括主动双目的(RealSense、Orbbec)和被动双目的(ZED)
蚂蚁的这次数据采集和效果验证,是和奥比中光合作的,这是国内做 3D 视觉的头部公司,很多人手上的深度相机可能就是他们的 Gemini 330 系列
为了收集这些数据,他们派人跑了住宅、办公室、商场、健身房、博物馆、停车场、医院、机场候机厅,总共二十多种场景
合成数据:100 万张
在 Blender 里用 3D 模型渲染,关键是要模拟「不完美」
你没看错,这里主动制造不完美,去复现真实相机的失效模式
这里的做法,就是渲染的时候故意用传统的立体匹配算法去算深度
加上 700 万的公开数据集,总共 1000 万张用于训练
最终的结果,就是....成功让 AI 学会了识别这些透明、反光物体
效果怎么样
下面这些内容,都来自技术报告
在几个标准数据集上测,按难度分了四档:
从简单的随机遮挡,到极端的大面积缺失
LingBot-Depth 在所有档位上都是最好的
室内数据集上,「极端」档位的误差比第二名低 40% 以上
只用图片训练,没有用视频,但模型在视频上表现出了时序一致性
拿着相机在玻璃大堂、健身房、水族馆隧道这些场景里走
原始深度图大片缺失,补全后的深度图则填上了空洞,帧与帧之间还很连贯
机器人抓取
这是最实际的应用
测试物体:不锈钢杯、透明玻璃杯、透明收纳盒、玩具车
物体
原始深度
补全后
不锈钢杯
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 推出新一代深度相机
热门跟贴