基于深度学习的单目深度估计

    最近为了应付面试,把扔了好久当初也没好好学的单目深度估计拿出来,怕面试被问到。

    代码:https://github.com/xanderchf/MonoDepth-FPN-PyTorch

    1.数据预处理

    首先从数据集中分别读取RGB彩色图像和对应的深度图标签从图像中读取出来,得到rgb和depth,其中RGB是彩色图,先resize到192*640,再取出128*640*3,depth image则是先resize到48*160,再取出32*160*1。这样的去除操作之后,depth image的空间分辨率就刚好是彩色图像分辨率的1/4。读取出来的最原始深度图像中的数值是实际距离,需要对于深度图中的数值进行归一化(除以65535)到0-1之间。这意味着网络模型最后一层的输出将使用sigmoid激活层。而最终网络模型输出的分辨率刚好是输入图像分辨率的1/4,故而在训练过程中不需要进行上采样,直接在1/4分辨率上计算损失函数,而在prediction 过程中则需要将网络模型的输出预测值通过上采样的操作,采样到与输入图像分辨率相同。这一操作或许有理论支撑,因为通过自然图像的语义分割deeplab V3+模型中可以发现,现在语义分割模型的性能主要取决于编码层,encoder的特征越好,encoder模型设计的越好,则分割网络的性能就越好,也就是说,分割网络的性能很大程度上取决于编码器的设计,解码器可以不用花那么多心思设计或者直接使用4倍/8倍的上采样即可(F.upsample)。

    2.损失函数

       可以看出,对于ground truth 图像的每个像素点而言,ground truth值是介于0-1之间的连续浮点数,prediction value是经过sigmoid函数激活的0-1之间的数值。故而可以使用任何回归任务的loss,如MSE,L1 loss等。

    3.单目深度估计与语义分割模型的区别和联系

       最早接触机器学习的时候就提到过,在监督学习任务中常见的两大任务就是分类和回归,分类任务就是希望预测出来的数值是离散的类别标号,回归任务预测出来的就是连续的数值。对于单个像素点而言,语义分割任务就是分类任务,语义分割任务是pixel level classification task,单目深度估计就是回归任务,单目深度估计是pixel level regression task。再反过来看图像识别/图像分类,就是image level classification task,而物体检测则包含了分类任务和回归任务,分别是:patch level classification task和patch level regression task。

    

你可能感兴趣的:(deep,learning,pytorch)