在这篇文章中,我想分享我自己为骑自行车的人开发智能相机的经验,它具有先进的计算机视觉算法,可以检测道路上的潜在危险并防止碰撞。我在下面简要描述了从头开始制作原型和视频数据收集的整个过程。对于嵌入式和机器学习工程师来说,这可能都很有趣。在我们开始之前先剧透一下:后来收集的数据集是开源的。
我是一名狂热的自行车手,拥有 30 年的经验,其中 20 年是在公共道路上骑行。有一次在路上出了车祸:一辆汽车从侧面碾过我的自行车。幸运的是,我受了点瘀伤和扭伤,逃过一劫。所以,我特别理解骑车人在公共道路上的安全问题。
该问题的解决方案之一是使用自行车摄像头捕捉事件。正如我们所知,在路上骑自行车时,如果配备了可以捕捉您视角的摄像头,就会变得更加安全。在与司机的争吵中,有镜头可以作为额外的保护层。在没有证据的情况下,不道德的司机可能会否认责任,但在这种情况下,为骑车人配备摄像头可以成为救命稻草。在英国,甚至有一个名为 Nextbase 的网站可以帮助向警方提交运动相机镜头,简化流程并减少并发症。
换句话说,你可以在相机上捕捉到事故,但你必须承认,避免危险情况总是更好。当我开始这个项目时,没有预防道路危险情况的主动解决方案。所以我决定用相机制作我的智能自行车背光灯。该项目的任务是减少骑自行车者的伤亡。
最初,该设备计划设置一种先进的计算机视觉算法,通常被媒体称为“人工智能”,可以为骑车人检测道路上的潜在危险。让我用简单的话来解释一下这个概念:如果软件检测到危险,设备就会发出闪光以引起司机的注意。此外,安全系统会在碰撞发生前向后方车辆发出响亮的声音,以帮助防止发生碰撞。
为了训练我的目标检测神经网络(计算机视觉算法的一部分,用于感知),我需要从后视摄像头捕获的公共道路中找到不同场景的大型数据集。不幸的是,当我开始时,网络上还没有这样的开源数据集。
总体而言,驾驶行为研究在交通工程中非常有用,可用于各种目的,例如用于统计分析的数据收集、驾驶模型的识别和建模参数的估计。这些数据和模型可应用于多个领域,包括道路安全分析、交通模拟、预测和控制的微观模型,以及高级驾驶辅助系统的控制逻辑。
继续前进,应该说,在处理这个项目时,我已经创建了 2021 年第一批 MVP 用户的后视摄像头拍摄的乌克兰公共道路的数据集。\
完全理解在公共领域拥有此类数据集的公共和社会重要性,我已将我的工作结果上传到此处。
为了教授神经网络预测事故,我必须收集大量数据。对于这种情况,我需要开发相机原型,以提供给我的第一批 Beta 测试人员来记录他们的骑行。幸运的是,我的自行车社区网络包括很多安全道路活动家。剩下要做的唯一一件事就是组装一些设备并将它们交给我的第一批用户。
下面我简单描述一下开发过程,并说明选择具体技术方案的逻辑。
硬件配置:外壳是3D打印的。选择 Raspberry Pi 3B+ 计算机模块作为平台,并制作了定制 PCB 以保持外壳紧凑和轻便。
我为相机使用了标准的 Raspberry Pi IMX219 传感器,但我使用了 120 度镜头。添加了高功率 LED 灯和红色镜片(也是 3D 打印的),以提高道路可见度。
我使用了 Google Coral Edge TPU(包括照片),这是一种低成本且功能强大的 4 TOPs 神经加速器,用于在设备上运行神经网络。 TPU 通过 USB 连接。 \
所有这些电子设备在最大负载(视频录制、实时神经网络操作和 LED 闪烁)下消耗 7-8W。使用 8Ah 锂离子电池(包括外壳内部照片)以确保运行 4-5 小时。
对于操作系统,我使用了标准的 Raspbian,因为它得到了更好的支持,而且我需要的所有驱动程序都可以轻松安装,没有任何问题。我决定在启动操作系统后编写的主要代码是用 C++ 编写的。
我不建议从这个开始 - 出于实验目的,我相信 Python 可能是初学者更好的选择。但是,如果您想以最大的硬件能力有效且精确地控制 Raspberry Pi 上的所有有限资源,则值得使用 C/C++ 编写。
我在这个项目中做出的最有趣的解决方案之一是 OTA(无线更新)机制和从设备收集视频记录的机制。
这个过程是这样的:当用户完成乘车回家时,他们插入一个 USB WiFi 适配器,连接到家庭 Wi-Fi,设备开始同步。
所有视频都通过 Google Drive 同步——我为每台设备创建了一个单独的 Google 帐户。 Google Drive 在我的案例中有很多优势:我能够通过 Google Drive 网络界面即时观看视频,手动删除或添加新文件很容易,最后但并非最不重要的一点是,它对我的实验是免费的(每个帐户最多 20GB)。 (谷歌,拜托,不要作恶,在我刚刚成立的初创公司只有四个 MVP)。
使用 H.264 视频编码有助于将数百个视频保存在一个 Google Drive 上,而不会耗尽容量。
让我描述一下 OTA 过程:编译新固件后,我将其上传到 Google 驱动器。下次与 Google Drive 同步时,设备会下载较新的固件版本并替换旧版本。
我为此使用了一个简单的 gdrive 实用程序。这是我用来上传新固件文件的代码:
gdrive upload -p “gdrive folder id” “file”
下面我给出了一行用于在设备上加载新固件的代码:
gdrive update “id” “file”
检查固件版本后,视频同步发生,所有新记录上传到 Google Drive。
这是视频从设备下载到磁盘的方式:
gdrive sync upload “local folder” “gdrive folder id”
每天一次,我在我的服务器上运行一个脚本,将所有 Google 云端硬盘与我的本地文件夹同步,并下载所有新视频。
gdrive sync download “gdrive folder id” “local folder”
因此,经过几个月的工作,我的设备已经收集了 200 多个视频以供标记。
收集视频后,我对其进行了处理、过滤并创建了数据集。然后我召集了一个小团队进行手动标记。该团队包括 4 个人,他们为每张照片都贴上了标签。
最终,如前所述,我将数据集开源。您可以通过以下链接找到它: GitHub 链接。
我确实相信开源数据集是研究界的宝贵资源,它们可以为道路安全领域新算法和模型的开发做出巨大贡献。