AI中国网 https: //www.cnaiplus.com
几个月前,我们开始制造 Axionaut,一种小型自动无线电控制(RC)汽车,并且在巴黎参加了一些比赛。到目前为止一切顺利,我们已经取得了不错的成绩。尽管如此,大家总是对控制汽车的卷积神经网络内部发生了什么感到好奇。
我们看到一些关於如何显示特徵映射和过滤器方面很好的文章,它们在理解和编写神经网络特徵映射时非常有用。我们还看到了一些很酷的 Nvidia 视频,视频展示了自动驾驶汽车上神经网络实时激活的样子(但是,它们是怎么做到的呢?)。
所以我们决定从头开始,尝试在原型中复制这种体验。为此,我们使用了预先训练过的Keras Convnet自动驾驶模型,还有一些在训练和比赛时拍摄的视频。
有了这个良好的开端,我们花了几天时间来寻找一些经典问题的答案,比如“网络是如何看待世界的”和“网络实际上到底关注什么”。
实现
如果你对我们是如何做到这一点感到好奇的话,首先你需要了解卷积层的特徵映射在检测视野内相关特徵时是如何激活的。这方面Harsh Pokharna的某篇文章做了很好的解释。
在这种情况下,我们的汽车变成了一个检测车道的“专家
就像人一样,在不考虑其他因素(其他车辆、路标、行人或目的地)的情况下,车道会给我们提供如何做出正确决策的相关信息。我们应该向左转?向右转?继续直行?
好吧,让我们回到正题。我们需要做的第一件事是找到感兴趣的卷积层,并且绘制需要激活的热图。为此,我们使用了这个庞大的存储库的一个稍微修改过的版本。
完全重建一次激活意味着要考虑到这里提到的“深”卷积层的作用。
为了简化,我们要估算出单个卷积层的激活量,这里使用三次样条插值法,而不是逆卷积。在对网络上所有特徵映射进行可视化检测后,我们选择了第二个卷积层。
分页代码
我们将结果显示在这里:
在这一点上,很明显网络主要是在响应车道。下一步是将原始输入图像与激活重叠,以一种不损坏原始图像形状和颜色的方式将响应高的区域清晰地叠加在一起。
这里要用到OpenCV!首先创建一个二进制掩码,用来分割出激活最高的部分,同时棑除掉其他的。由於激活映射的区域较小,我们还需要向上采样。然后,使用按位运算获得最终合并的图像。
最先要做的按位运算是将二进制掩码和激活映射进行“与”运算。该操作可以用OpenCV轻松实现,并且分割出映射里激活最高的部分。
就像预期的那样,我们最终得到了一条完全由卷积神经网络切割出来的、清晰的车道。
现在我猜你已经想到了,为了要完成最终的图像,我们需要做的第二步按位运算:与运算。图像中的冷蓝色是由於Matplotlib (RGB)和OpenCV (BGR)颜色格式不同导致的。你可以捣腾这个会变色的色图来得到不同的颜色。
就这样,我们在对网络激活做合理估算的基础上,将输入图像与特徵映射做最后整合。
现在,让我们用一段视频来呈现这个结果吧。
AI中国网 https: //www.cnaiplus.com
本文网址: