我们的 10n2 项目旨在通过使用 Sony Spresense 和人工智能识别不良驾驶习惯。年轻的司机可以而且确实在很小的时候就养成了很多不良习惯。不良习惯的范围从不正确的手部位置到在控制车辆时使用移动设备。国家安全委员会报告称,手机使用每年导致160 万起车祸!随着新司机的诞生,我们非常有兴趣在不良驾驶习惯养成习惯之前帮助他们消除这种习惯。
10n2 设备不仅会检测手机使用情况,还会检测手部位置不当、急转弯、短停快速加速和跳坑。所有这些都会导致危险的驾驶条件。当检测到违规行为时,司机会收到实时通知。
设备收集的信息用于在 Google 地球 KML 中生成报告,其中详细说明检测到的违规行为以及地理位置。收集违规行为,并在旅行的各个部分计算分数。司机可以回顾他们的行程并了解他们可以改进的地方。
10n2 是 3d 打印材料、DiY 电气元件、Sony Spresense 板和摄像头、经过 Edge Impulse 训练的 CNN 和一些使其全部工作的代码的组合。
10n2 坐骑
首先要做的是打印 10n2 安装。将model.stl加载到切片软件(如Cura )中,生成许多3d打印机使用的gcode。获得 gcode 后,将其加载到 3d 打印机上,打印大约需要 1 小时。在 Ender3 Pro 上!
现场准备
现在是时候按照索尼网站上的精彩文档准备 Sony Spresense 了。启动并运行 Spresense 并安装 Sony 相机板后,就可以将电池插座焊接到主板上了。
安装组件
下一步是安装 MPU 和按钮开关。10n2 安装座具有 MPU 和按钮的安装座。MPU 使用 M3 螺丝固定,按钮使用 Velcro 直接安装到 10n2 安装座。
电线组件
现在组件已安装,您可以按照下面的接线图连接 MPU 和按钮。可以通过在相机带状电缆下方布设电线来实现电线管理。这样可以让电线远离您,并有助于 GPS 信号。
收尾工作
设备全部连接好后,我们现在可以安装电池外壳和 Velcro(用于将 10n2 设备安装到车顶)。电池外壳粘在相机支架的底部。这有两个目的;1) 固定电池 (duh) 和 2) 为相机捕捉图像和执行实时分类提供正确的角度。您还可以安装轻型 3.5 毫米。杰克扬声器作为这一点。
恭喜!你现在对硬件不满意了。
GitHub 上提供了所有 10n2 软件。要加载软件,建议您遵循 Spresense SDK 设置,克隆存储库并使用 VSCode 将软件直接安装到设备。
IDE准备
按照Sony Spresense IDE 指南为您的环境安装和配置软件。
10n2 准备和构建
现在您已经准备好一个 IDE,是时候克隆 10n2 存储库了。将存储库克隆到新的 VSCode 项目。10n2 存储库有一个 10n2 sdk.config ,其中包含运行 10n2 软件所需的所有 nuttx/spresense 配置。通过微型 USB 将您的 Spresense 设备连接到您的计算机,并确保它被 VSCode 识别。现在,您可以通过左键单击您的 VSCode 项目并选择Spresense:Build and Flash 来刷新您的设备。
如果一切顺利,没有任何问题,您应该可以使用 10n2 设备了!
挂载 10n2
10n2需要倒置安装在驾驶员头部后方约 12 英寸处,并在车门之间居中,向下倾斜约 15 度(由电池支架提供)。
10n2 设备使用Edge Impulse在 10n2 的核心设计模型和训练 CNN。该模型是一个简单的 3 类(手/无手/细胞)2D 量化卷积模型。由于 Sony Spresense 的内存/计算限制,我们决定使用简单的 CNN。量化是必不可少的,因为它使模型达到可管理的大小。Edge Impulse 具有易于使用的量化模型方法,以及有关如何在目标硬件上使用量化模型的详细说明。
如您所见,该模型训练得相对较好并且表现出奇的好。
数据
该模型是在 96x96 位图像灰度 8 位图像上训练的。我们选择 96x96 是因为它刚好足以覆盖视野中的方向盘,又小到足以为我们的目标平台制作大小合适的模型,而 96x96 是许多流行的预训练模型中的常见尺寸。
数据采集
数据直接从 Spresense 和 Sony Camera 开发板收集*。对于我们的 96x96 下采样,我们使用相机 x 坐标中 192-288 的像素和相机 y 坐标中 12-108 的像素。它位于相机的右上象限,即覆盖方向盘和手部位置的象限。
* 所有数据均在 2007 年本田 CRV 中收集
安装 EI 模型
一旦你有了一个你喜欢的模型,你就可以使用很棒的 Edge Impulse 网站来构建一个可部署的模型。10n2项目采用C++模型部署方式。
获得 C++ 模型部署 zip 后,您需要做的就是将以下文件提取到 10n2 存储库中的等效文件:
model_metadata.h
tflite-resolver.h
tflite-trained.h //model weights
任何项目中我最喜欢的部分是代码!完整的 10n2 代码可通过 GitHub 获得。本节将突出显示导入部件。首先,SMP是必需的,因为 10n2 对 Spresense 的要求很高。SMP 允许异步使用所有 6 个内核。10n2 将一个完整的核心专用于 TensorFlow 推理引擎,并将剩余的核心分配给相机捕捉、数据收集和 KML 生成等功能。
SMP 示例
您会注意到在使用 SMP 时设置 CPU 亲和性很重要。这告诉调度程序哪个 CPU 运行 p 线程。
bool imu_init(void)
{
printf("imu init\n");
imu_running = true;
cpu_set_t cpuset = 1 << 2;
pthread_create(&imu_th_consumer, NULL, &_imu_q_read, NULL);
int rc;
rc = pthread_setaffinity_np(imu_th_consumer, sizeof(cpu_set_t), &cpuset);
if (rc != 0)
{
printf("Unable set CPU affinity : %d", rc);
}
return true;
}
Edge Impulse 模型推理
EI生成的TFLM模型是量化的。必须对输入和输出进行量化和反量化以获得有意义的结果。
量化
int8_t quantize(uint8_t pixel_grayscale)
{
// ITU-R 601-2 luma transform
// see: https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.convert
int32_t gray = (iRedToGray * pixel_grayscale) + (iGreenToGray * pixel_grayscale) + (iBlueToGray * pixel_grayscale);
gray >>= 16; // scale down to int8_t
gray += EI_CLASSIFIER_TFLITE_INPUT_ZEROPOINT;
if (gray < -128)
gray = -128;
else if (gray > 127)
gray = 127;
return static_cast8_t>(gray);
}
反量化
for (int k = 0; k < NUM_CLASSES; k++)
{
//dequantized output
conf = (od[k] - EI_CLASSIFIER_TFLITE_OUTPUT_ZEROPOINT) * EI_CLASSIFIER_TFLITE_OUTPUT_SCALE;
}
急转弯、加速和减速都是根据 MPU 收集的数据计算得出的。MPU 安装在 10n2 的一侧,Z 轴朝上,Y 轴沿车辆的加速度轴,Z 轴垂直于 X 和 Y。
加速/减速
通过确定 Y 样本在 100 Hz 的 moving.35 秒窗口上的斜率来计算加速度和减速度。样品。如果坡度高于阈值,则认为车辆加速过快。如果坡度低于阈值 (± 500),则认为车辆减速过快。
急转弯
转弯的计算方式与加速度相同,但使用来自 MPU 的 X 加速度并使用小得多的斜率阈值 (+- 250)。
坑洞
通过对沿 Z 轴的加速度使用标准偏差阈值来识别坑洞。如果标准偏差 > 1800,那么我们认为这是一个底池持有。
10n2 记录原始传感器数据以及 csv 中的计算数据。当 10n2 处于“训练”模式时,也会收集图像数据。CSV 数据以以下 CSV 格式存储:
t slopex slopey slopez inf conf acx acy acz gyx gyy gyz y M d h m s us type lat lon
23915 -98 55.299999 -27 0 0.53125 4225 -210 644 205 -129 -54 2022 8 3 23 42 23 586585 1 39.513708 -104.764668
24016 17.1 44.599998 -15.6 2 0.589843 4949 -4 641 -71 -75 20 2022 8 3 23 42 24 817926 1 39.513708 -104.764668
24117 -11.2 -31.700001 -6.1 1 0.46875 4870 -99 713 -53 -196 32 2022 8 3 23 42 25 433078 1 39.513708 -104.764668
24218 -67.400002 -35.200001 -7.1 0 0.953125 4969 10 685 -60 -104 -2 2022 8 3 23 42 26 648016 1 39.513708 -104.764668
24321 -12.1 7.8 6.6 1 0.734375 5005 -44 704 -60 -120 15 2022 8 3 23 42 27 890861 1 39.513708 -104.764668
如果你做到了这一点,谢谢。我们在开发我们认为有用的产品方面度过了愉快的时光。我们欢迎所有评论和问题,希望您喜欢 10n2。要查看更多信息,请在线访问我们。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !