返回列表

9th Place Solution

359. Peking University/Baidu - Autonomous Driving | pku-autonomous-driving

开始: 2019-10-22 结束: 2020-01-21 自动驾驶感知 数据算法赛
第9名解决方案

第9名解决方案

作者: yu4u | 比赛排名: 第9名

感谢主办方北京大学/百度和Kaggle团队举办了这场引人入胜的比赛,并祝贺所有获奖者和奖牌获得者。
以下是我的解决方案简述(建设中)。

方法

我使用了两个独立的模型。第一个模型(模型A)用于检测汽车并估计其姿态。第二个模型(模型B)估计每张图像的深度图。利用模型A提供的图像坐标、模型B提供的深度以及相机内参,计算每辆车的3D坐标。估计准确的深度比汽车检测或姿态估计更难。因此,我将深度部分分离到不同的专用模型(模型B)中。

模型A

类似于CenterNet,但在目标和损失上做了一些修改。

目标

模型A检测汽车,估计其图像坐标——而非提交所需的3D相机坐标——以及。
因此,目标是。
conf是用于检测汽车中心的置信度图。是特征网格中汽车中心的相对位置(0-1)。
是局部姿态,而不是作为真实标签给出的相机坐标系中的姿态。我使用局部姿态是因为,如果没有上下文(相机位置和图像坐标),仅凭汽车外观很难估计原始的真实姿态。

[1] A. Mousavian et al., "3D Bounding Box Estimation Using Deep Learning and Geometry," in Proc. of CVPR, 2017.

这种姿态的修改是通过将相机中心移动到目标汽车中心的旋转矩阵完成的:

yaw = 0
pitch = -np.arctan(x / z)
roll = np.arctan(y / z)
r = Rotation.from_euler("xyz", (roll, pitch, yaw))

损失

conf使用交叉熵,其他目标使用L2损失。

架构

我根据深度将汽车分组,分别训练了不同的模型作为模型A(共四个模型),以检测不同大小的汽车;分组范围为0-25、20-50、40-80和70-180。对于前两组(较近的汽车),使用efficientnet或se-resnext获得x32下采样的特征图。对于后两组,使用分割模型(efficientnet或se-resnext + FPN,来自segmentation_models.pytorch)以获得更精细的特征图(x16)。

数据增强

数据增强是困难的部分;它与如何创建缩放或翻转测试图像的真实标签有关。

  • 翻转(围绕主点而不是图像中心:img[:, :3374] = cv2.flip(img[:, :3374], 1)
  • 旋转(围绕主点;img = np.array(Image.fromarray(img).rotate(theta, center=(1686.2379, 1354.9849))))(-7到1度)
  • 随机亮度对比度
  • 随机缩放和裁剪

优化器

使用Adam训练160个epoch;初始学习率 LR = 0.0001,在第100和140个epoch时乘以0.1。

集成

几个k-fold模型在特征图层面进行了集成(模型原始输出取平均),但似乎不起作用(为什么...?)

模型B

输入

对于模型B,训练和测试使用了固定的输入图像区域:img[1558:, 23:3351]。此外,将相对于主点的图像坐标添加到输入中,以利用固定相机位置相对于地面的上下文信息(因此输入为灰度图像、dx、dy)。

目标与损失

第二个模型仅预测汽车的深度。实际上,我训练

同比赛其他方案