如今,自动驾驶汽车的创建已成为一个热门话题,业余爱好者正在这里进行很多有趣的事情。
最古老,最著名的课程是
Udacity的
在线学位 。
因此,在自动机器中,有一种非常时髦的方法-行为克隆,其本质是计算机学会了像一个人一样(只在车轮上),仅依靠记录的输入和输出数据来学习行为。 粗略地说,存在来自摄像机的图像基础和相应的转向角。
从理论上讲,在对这些数据进行神经网络训练后,我们可以让它驱动机器。
这种方法基于
Nvidia的
文章 。
有许多主要由Udacity学生完成的实现:
更有趣的是在实际项目中的应用。 例如,
驴车由受过专门训练的
神经网络控制 。
如此丰富的信息领域直接推动了行动,尤其是自从
上一篇文章以来,我的
机器人储罐在开发过程中已走到了尽头,并且迫切需要新的想法。 有一个大胆的梦想-带着他的坦克在公园里散步,总的来说,这并不比养家犬差。 重点很小-教坦克在公园的人行道上骑行。
那么,就计算机而言,人行道是什么?
图片中某些区域的颜色与其他区域不同。
碰巧在我可以进入的公园中,人行道竟然是照片中最灰色的物体。
(最灰色是指RGB值之间的最小差异)。 这是一种灰色属性,将是路面识别的关键。
灰色的另一个重要参数是亮度。 秋季照片由灰色构成,而不是完全由灰色构成,因此道路和路缘之间的差异仅是阴影。
几种最明显的方法是进行预校准-定位机器人,使道路占据屏幕的大部分位置,
- 取得平均亮度(以HSV格式)
- 或平均RGB片段,保证由道路制成(在这种情况下,它将为左下角)。
建立了识别人行道的标准后,我们遍历了图片并得到了某种形状的道路。
下一步是将红斑变成行动-直行或右转或左转。
如果可以看到右侧边缘并且与垂直方向的角度小于45度,我们将直行。
如果右边缘可见并且角度偏离垂直向下,我们将向左转。
如果看不到右边缘,请向右转。
红斑点的右边缘-使用几何图形解决此问题相当无聊。 如果人工思维正在寻找这些废料中的倾斜模式,那就更好了。
这是神经网络解救的地方。
原始图片被冲洗掉,被挤压和裁剪,我们选择识别灰色的人行道并获得64x64的黑白蒙版。
我们将这些蒙版分解为3组-左,右,直,并在其上训练神经网络分类器。
收集和准备数据是一项繁琐的工作,花费了几个月的时间。
以下是示例蒙版:
在左边:
在右边:
直线:
为了使用神经网络,我使用了Keras + Tensorflow。
最初有一个想法采用Nvidia的神经网络的结构,但是很显然,它是为其他几个任务而设计的,不能很好地应对分类。 结果,事实证明,任何多类别分类教程中最简单的神经网络都可以提供令人满意的结果。
model = Sequential() activation = "relu" model.add(Conv2D(20, 5, padding="same", input_shape=input_shape)) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Conv2D(50, 5, padding="same")) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Flatten()) model.add(Dense(500)) model.add(Activation(activation)) model.add(Dense(cls_n)) opt = SGD(lr=0.01) model.add(Activation("softmax")) model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
培训了网络的第一个版本后,我遇到了与Raspberry Pi不兼容的情况。 在此之前,我使用Tensorflow 1.1版,使用的是
一个非常聪明的人收集的萨满教义。
不幸的是,此版本已过时,无法读取Keras的模型。
但是,尽管使用了新版本的Raspbian-Stretch,但最近来自Google的人们终于下来了,并在Raspberry Pi下收集了TF。 伸展运动对每个人都很好,但是一年前我没有OpenCV,所以坦克去了杰西。
现在,在变化的压力下,我不得不切换到“拉伸”。 Tensorflow起床没有问题(尽管花了几个小时)。 一年的OpenCV也没有停止,并且4.0版本已经发布。 因此,她设法在Stretch的帮助下进行收集,因此没有迁移的障碍。
对于Raspberry如何实时拉动Tensorflow这样的怪物存在疑问,但事实证明一切都可以接受-尽管网络最初加载了几秒钟,但分类本身每秒可以工作几次,而不会占用大量内存和CPU。
结果,大多数问题和错误恰好发生在道路识别阶段。
尽管结构简单,但神经网络很少会遗漏。
使用更新的固件,水箱可以穿越公园。
由于受到的伤害,机器人不断向右吹,因此如果没有人工智能,它就会迅速驶向草坪。
您现在可以在早晨walk他,并发现即将到来的狗。
参考文献: