我要解决的问题是:车里有摄像头,我想知道车开多快。你显然不能看速度表,只能看视频剪辑本身。深度学习的魔力应该可以帮助我们。数据我有两个不同的视频。一个用于训练,另一个用于测试。训练视频有20399帧,测试视频有10797帧。视频下载地址:https://github.com/commaai/speedchallenge。以下是一些示例:视频中的样本图像训练视频的标签是一个.txt文件,其中每一行对应于特定帧的速度。这个问题最有趣的方面是你的神经网络输入会是什么样子。仅从一张静态图像计算速度是不可能的。一种有效的方法是将两个或多个图像堆叠在一起,或者像LSTM或Transformer那样按顺序堆叠。另一个是计算光流,我决定使用它。什么是光流?它基本上是一种为每个像素计算矢量的方法,告诉您两个图像之间的相对运动。有一个很棒的电脑爱好者视频:https://www.youtube.com/watch?v=4v_keMNROv4您可以在其中了解更多详细信息。有一些“经典”计算机视觉算法可用于计算光流,但深度学习已经变得更好(不足为奇)。那么SOTA方法是什么,我们看paperswithcode:RAFT看起来不错,它也有PyTorch实现。我分叉了原始存储库并使其更简单一些。我不需要训练、评估等。我只是用它来推理。计算光流为了进行推理,网络将两个图像拼接在一起并预测维度为*(2,image_height,image_width)*的张量。如前所述,图像中的每个像素对应一个二维向量。我们在实际训练中会用到这些文件,所以我们将它们保存为.npy文件。如果你想象一下光流图像它会是这样的:训练记住我们训练的目的:光流→模型→车速估计我选择的模型是EfficientNet。我真的很喜欢它,因为它的可扩展性。它有8个不同的版本供你选择,最大的一个,EfficientNet-B7还是非常非常好的。您可以从像B0这样的小型变体开始,然后如果一切正常并且您有足够好的GPU,则可以选择更大的变体。还有一个PyTorch库,我会用它来非常方便地加载预训练的网络模型,地址:https://github.com/lukemelas/effecentnet-PyTorch。如果你打开[train.ipynb](https://github.com/sharifelhouly/vehicle-speed-estimate),你可以看到训练是如何进行的。我总是从B0开始并向上扩展到B3,因为我的GPU只有6GB内存。训练后得到如下结果(loss为均方误差):traininglossvalidationloss没问题,看起来一切正常!训练和验证损失都在减少,网络没有过度拟合。结果如下:虽然不完美,但确实有一些用处总结我通常不是特征工程的忠实粉丝,但我认为它在这种情况下做得很好。下一步是尝试一些序列化的东西,比如Transformer或LSTM。
