单目视觉深度估计测距的前生今世
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
计算机视觉(CV)|机器学习|深度学习|图像处理
编者荐语
最近通过深度学习直接从单目摄像头的图像预测/估计深度图的方法成为一个应用的热点,惹来不少争议。
转载自丨黄浴@知乎
链接丨https://zhuanlan.zhihu.com/p/56263560
深度学习直接通过大数据的训练得到/调整一个深度NN模型的参数,在当今计算能力日新月异的平台(GPU/FPGA/ASIC/Muli-core)上实现了计算机视觉/语音识别/自然语言处理(NLP)等领域一些应用的突破。但是专家们还是对今后深度学习的发展有些期待和展望,比如
-
非监督学习方法的引入减轻大数据标注的负担,比如GAN; -
NN模型的压缩和精简以普及深度学习在移动终端甚至物联网终端的广泛应用; -
还有深度学习能够更多的引入人类知识和简单可靠的推理,以减少“暴力“学习的误差和错误,比如贝叶斯理论,知识图谱,逻辑推理,符号学习,多任务联合训练和迁移学习等等。
这里从单目深度估计在计算机视觉中的发展历程,特别是最近在采用深度学习NN模型的实验中,总结一下如何通过深度学习求解传统视觉问题,并从中发现可借鉴的地方。
深度估计问题在计算机视觉领域属于3-D重建的一部分,即Shape from X。这个X包括stereo, multiple view stereo, silhouette, motion (SfM, SLAM), focusing, hazing, shading, occlusion, texture, vanishing points, ...前面5个都是多图像的输入,从空间几何,时域变换和焦距变化的关系推导深度距离。剩下的都是单目的输入。
如果把图像模糊度建模,下图是图像边缘模糊的响应模型,那么单目图像也能估算深度,即shape from defocusing。
另外一个现象是大气散射 (Atmosphere scattering ) 造成的霾 (haze)提供了深度信息,即depth from haze,一般有天空被拍摄下来的图像,通过散射模型能够推断像素深度。这里给出的是图像亮度C和深度z之间计算的公式:C0是没有散射情况下的图像亮度值,S是天空的图像亮度值。
以上两个任务可认为是deconvolution问题,blind或者non-blind。
物体表面阴影的变化可以提供深度的信息,利用图像亮度和其中物体表面的形状之间的关系,即Shape from shading。和SFM一样,这是一个病态问题,需要附加约束条件,如物体表面的特性。SFS一般假设四种表面模型:纯Lambertian,纯镜面,混合和更复杂的模型。大部分情况下都是Lambertian,即均匀照明的表面从任何一个方向观察其亮度不变。其目标函数是一个积分,求解的算法比较复杂,类似有限元之类。
纹理的变形提供了该纹理表面形状的线索。下图是一个示意流程图:
中间第三图是表面法向图,第四个才是深度图。纹理分割是必备的基础(估计是很难的一部分),此外求解这个shape from texture的优化问题,必须加上几个纹理元素(textels)约束条件:homogeneity,isotropy,stationary。
遮挡(occlusion)也是深度的一个线索,曲率(curvature)是其中的一个体现,即shape from curvature。isophote这个词指一种封闭的物体外轮廓,一般通过对图像灰度设门限可以得到,而它的曲率用来推导对应该门限的深度,见下图所示。门限在【0,255】范围变化就能得到最终叠加平均的深度图。分割仍然是一个求解遮挡的基础,要知道当时分割算法是计算机视觉很头疼的难题,俗称“chicken-and-egg"。
最后再说消失点,即某平面的一组平行线在透视投影下会聚的点。那么,它相应的平面就能得到深度图,如下图所示,在人工(特别室内)环境下可以推导深度图,沿着平行线的平面,靠近消失点的赋予大的深度值。该方法叫depth from geometrical perspective。
顺便提一下,在3维电视热的时期(2008-2010年左右)大家希望把以前拍摄的单目视频变成立体视频,给3-D电视提供更多的内容,包括3-D显示技术的普及(比如红绿眼镜)大家也想在家里share一些3-D的UGC。这个技术被称为2D-to-3D,通过深度图估计和虚拟立体视觉假设可以生成立体视频,其绘制技术称为DIBR,如下图:
以上是典型的传统计算机视觉,需要加约束求解病态的优化问题。下面谈谈机器学习如何解决这个视觉问题:
最早看到用机器学习的方法是基于MRF的,把各种约束关系放在模型的data term和connectivity term求解。这是我看到Andrew Ng在计算机视觉方面的第一篇论文,发表在NIPS 2005年,当时他刚刚在斯坦福大学建立自己的研究组。
如果采用图像分割得到的super-pixels,可以得到更平滑的结果,该系统叫做Make3D。
值得一提的是,当时CMU的博士生Derek Hoiem(后来UIUC教授)也在研究如何从单目图像中提取出景物的3-D结构,只是他采用机器学习方法在图像分割基础上做了一个简单的语义分割,即“ground”, “sky”, 和 “vertical”标注像素,然后采用简单的平面billboard做纹理映射后变成“pop-up”的3-D景物:
还有一种方法是把深度图估计变成一个搜索问题,即假设相似图像具有相似深度图:论文“2d-to-3d image conversion by learning depth from examples“
针对视频,可以利用optic flow做motion segmentation,那么修正上面的方法得到:微软论文“Depth Extraction from Video Using Non-parametric Sampling“
另外一种改进是利用dictionary learning优化整个搜索过程:EBAY论文”Im2Depth: Scalable Exemplar Based Depth Transfer“
下面我们看看深度学习是如何做的。
首先就是“暴力”方法直接喂数据训练模型:2篇论文
有些方法开始考虑传统方法的结合,比如CRF:
随后,双目立体视觉的空间约束被用作无监督学习单目的深度估计:三篇论文
自然地采用帧间运动为单目视频的深度估计提供帮助,实际上是双任务联合训练的例子:
这是结合表面法向图的联合训练例子:GeoNet,Geometric Neural Network
结合view synthesis也是利用几何约束和成像特性的工作:之前已经有文章直接通过Deep3D模型做单目到双目的合成,这里的工作只是最终结果是深度估计而不是图像。
这是结合运动和边缘信息的联合训练例子:
这个工作延续了以前利用分割提高深度估计的想法,只是假设上attention机制:
CVPR18 商汤科技的工作:“GeoNet--Unsupervised Learning of Dense Depth, Optical Flow and Camera Pose”,和光流,姿态一起估计了,还是无监督学习方法。
谷歌最近的工作延续了camera motion的结合,同时加上了其中物体各自运动的信息:可以认为是将optic flow分成了camera ego motion和object motion的工作,和加入语义分割有类似的思路吧,文章发表在AAAI‘19.
总之,深度学习在这个计算机视觉的传统问题上一开始是暴力的数据学习方法,慢慢地加入了传统方法的约束和先验知识,一定程度上缓解了数据标注的压力(pixel级别的ground truth是个挑战性的工作,structured light带来的数据多半是室内的,激光雷达的数据也存在“黑洞”现象),同时设计新的loss function同时多任务联合训练都能提升模型算法的性能。
1参考文献
-
“Predicting Depth, Surface Normals and Semantic Labels with a Common Multi-Scale Convolutional Architecture“, 15 -
“Depth Map Prediction from a Single Image using a Multi-Scale Deep Network“, 15 -
“Towards Unified Depth and Semantic Prediction From a Single Image“, CVPR 15 -
“Deep Convolutional Neural Fields for Depth Estimation from a Single Image“, 2015 CVPR -
“Deeper Depth Prediction with Fully Convolutional Residual Networks:, 3DV, 16 -
“SURGE: Surface Regularized Geometry Estimation from a Single Image“, NIPS 16 -
“Estimating Depth from Monocular Images as Classification Using Deep Fully Convolutional Residual Networks“,2016 -
“Single image depth estimation by dilated deep residual convolutional neural network and soft-weight-sum inference“,2017 -
“Depth and surface normal estimation from monocular images using regression on deep features and hierarchical CRFs“,2015 CVPR -
“Unsupervised CNN for Single View Depth Estimation: Geometry to the Rescue“,2016 ECCV -
“Unsupervised Monocular Depth Estimation with Left-Right Consistency“ 2017 CVPR -
“Semi-Supervised Deep Learning for Monocular Depth Map Prediction“ 2017 CVPR -
“Multi-Scale Continuous CRFs as Sequential Deep Networks for Monocular Depth Estimation “,2017 CVPR -
“Unsupervised Learning of Depth and Ego-Motion from Video“,CVPR 2017 -
“Single View Stereo Matching“,2018 -
“Deep Ordinal Regression Network for Monocular Depth Estimation“, CVPR18 -
“Look Deeper into Depth: Monocular Depth Estimation with Semantic Booster and Attention-Driven Loss“, ECCV‘18 -
”Learning Depth from Monocular Videos using Direct Methods“,CVPR 18 -
“Depth Prediction Without the Sensors: Leveraging Structure for Unsupervised Learning from Monocular Videos“, 2018 -
“GeoNet: Geometric Neural Network“, CVPR 18 -
“GeoNet--Unsupervised Learning of Dense Depth, Optical Flow and Camera Pose“, CVPR18 -
“LEGO: Learning Edge with Geometry all at Once by Watching Videos“, AAAI,19
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲 在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲 在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~