本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于 NVIDIA Jetson Nano 的盲区行人检测系统

发布时间:2022-01-09
分享到:

基于 NVIDIA Jetson Nano 的盲区行人检测系统

发布时间:2022-01-09
分享到:

本项目使用的是一种在Nvidia Jetson Nano上的Edge Impulse中使用MobileNetV2检测盲点区域行人的物体检测方法。

行人检测系统:
我开发了一个原型,它将检测车辆盲点区域中是否有行人,并通过蜂鸣器声音提醒驾驶员。我在 Nvidia Jetson Nano 2GB 变体板中使用了基于 MobileNetV2 的对象检测方法,使用 Edge Impulse。

问题源头:

  • 在停车位,很多车主常常在挤满行人的地方难以开出自己的车辆。
  • 在自动驾驶汽车中,行人检测系统需要更高成本的激光雷达技术,雷达检测盲点区域的行人

技术解决方案:

  • Nvidia Jetson Nano 板中使用 Edge Impulse 的物体检测可以检测盲点区域内横穿车辆的行人。
  • 网络摄像头将覆盖车辆的两个盲点区域。
  • 与 LIDAR、RADAR 技术相比,计算机视觉技术将具有成本效益。

在使用 Edge Impulse 的目标检测中,我使用 MobilenetV2 CNN 对输入图像中的行人进行分类。

在原型中,Arduino Nano用作辅助控制器,控制伺服电机旋转以覆盖盲点区域。网络摄像头将连接到伺服电机。

硬件放置:
带有伺服电机和 Arduino Nano 的网络摄像头放置在车辆后部的顶部。Nvidia Jetson Nano 放置在车内的位置。

伺服电机将在 0 度处暂停 2 秒,在 180 度处暂停 2 秒,其他区域将以 5 毫秒的固定间隔移动。目的是只覆盖两侧的盲点区域。

Nvidia Jetson Nano 由 5V、2.1 A 移动电源供电。

硬件构建:
蜂鸣器连接到 Nvidia Jetson Nano 的 Pin12 和 Gnd 引脚。

网络摄像头连接到 USB 端口之一。本视频部分详细解释了硬件构建设置。

使用边缘脉冲的行人检测模型
让我们进入软件部分,这里我已经解释了有关我如何构建从数据集到部署的原型的详细步骤。

该过程可以分为以下步骤:

  • 将 Nvidia Jetson Nano 连接到 Edge Impulse 项目
  • 数据集 - 标记、拆分
  • 模型训练
  • 部署
  • 在本地运行

将 Nvidia Jetson Nano 连接到 Edge Impulse:
第一步,我们必须使用正确的 SD 卡映像启动 Nvidia Jetson Nano。

按照以下链接中提到的步骤闪存 SD 卡映像。

SD卡

正确启动后,将 Nvidia Jetson Nano 连接到 Wifi 或以太网,以安装一些依赖项。

打开终端并运行以下命令

运行需要几分钟时间。完成后,运行以下命令连接到您的边缘 Impulse 项目。

因此,首先我们需要在 Edge Impulse 中创建一个基础空项目。

转到下面的链接并使用您的电子邮件 ID 登录。

https://www.edgeimpulse.com/

创建新项目后,转到设备设置。

在 Nvidia Jetson Nano 终端窗口中运行以下命令。

数据集上传/标记:
转到数据采集设置并上传现有数据集;

Upload 以下链接中的数据集:

行人数据集

上传数据集后,转到标记队列并标记图像中行人的框边界。

添加标签为“行人”

数据集将包含各种各样的人,例如穿着不同服装、不同性别、不同种族并携带不同物体(如包、雨伞、手推车等)的人。

模型训练:
在参数配置设置中,将像素分辨率配置为320x320。

在神经网络设置中,训练参数将设置如下。

训练模型后,使用测试数据集检查准确性。

部署
要在本地运行您的冲动,只需再次连接到您的 Jetson,然后运行:

在本地运行
要在对象检测模型上添加应用程序,您必须按照以下步骤操作:

打开终端并运行以下命令。

注意:将用户名替换为您的 Nvidia Jetson 用户名。

然后你会得到这样的输出。

要在检测到行人时添加蜂鸣器声音,请将最下方应用程序代码复制并粘贴到classify.py 中。

伺服电机控制
对于伺服电机控制覆盖盲点区域,我使用了Arduino Nano。

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(5);                       // waits 15ms for the servo to reach the position
  }
  delay(2000);
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(5);                       // waits 15ms for the servo to reach the position
  }
  delay(2000);
}

本文中所用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

原文链接丨以上内容来源网络,如涉及侵权可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论