#neuromorphic #usb #data #driver #shared-data #devices #framework

neuromorphic-types

为驱动程序和数据处理框架共享神经形态数据类型

4个版本 (重大更改)

0.4.0 2023年7月2日
0.3.0 2023年6月26日
0.2.0 2023年6月11日
0.1.1 2023年5月7日
0.1.0 2023年5月7日

#1301硬件支持

每月48次 下载
neuromorphic-drivers 中使用

自定义许可证

9KB
62

neuromorphic_drivers 是一个用于与USB神经形态设备交互的库。驱动程序是从头开始编写的,考虑了可移植性和性能。

支持的设备和功能

名称 类型 分辨率 数据类型 掩码 同步 速率限制器
Prophesee EVK4 摄像头 1280 × 720 DVS, 触发
Prophesee EVK3 HD 摄像头 1280 × 720 DVS, 触发 -

此表列出了此库支持的功能。某些传感器支持尚未添加到 neuromorphic_drivers 的未列出的功能或标记为 "no" 的功能。

名称 链接
Prophesee EVK4 https://www.prophesee.ai/event-camera-evk4/
Prophesee EVK3 HD https://www.prophesee.ai/event-based-evk-3/

Python

入门指南

python3-m pip install neuromorphic_drivers

import neuromorphic_drivers as nd

nd.print_device_list()

with nd.open() as device:
    for status, packet in device:
        # packet = {"dvs_events": np.array([...])}

status 包含

示例

请参阅 python/tests 以获取不同的使用示例。 python/tests/display.py 实现了一个使用GPU计算的指数衰减的实时事件查看器。它需要 vispy 和 glfw (python3 -m pip install vispy glfw)。

性能考虑

近期的一些基于事件摄像机的产品,如Prophesee EVK4,在某些情况下可以生成比实时处理更多的数据。虽然数据总是可以实时移动到计算机的内存中,但在数据速率高峰期间,最简单的算法(包括将原始USB字节转换为{t, x, y, 极性}事件表示)难以跟上。这个库使用单独的线程进行读取(USB到内存)和处理(内存到内存或磁盘),在接口处使用环形缓冲区(ring)。短数据突发可以无缝地被环形缓冲区吸收,通常不会引起问题,尽管它们会暂时增加延迟。然而,持续的高数据速率会使环形缓冲区逐渐填满,并最终导致程序崩溃。根据使用情况,可以应用以下解决方案之一

  • 降低相机的灵敏度(通常通过调整diff_offdiff_on
  • 如果传感器支持,启用事件速率限制器(限制器会在传感器侧随机丢弃事件,减少带宽问题,但会显著降低瞬态突发的质量)
  • 通过屏蔽行和列来降低相机的空间分辨率
  • 如果可能,更改环境(避免闪烁的灯光,减少光学流,去除背景杂乱,将大而快的物体移出视野)
  • backlog太大时(最大backlog是环形缓冲区大小减去传输队列大小),调用device.clear_backlog(until=0)以清除后台日志
  • 使用nd.open(raw=true)跳过解析器,直接访问USB字节,通常用于将其保存到文件

(高级) 直接内存访问

这个库依赖于libusb进行所有的USB通信。libusb支持直接内存访问(目前仅限于Linux,未来可能会添加其他平台),这允许USB控制器直接将数据包写入内存,而无需CPU(和操作系统内核)的干预。虽然这可以提高性能并减少CPU的使用,但DMA有一些需要注意的问题,我们默认禁用了它。当用户了解其USB控制器及其限制时,他们可能想要启用它以在嵌入式系统中提高性能。

USB驱动程序有有限数量的DMA文件对象(128/256/512/1024)。这通常不足以容纳事件突发(我们默认使用4096个缓冲区用于EVK4,每个缓冲区131072字节)。如果所有DMA缓冲区都被使用,代码将回退到非DMA缓冲区(例如,前128个缓冲区将是DMA,其余将是非DMA),这可能会导致性能随时间变化。

使用所有可用的DMA缓冲区可能会导致其他USB传输失败(包括配置传感器的控制传输)。

因此,使用DMA需要以下解决方案之一

  • 使用少量DMA缓冲区,在处理之前将数据包复制到更大的环形缓冲区中(这在一定程度上违背了DMA的目的,并增加了内存复制)。
  • 使用更大的缓冲区(大约1MB)来增加环形缓冲区的大小,而不增加缓冲区数量,这将以增加延迟为代价。
  • 确保处理始终能够跟上数据速率(稀疏场景/低灵敏度偏差/事件速率限制器/简单处理)。请注意,在数据高峰期间,简单地将向量化的EVT3事件扩展到13字节的DVS事件并不是实时处理。
cargo publish
cd python
python3 -m venv .venv
source .venv/bin/activate
pip install maturin
maturin develop
cd drivers
cargo test --release read -- --nocapture

/etc/udev/rules.d/65-neuromorphic-drivers.rules

SUBSYSTEM=="usb", ATTRS{idVendor}=="152a",ATTRS{idProduct}=="84[0-1]?", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="04b4",ATTRS{idProduct}=="00f[4-5]", MODE="0666"

sudo udevadm control --reload-rules sudo udevadm trigger

没有运行时依赖