驴车垃圾收集器的自动驾驶 AI
使用 TensorFlow SSD Raspberry Pi 和 Pi Camera 上的 MobileNetV2 DNN 构建具有物体检测功能的自动驾驶汽车。
故事
该项目将展示如何将(Raspberry Pi + Pi Camera)驱动的遥控车改造为能够进行物体检测和自动驾驶的遥控车。为此,我们将部署两个深度神经网络。一个用于物体检测,另一个用于使用转向和油门推理的自动驾驶。 RPi 3 用作车辆计算机。由于 RPi 上的资源有限,一次只能运行一个网络。
这个想法是训练神经网络识别垃圾箱,这样汽车就可以自动捡起垃圾。
识别汽车和笔记本电脑
该项目由两部分组成。在第一部分中,计划是使用中等大小的卷积网络来识别来自 Pi 相机的输入视频中的对象。 TensorFlow 将用于部署 CNN 模型,OpenCV 将用于管理来自 Pi Camera 的视频源。
在第二部分中,我们将使用行为克隆来让汽车自主导航。改装后的汽车还将增加额外的传感器,例如超声波距离传感器、GPS 和 6 自由度 IMU,并实现额外的遥测功能。
简介
早在 2017 年(一年前),Google 发布了 MobileNet,今年早些时候还发布了 MobileNetV2。这些网络针对智能手机等嵌入式设备进行了自定义优化。巧合的是,RPi 3 上使用的 MPU 也属于这一类,因为它可以运行 Linux 或 Android。
遇到的第一个问题是树莓派3有限的RAM和计算能力。虽然这是一个四核MPU,但在处理YOLO所需的海量权重文件时仍然不够(You Only看一次)类型的网络。
想到的第一个解决方案是通过 WIFI 将通过 Pi Camera 获取的图像发送到外部 PC,并在那里进行对象推理阶段,然后向 Donkey Car 发送命令。本质上我们每一步都要联系母舰。这在无法与外部笔记本电脑通信的情况下效率低下,更不用说不切实际了。
我最初测试了一个 VGG16 网络,它在检测垃圾箱时相对准确。但是它不能在 RPi 上运行,因为仅权重就在 350MB 左右!要测试 VGG 网络,请参考最后附上的代码,输入相似的图像。
问题:
python KerasVGG_test.py
因此,为了解决巨大权重的问题,我们将使用更纤薄的网络在 RPi 上运行所有模型。具体来说,我们将使用基于 CNN 的 MobileNetV2 Single Shot Detector。这是一个经过优化的 DNN,具有非常小的(相对)权重。
该技术称为迁移学习,因为我们使用的是预训练的网络权重。
在深入研究软件之前,我们必须对硬件进行一些修改。
硬件
Donkey Car 项目使用了一辆磁铁车。 Magnet 是一种使用 2.4GHz 多频道无线电工作的 RC(遥控)汽车。要将磁铁变成驴车,必须执行几个步骤。
1. 拆卸
首先通过卸下背面的夹子和两个螺钉来卸下顶盖。你会发现一个有两个司机的笼子。也拆下它,然后拆下外顶笼。现在您可以访问汽车上的电路了。从顶部可以看到接收器、ESC(电子调速器)和舵机。
裸驴车
接收器是一个带有 B/C(电池消除)电路的 4 通道接收器。每个通道使用一个 3 线连接器。不使用通道 CH3 和 CH4。电调以电池为输入,电源开关和接收器通道1的输入。舵机连接到接收器的通道0。舵机用于转向。操纵杆驾驶可以手动调整转向角,或者需要校准。
2. 安装适配器
拆下两个螺丝和机身顶部后,使用了两个3D打印塑料适配器。您必须使用相同的螺钉将两个适配器拧到现有夹子的位置。用两个 3D 打印适配器替换两个夹子后,现在我们可以安装顶部木制驴车板。
替换长夹子的适配器
接下来拧紧底板上的相机手柄。然后将塑料螺纹部件放在每个孔上。这些用于固定 Raspberry Pi 和伺服控制器。
3.伺服控制器和RPi
将树莓派和伺服控制器安装在木板上。我最终使用拉链来固定 RPi,因为我不想在天线附近放一个金属螺丝。拧紧伺服控制器后,将 I2C 总线引脚从 RPi 连接到伺服控制器。接下来,拿一把小刀剪断将 ESC 和伺服 3 针电线固定在一起的扎带。
当连接到外部伺服控制器时,与接收器的两个连接都必须从它断开并连接到伺服控制器的通道 0 和 1,我们稍后将安装在 DonkeyCar 顶部-盘子。
4.木板
将木板安装在适配器上。现在使用夹子将 DonkeyCar 板连接到磁铁底盘适配器。
将 Donkey 车板安装在顶部,并使用短 USB 电缆将 USB 电池连接到 RPi。油门和转向线会从板的开口处伸出,并连接到安装在驴车板上的伺服控制器的0和1通道。
5. 附加传感器
标准配置的主要问题是没有用于测量速度或与障碍物距离的传感器。我添加了一个 6DOF MPU6050 IMU,它允许 RPi 测量 3D 加速度和转弯,接下来我添加了一个 GPS 到串行端口,还有一个 HCSR04 传感器用于距离测量。然而,HCSR04 通过 5V 工作并且需要一个电平转换器。
到此完成单元的硬件阶段。驴车已完全改装成配备:
的四轮车a) 单目广角相机
b) 伺服控制器。
c) 6-DOF IMU 传感器
d) GPS
e) 距离传感器
所有额外的传感器将在获取时打上时间戳,并用于增强深度神经网络的训练向量。
为了支持额外的传感器,必须修改 manage.py 脚本以添加此功能。
为了使用 IMU,我最初在 Debian Stretch 上尝试了用于 FXOS8700 的 Python 库。由于 RPi 的重复启动错误,这并没有立即生效,所以我最终使用了一个 MPU6050,它也带有一个陀螺仪。
要测试 IMU 代码,请使用以下代码片段:
from IMU import MPU6050
mu =MPU6050()
a =imu.run()
a #print answer
以下软件需要来自 MPU6050 的 virtualenv:
sudo apt install python3-smbus
pip install mpu6050-raspberrypi
必须扩充 tub 文件夹下的 meta.json 文件以支持记录 IMU 数据。
{“输入”:[“cam/image_array”、“用户/角度”、“用户/油门”、“用户/模式”、“imu/acl_x”、“imu/acl_y”、“imu/acl_z”、“imu /gyr_x”, “imu/gyr_y”, “imu/gyr_z”], “types”:[“image_array”, “float”, “float”, “str”, “float”, “float”, “float”, “浮动”、“浮动”、“浮动”]}
manage.py 文件也必须修改如下:
imu =Mpu6050()
V.add(imu, 输出=['imu/acl_x', 'imu/acl_y', 'imu/acl_z', 'imu/gyr_x', 'imu/gyr_y', 'imu /gyr_z'], threaded=True)
# 添加 tub 保存数据
inputs =['cam/image_array', 'user/angle', 'user/throttle', 'user/mode', 'imu/acl_x', 'imu/acl_y', 'imu/acl_z', 'imu/gyr_x', 'imu/gyr_y', 'imu/gyr_z']
types =['image_array', 'float' , 'float', 'str', 'float', 'float', 'float','float', 'float', 'float']
最后我还在单元中添加了 GPS 模块。虽然这不能在室内使用,但在可以连接到 WIFI 网络的区域添加室外测试很有用。
如果需要登录 GPS 数据,必须进行与 IMU 相同的修改。
要使用 HSCR04 距离传感器,必须从 python 环境安装 RPI.GPIO 库。
pip 安装RPi.GPIO
这是所有硬件修改的总结。最后你会得到一个看起来像这样的 DonkeyCar:
软件
这里的想法是实现一个 AI 管道,用于在 RPi 上运行的对象检测。第一步将是部署一个对象检测 DNN,该 DNN 将在 RPi 3 上运行,而不依赖于外部设备。让我们开始安装所需的软件。
1. 安装 DNN 库
该项目使用 TensorFlow 和 OpenCV。简单来说,为了在 Raspberry Pi 上进行推理,我们使用了一个已经训练好的网络。加载权重后,对每个相机帧进行对象检测和推理。
pip install tensorflow[pi]
pip install matplotlib raspberry
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-devsudo apt-get install qt4-dev-tools
pip3 install opencv-python
需要指出的一点是,TensorFlow 使用不同的文件格式,这与 Keras 不同,Keras 具有相对简单的工作流程,可以将权重加载为 h5 文件。
须藤 pip3 安装 keras –upgrade
克隆官方 TensorFlow 模型存储库。
git clone –recurse-submodules https://github.com/tensorflow/models.git
并导出路径:
导出 PYTHONPATH=$PYTHONPATH:/home/pi/tensorflow1/models/research:/home/pi/tensorflow1/models/research/slim
最后当一切都安装好后重启问题
如果您正在使用一个,请停用 # 退出虚拟环境工作区
sudo shutdown -h now
下一步是为 MobileNetV2 SSD 的权重安装 Protobuffer 编译器。
2.安装ProtoBuffer编译器
Keras 使用与 TensorFlow 不同的文件格式。所以我们必须处理 TensorFlow 的原生格式 Protobuffers。
我安装的是 3.5.1 版
sudo apt-get install autoconf automake libtool curl
wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all–3.5.1.tar.gz
tar -zxvf protobuf-all–3.5.1.tar.gzcd protobuf-3.5.1
./configure
在 RPi 上编译这将花费相当多的时间(约 1.5 小时)。另一种解决方案是交叉编译,但我们现在必须保持简单。问题:
制作
然后发出:
make check
sudo make install
cd pythonexport
LD_LIBRARY_PATH=../src/.libs
最后安装编译器:
python3 setup.py build –cpp_implementation python3 setup.py test –cpp_implementationsudo python3 setup.py install –cpp_implementation
现在导出路径:
导出 PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
导出 PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION=3
sudo ldconfig
最后测试编译器只需输入:
协议
现在我们读到隆隆声。这将使我们能够将权重转换为 TensorFlow 能够理解的格式。
阅读更多详情:驴车垃圾收集器的自动驾驶人工智能
制造工艺