论文阅读 - DroNet: Deep learning 在无人机导航中的应用

DroNet: Learning to Fly by Driving 提出了一个结构非常简单但是又非常强大的网络结构,可以通过输入的每帧图像输出当前飞行器 yaw 的目标角度值与前方障碍物的概率值,从而可以利用这两个信息推断出飞行器当前运动时的 yaw 应转角度 θk\theta_k 与前进飞行速度 vkv_k,从而达到自主导航的目的。

DroNet: Learning to Fly by Driving

A. Loquercio, A.I. Maqueda, C.R. Del Blanco, D. Scaramuzza
DroNet: Learning to Fly by Driving,
IEEE Robotics and Automation Letters (RA-L), 2018.
PDF YouTube Software and Datasets.

简介

DroNet 是一个结构非常简单但是又非常强大的网络结构,可以通过输入的每帧图像输出当前飞行器 yaw 的目标角度值与前方障碍物的概率值,从而可以利用这两个信息推断出飞行器当前运动时的 yaw 应转角度 θk\theta_k 与前进飞行速度 vkv_k,从而达到自主导航的目的。对比论文发布当时的其他相关网络模型,达到了最好的准确度与处理速度的平衡。

1560001100081

该系统在非机载处理资源上运行 (Intel Core i7 2.6 GHz CPU)上可以达到 30Hz 的控制指令输出。可想如果机载选择 TX2 此类处理器,采用 GPU 进行推理计算的话,速度会更快。

该模型的训练数据采用室外场景下在地面交通工具上采集的数据集,比如自行车,汽车等在城市环境内第一视角的图像与其他数据。实验结果惊奇的发现该方法不仅在室外不同视角下表现极好(5m 飞行高度),在室内场景中也有极强的泛化能力。飞机可以在没有先验信息的环境中也可以有一个非常好的导航效果。

主要贡献

文章以 “无人机应该像其他地面交通工具一样,在 roadway 中有相同的 behavior” 为出发点,通过来自于地面交通工具的数据集,做了以下主要工作:

  • 提出了一种 residual convolutional architecture (DroNet),可以预测飞机要转的偏航角与前方发生与障碍物碰撞的概率,可以为飞机在城市环境中提供安全的飞行。通过来自于室外场景下汽车,自行车的数据集来训练该网络。
  • 建立了一个关于预测是前方障碍物概率的数据集。
  • 可以到到很好的 performance 和 real-time。
  • 通过一些扩展场景的检验,发现该系统的泛化能力极强,可以在没有任何先验信息的环境中正常运行,包括数据集中没有的室内走廊场景,一个高高度(视角不一样)等场景.

文章作者还提到该方法并不是为了替代传统的 map-localize-plan 方法,作者认为将来有一天传统方法与基于深度学习的方法会互补.

关于网络与训练方法

网络的结构图如下:

输出的转角与障碍物信息两个功能在前面共用同一个网络结构(共享同一套参数)。输入的图像是一张 200x200x1 的灰度图,通过一个 5x5 的卷积核降维后,通过三层 res block,然后经过 dropout(作者实验时设的是 0.5)后再分叉,通过 Relu 后作用于两个全连接层(节点数为 1)分别输出信息(大小范围均在 0-1 之间)。关于为何有这样的网络设计的想法,作者并未多提。

通过代码看到最终 collision 这个全连接节点最终输出还被作用了一个 sigmod 函数,这个论文中并未提到为何。猜测是用于归一化(概率值必须大于 0 小于 1,而刚开始训练的时候 loss 大多依据(后面会讲到) steering 的 loss,可能会出现 [-1, 0] 之间的数,所以要归一化到 (0,1)) / 某种意义上的数据增强?具体只能等跑训练代码的时候看一下实际该参数的值。

cnn_models.py

1
2
3
85    # Collision channel
86 coll = Dense (output_dim)(x)
87 coll = Activation ('sigmoid')(coll)

关于训练方法:

关于转角的预测本质是一个回归问题,关于障碍物的检测本质是一个二分类问题(虽然最后输出的是概率,但是从数据集本质来看是一个二分类问题,这个后续详述)。该网络比较特殊(两种不同的问题模型的输出,共享网络),所以要设计出一种合理的 loss 函数.

根据两类问题的本质,转角预测本质为回归问题所以采用均方误差(MSE)衡量 loss;障碍物概率预测本质为二分类问题所以采用二值交叉熵(BCE)来衡量学习到的分布与样本真实分布的差异,作为 loss。但是整个网络不能简单使用两个 loss 叠加来来作为最终的 loss,会导致特别差的收敛结果,因为回归问题和分类问题在模型刚开始训练的时候,梯度大小差异非常大 参考文献

实际中,回归问题的梯度在刚开始的时候会非常大,MSE 的梯度正比于转角的误差值。所以策略就是刚开始的时候几乎只选择用转角的 loss,后面随着 epoch 的增加慢慢增大障碍物概率检测的 loss 的权重,等到两者 loss 在一个数量级可比的时候,optimizer 就会自动为两者找到一个很好的 solution。该方式的解释也在上一个参考文献链接里,不设权重或者权重恒定的方法都会导致不好的结果或者收敛时间过长,所以依据此作者提出了下面的 loss:

Ltot=LMSE+max(0,1expdecay(epochepoch0))LBCEL_{t o t}=L_{M S E}+\max \left (0,1-\exp ^{-d e c a y\left (e p o c h-e p o c h_{0}\right)}\right) L_{B C E}

该方式就可以达到上面所说的期望的训练过程中的 loss 函数变化情况。作者在实验时选择 decay=110decay=\frac {1}{10}, epoch0=10epoch_{0}=10

optimizer 选择 Adam,初始学习率设为 0.001,decay=1e-5。

最后作者为 optimization 还采用了 hard negative mining 来建立负样本集,在每一个 epoch 中选择 loss 最高的 k 个样本,采用上面计算 loss 的式子计算整体 loss。k 会随着时间会减小。

数据集

关于转角预测(Steering angle)采用来自 Udacity’s project 的公共数据集,该数据集是基于汽车拍摄的。里面有三个摄像头以及 imu,gps,steering angle 等其他同步的数据,作者只选用前置摄像头与 steering angle 作为模型训练时所采用的数据。

关于用于计算障碍物概率的数据集,由于没有合适的数据集,作者们自制了一套相关数据集,137 个场景序列中包含了 32000 张图片。根据视野障碍物是否离得特别近来标注 0(无碰撞风险)和 1(有碰撞风险)。例图如下,绿色表示无碰撞风险,红色表示有碰撞风险。

1560001239435

飞机运动控制方法

整体的导航思路很简单,飞机一直在同一高度飞行,只控制飞机的两个自由度,机体坐标系下前进的速度 vkv_k 和世界坐标系下的 yaw 值 θk\theta_k.

  • 根据网络输出的前方发生与障碍物碰撞的概率 ptp_t 计算前进的速度 vkv_k:

    vk=(1α)vk1+α(1pt)Vmaxv_{k}=(1-\alpha) v_{k-1}+\alpha\left (1-p_{t}\right) V_{\max}

    公式很简单,即前方发生碰撞概率越大,前进的速度越低,发生碰撞概率为 1 的时候速度为 0. 然后加了低通滤波使速度输出更平滑 (0<α<10<\alpha<1).

  • 根据网络输出的 steering angle 换算成实际要转的偏航角大小。网络输出的范围为 [-1, 1],换算成 [π2,π2]\left [-\frac {\pi}{2}, \frac {\pi}{2}\right]。然后也同理加了个低通滤波:

    θk=(1β)θk1+βπ2sk\theta_{k}=(1-\beta) \theta_{k-1}+\beta \frac {\pi}{2} s_{k}

然后根据这两个值赋给飞机就可以控制飞机运动了。作者在试验中选择的 α=0.7\alpha=0.7β=0.5\beta=0.5VmaxV_{\max} 根据实验场景不同选择合适的值即可。

实验结果

作者在大量场景中进行了测试,具体的测试结果这里不在赘述。

DroNet 模型是一个平衡结果准确性与运算速度的最佳的模型。