type
status
date
slug
summary
tags
category
icon
password
Property
Aug 2, 2022 02:15 AM
URL
论文笔记
简介
基于深度学习的单目深度估计在近几年是比较热门的研究方向之一,MIT的Diana Wofk等人在ICRA 2019上提出了一种用于嵌入式系统的深度估计算法FastDepth,在保证准确率的情况下,大大提高了模型的计算效率(来源)。
官方验证测试的pytorch版本(无训练):https://github.com/dwofk/fast-depth
笔记(这个部分以后需要边看边写)
摘要
深度感应是机器人任务的一个关键功能,如定位、测绘和障碍物检测等任务的关键功能。
人们对从单一的RGB图像中进行深度估计的兴趣日益浓厚。由于单眼相机的成本和尺寸相对较低,人们对从单一的RGB图像进行深度估计的兴趣越来越大。然而,最先进的单目深度估计算法是基于相当复杂的深度神经网络的,对于在嵌入式平台上进行实时推理来说太慢了。在嵌入式平台上进行推理,例如,安装在微型飞行器上的嵌入式平台。
在本文中,我们解决的问题是在嵌入式系统上的快速深度估计的问题。我们提出了一种高效和轻量级的编码器-解码器网络结构并应用网络剪裁来进一步降低计算复杂性和延时。特别是,我们专注于设计 一个低延迟的解码器。我们的方法证明了 有可能达到与先前的深度估计工作类似的精度,但推理速度要比先前的深度估计快一个数量级。
我们提出的网络,FastDepth,在NVIDIA Jetson TX2 GPU上的运行速度为178 fps,而在仅使用TX2 CPU时的运行速度为27 fps,有功功率低于10瓦。FastDepth在纽约大学深度v2数据上实现了接近最先进的精度。据作者所知,本文展示了在一个可由微型飞行器携带的嵌入式平台上使用深度神经网络进行实时的单眼深度估计,具有最低的延迟和最高的吞吐量。
- 嵌入式系统上的快速深度估计的问题
- 提出了一种高效和轻量级的编码器-解码器网络,解码器经过特别设计了,低延迟
- 跟之前baseline比精度近似,快一个数量级(sota)
- 实验证明帧率很高
之前的工作

这篇文章的related work写得不错,可以多看。
Introduction
这篇就是一个比较纯粹的技术报告,没啥数学推导啥的,重点在复现。
本文提出了一种低延迟,运行在嵌入式系统上的高效、高吞吐量、高精度的深度估计算法。我们提出了一种有效的编解码器网络体系结构,重点是低延迟设计。我们的方法使用MobileNet作为编码器,在解码器中使用深度可分离卷积的最近邻内插。我们应用了最先进的网络修剪NetAdapt,并使用TVM编译器堆栈来进一步减少目标嵌入式平台上的推理运行时间。
- 编码器-解码器结构,编码器用MobileNet,解码器用的深度可分离卷积的最近邻内插
- 手工设计网络参数冗余,训练时剪枝了
- 因为当时嵌入式平台没有对MobileNet的可分离卷积作优化,还对这个用TVM编译器做了优化
网络主体

21年了再看这个网络没啥新鲜的,主要注意有三个跨层连接,跨层通道没有作卷积操作,所以需要两者相和时维度一致。然后数据集并不是224*224的,输入时需要降采样。
解码器是试出来的,在这篇文章的实验部分有写。
注意理解上采样部分的转置卷积,以及stride>1对应的微步卷积
复现
先直接上代码
以下代码在gitee smart_sever仓库里也有 fastdepth_train_test_model.py
环境配置
之前配的有问题报错,hls上来就弄好了,生成了yml文件如下
之后改了一点,156的服务器直接能装,普通电脑可能要看一下版本号手动装
数据集
tensorflow没有pytorch的dataset那么好用的dataloader,本来是做的pytorch的dataset+keras做训练的一个杂交,因为MAI比赛需要全tensorflow所以被否了。
用到的nyudepthv2数据集的构造跟一般数据集类似



train.txt和val.txt是我生成的,包含全部h5文件的绝对路径,用的creat_data_index.py仓库里也有,代码不贴了,需要注意os路径和h5文件的读取(需要先get对应的value),里面还包含了图像调整通道和resize降采样,一堆小的api,对数据预处理挺有用的,以后可以多看看
Datagenerator
注释写得挺详细的,直接看上面对应代码就行了
参考链接(含可运行代码):
网络主体

之前的笔记部分有细讲,这个主题难点就是keras.model基本框架用法和几个跨层连接,需要多看
Train
直接写注意事项吧
- compile部分的optimizers可以自定参数等等(参考官方中文文档,这一部分写得凑合(链接))
- 注意fit_generator需要自己定义steps_per_epoch,这个参数可以在datagenerator的init里对齐训练的batchsize修改steps_per_epoch全局变量,验证集的validation_steps也得定义,跟steps_per_epoch一样就行
- fit_generator利用callbacks机制保存每一个epoch的权重,改了一会,路径一般照着上面来就行
- verbose为0不输出epoch结果,为1输出进度条
- fit_generator返回一个history,照着上面保存accuracy和loss就行
其他注意事项
这个train还差导入已经训好的权重,这篇就不补了,之后自己去仓库找
- 一般调代码训练的流程是:
- 写网络主体结构,compile之后summary看一下参数对不对
- 用几个random的数组作为traindata试一下输入输出或者中间结果的size符不符合预期
- 写datagenerator,生成enumerate打印每次的生成数据对不对
- 套进去开训,中间参数checkpoints啥的细节优化
之后需要写一个pytorch一般框架(挖坑)