Обзор reComputer Industrial R2135-12 — безвентиляционный промышленный Edge AI ПК на базе Raspberry Pi CM5 с AI-акселератором Hailo-8

В данном обзоре рассматривается reComputer AI Industrial R2135-12 от Seeed Studio. Это промышленный граничный компьютер, построенный на платформе Raspberry Pi Compute Module 5. Данная модель сконфигурирована с 8 ГБ памяти LPDDR4 и 32 ГБ встроенной памяти eMMC. Устройство предлагает широкий набор вариантов ввода-вывода, включая два порта Gigabit Ethernet, USB 3.0/USB 2.0, выход HDMI, а также промышленные интерфейсы, такие как RS-485/RS-232, CAN и GPIO, вместе с поддержкой Wi-Fi и Bluetooth и широким диапазоном входного напряжения постоянного тока, подходящим для промышленных условий.

The reComputer AI Industrial R2135-12.
reComputer AI Industrial R2135-12.

В дополнение к стандартной проверке и тестированию устройства, также будет представлено практическое демонстрационное приложение, в котором система запускает модель искусственного интеллекта для детектирования людей в реальном времени с USB-камеры, а затем отправляет результаты обнаружения на внешний микроконтроллер ESP32 для управления светодиодными матрицами с целью визуального выделения местоположения обнаруженных людей. Для быстрой демонстрации производительности системы искусственного интеллекта модели reComputer R2135-12 было снято следующее видео на YouTube. Продолжайте чтение, чтобы узнать, как это было реализовано.

https://youtube.com/watch?v=DQbAvu3xZys

Для этого обзора система была оставлена близко к заводскому состоянию. Помимо установки базовых инструментов тестирования, таких как inxi, sbc-bench и Geekbench, использовалось только предустановленное программное обеспечение, без обновлений системы или установки дополнительных пакетов, чтобы оценить готовность устройства к работе прямо из коробки.

Распаковка reComputer Industrial R2135-12

Посылка была отправлена из Китая в Таиланд и прибыла примерно через 10 дней в прочной картонной коробке, содержимое которой было хорошо защищено с помощью коричневой измельченной бумаги в качестве наполнителя. Внутри коробки все компоненты были аккуратно упакованы и надежно зафиксированы, что предотвратило любое заметное перемещение во время транспортировки. Ниже приведен полный список полученных компонентов.

  • reComputer Industrial R2135-12
  • Крепежные кронштейны
  • Винты для кронштейнов
  • Клипса для DIN-рейки
  • Адаптер с гнездового разъема питания постоянного тока на клеммную колодку с винтовыми зажимами
  • Адаптер питания 12В/3А (с 4 сменными вилками адаптера)
  • Клеммный разъем на 15*2 пина (папа)
  • Резисторы 120 Ом
  • Антенна Wi-Fi/BLE
  • Руководство пользователя (не на фото)
The reComputer Industrial R2135-12 packaging.
Упаковка reComputer Industrial R2135-12.
Recevied components.
Полученные компоненты.

Первая настройка и использование

Устройство весит около 1,3 кг, и при первом поднятии оно показалось немного тяжелее, чем ожидалось. Основной корпус выполнен из алюминия, который служит одновременно прочным защитным кожухом и пассивным радиатором. На нижней панели наклейка идентифицирует устройство как reComputer Industrial R2135-12.

Label at the bottom panel.
Наклейка на нижней панели.
The reComputer naming convention.
Соглашение об именовании reComputer.

На основе соглашения об именовании, описанного в официальной документации , это подтверждает, что полученное устройство построено на базе Raspberry Pi Compute Module 5, оснащено 8 ГБ оперативной памяти и 32 ГБ встроенной памяти eMMC. Оно также включает поддержку беспроводных сетей и встроенный AI-акселератор Hailo-8.

Разборка

Устройство было разобрано для осмотра внутренних компонентов путем откручивания четырех винтов на нижней панели, что позволило снять боковые панели. Затем была аккуратно приподнята верхняя панель для осмотра внутренностей. Однако антенна Wi-Fi была прочно прикреплена к панели, а между нижней панелью и некоторыми компонентами на основной плате, по-видимому, был нанесен термоинтерфейс. Чтобы не нарушать эти соединения, все было оставлено как есть, как показано на изображениях ниже.

Removing side panel.
Снятие боковой панели.
Removing the panel on the opposite side.
Снятие панели с противоположной стороны.
From left to right, reset button, HDMI connectors, and 2x15 terminal block.
Слева направо: кнопка сброса, разъемы HDMI и 2×15 клеммная колодка.
From left to right, grounding points, power terminal block, LEDs, reset switch, USB-C, Nano SIM, and Ethernet ports.
Слева направо: точки заземления, клеммная колодка питания, светодиоды, переключатель сброса, USB-C, слот для Nano SIM и порты Ethernet.

В целом, внутренняя компоновка выглядит хорошо организованной, все ключевые компоненты надежно установлены. За исключением небольшого количества излишков силиконового клея вокруг нескольких конденсаторов, сборка выглядит чистой и прочной.

Top view.
Вид сверху.

Включение устройства

Согласно руководству пользователя, устройство поддерживает два варианта подачи питания: вход через клеммную колодку постоянного тока (9–36 В постоянного тока) и порт PoE мощностью 30 Вт. Вход через клеммную колодку постоянного тока рекомендуется при питании требовательных периферийных устройств или нескольких внешних устройств. Для данного обзора устройство было запитано с помощью предоставленной 2-пиновой клеммной колодки, подключенной к входящему в комплект адаптеру питания 12В/3А, как показано на изображении ниже. Устройство не имеет физической кнопки питания и автоматически запускается сразу после подачи питания, поэтому его всегда следует правильно выключать через операционную систему.

Powering the device via the 2-pin terminal block connector.
Подача питания на устройство через 2-пиновый клеммный разъем.

Полученное устройство поставляется с предустановленным готовым к использованию образом системы Raspberry Pi OS, что позволяет использовать его прямо из коробки. На изображениях ниже показан рабочий стол операционной системы по умолчанию и вывод htop, отображающий некоторые процессы, запущенные по умолчанию.

Default desktop.
Рабочий стол по умолчанию.
Checking running processes with htop.
Проверка запущенных процессов с помощью htop.

Согласно документации, пользователи могут перепрошить образ системы, используя официальные файлы образов, предоставленные на официальном GitHub , выбрав опцию reComputer-R2x-arm64 . Подробные пошаговые инструкции по использованию rpiboot вместе с Raspberry Pi Imager для перепрошивки системы доступны в руководстве пользователя. Пользователи также могут установить Ubuntu на reComputer Industrial R2135-12, следуя официальному руководству по установке Ubuntu на Raspberry Pi для записи загруженного образа. Подробные шаги по установке для reComputer также приведены в руководстве пользователя.

Проверка стандартных функций с помощью командной строки

Руководство пользователя включает несколько инструкций для тестирования через командную строку, таких как запрос состояния выводов GPIO, сканирование сетей Wi-Fi и переключение пользовательского светодиода. Была запущена подборка этих команд, и все они работали как ожидалось. Вывод ниже показывает результат запроса соответствия выводов GPIO.

cat /sys/kernel/debug/gpio
...
gpiochip0: GPIOs 569-622, parent: platform/1f000d0000.gpio, pinctrl-rp1:
 gpio-569 (ID_SDA              |spi2 CS0            ) out hi ACTIVE LOW
 gpio-570 (ID_SCL              )
 gpio-571 (GPIO2               )
 gpio-572 (GPIO3               )
 gpio-573 (GPIO4               |spi3 CS0            ) out hi ACTIVE LOW
 gpio-574 (GPIO5               )
 gpio-575 (GPIO6               )
 gpio-576 (GPIO7               )
 gpio-577 (GPIO8               )
 gpio-578 (GPIO9               |sysfs               ) in  hi 
 gpio-579 (GPIO10              )
 gpio-580 (GPIO11              )
 gpio-581 (GPIO12              )
 gpio-582 (GPIO13              )
 gpio-583 (GPIO14              )
 gpio-584 (GPIO15              )
 gpio-585 (GPIO16              )
 gpio-586 (GPIO17              )
 gpio-587 (GPIO18              )
 gpio-588 (GPIO19              )
 gpio-589 (GPIO20              )
 gpio-590 (GPIO21              )
 gpio-591 (GPIO22              )
 gpio-592 (GPIO23              )
 gpio-593 (GPIO24              |spi2 CS1            ) out hi ACTIVE LOW
 gpio-594 (GPIO25              |spi3 CS1            ) out hi ACTIVE LOW
 gpio-595 (GPIO26              )
 gpio-596 (GPIO27              )
...

Далее был протестирован пользовательский RGB-светодиод, установив фиолетовый цвет, что было достигнуто включением красного и зеленого светодиодов с помощью следующей команды.

Testing user LED.

Тестирование пользовательского светодиода.

ls /sys/class/leds/
recomputer@reComputer-R2x:/sys/class/leds $ ls
ACT         input21::capslock  input21::kana     input21::scrolllock  led-green  mmc0    mmc1::
default-on  input21::compose   input21::numlock  led-blue             led-red    mmc0::  PWR
echo 1 > /sys/class/leds/led-red//brightness 
echo 1 > /sys/class/leds/led-blue/brightness

Сканирование Wi-Fi также работало как ожидалось.

recomputer@reComputer-R2x:~ $ sudo iwlist wlan0 scan
wlan0     Scan completed :
          Cell 01 - Address: 9C:63:5B:CD:36:ED
                    Channel:157
                    Frequency:5.785 GHz
                    Quality=37/70  Signal level=-73 dBm  
                    Encryption key:on
                    ESSID:"JUDA_TP_5GHz"
                    Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
                              36 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
                    ...
          Cell 02 - Address: 9C:63:5B:FD:36:EC
                    Channel:9
                    Frequency:2.452 GHz (Channel 9)
                    Quality=51/70  Signal level=-59 dBm  
                    Encryption key:on
                    ESSID:"JUDA_TP"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 9 Mb/s
                              18 Mb/s; 36 Mb/s; 54 Mb/s
                    Bit Rates:6 Mb/s; 12 Mb/s; 24 Mb/s; 48 Mb/s
                    Mode:Master
                    ...
          Cell 03 - Address: 9E:63:5B:FD:36:ED
                    Channel:157
                    Frequency:5.785 GHz
                    Quality=36/70  Signal level=-74 dBm  
                    Encryption key:on
                    ESSID:""
                    Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
                              36 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
                    ...

Результаты сканирования Bluetooth показаны ниже.

sudo bluetoothctl
scan on
[bluetooth]# scan on
Discovery started
[CHG] Controller 88:A2:9E:31:39:96 Discovering: yes
[NEW] Device 8C:DF:2C:AA:BF:CA vivo Y27 5G
[CHG] Device 8C:DF:2C:AA:BF:CA RSSI: -51

Последний тест в этом разделе сосредоточен на проверке функциональности цифрового выхода (DO). Это было сделано простым измерением напряжения на выводе GPIO638 (DO1) с помощью мультиметра, которое корректно переключалось между 0 В и приблизительно 1 В при изменении уровня вывода между низким и высоким с использованием следующих инструкций в командной строке.

echo 638 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio638/direction
echo 1 > /sys/class/gpio/gpio638/value
echo 0 > /sys/class/gpio/gpio638/value

Информация о системе

Далее была установлена и запущена утилита командной строки inxi для проверки базовой информации о системе, вывод показан ниже.

recomputer@reComputer-R2x:~ $ inxi -F
System:
  Host: reComputer-R2x Kernel: 6.12.34+rpt-rpi-2712 arch: aarch64 bits: 64
    Desktop: LabWC Distro: Debian GNU/Linux 12 (bookworm)
Machine:
  Type: ARM System: Raspberry Pi Compute Module 5 Rev 1.0 details: N/A
    rev: d04180 serial: d2f02181ab20c2b1
CPU:
  Info: quad core model: N/A variant: cortex-a76 bits: 64 type: MCP cache:
    L2: 2 MiB
  Speed (MHz): avg: 2400 min/max: 1500/2400 cores: 1: 2400 2: 2400 3: 2400
    4: 2400
Graphics:
  Device-1: bcm2712-hdmi0 driver: vc4_hdmi v: N/A
  Device-2: bcm2712-hdmi1 driver: vc4_hdmi v: N/A
  Display: wayland server: X.org v: 1.21.1.7 with: Xwayland v: 22.1.9
    compositor: LabWC driver:
    gpu: vc4-drm,vc4_crtc,vc4_dpi,vc4_dsi,vc4_firmware_kms,vc4_hdmi,vc4_hvs,vc4_txp,vc4_v3d,vc4_vec
    resolution: 1920x1080~60Hz
  API: OpenGL v: 3.1 Mesa 24.2.8-1~bpo12+rpt3 renderer: V3D 7.1.10.2
Audio:
  Device-1: bcm2712-hdmi0 driver: vc4_hdmi
  Device-2: bcm2712-hdmi1 driver: vc4_hdmi
  API: ALSA v: k6.12.34+rpt-rpi-2712 status: kernel-api
  Server-1: PipeWire v: 1.2.7 status: active
Network:
  Device-1: Raspberry Pi RP1 PCIe 2.0 South Bridge driver: rp1
  IF: wlan0 state: down mac: 88:a2:9e:31:39:95
  Device-2: Microchip (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter
    type: USB driver: smsc95xx
  IF: eth1 state: down mac: 2c:f7:f1:22:ee:3d
  IF-ID-1: can0 state: down mac: N/A
  IF-ID-2: can1 state: down mac: N/A
  IF-ID-3: eth0 state: up speed: 1000 Mbps duplex: full
    mac: 88:a2:9e:31:39:94
Bluetooth:
  Device-1: bcm7271-uart driver: bcm7271_uart
  Report: hciconfig ID: hci0 state: up address: 88:A2:9E:31:39:96 bt-v: 3.0
Drives:
  Local Storage: total: 29.12 GiB used: 7.8 GiB (26.8%)
  ID-1: /dev/mmcblk0 type: Removable vendor: Samsung model: BJTD4R
    size: 29.12 GiB
Partition:
  ID-1: / size: 28.08 GiB used: 7.72 GiB (27.5%) fs: ext4 dev: /dev/mmcblk0p2
Swap:
  ID-1: swap-1 type: file size: 512 MiB used: 0 KiB (0.0%) file: /var/swap
Sensors:
  System Temperatures: cpu: 47.9 C mobo: N/A
  Fan Speeds (RPM): N/A
Info:
  Processes: 270 Uptime: 11m Memory: 7.88 GiB used: 2.21 GiB (28.1%)
  gpu: 8 MiB Shell: Bash inxi: 3.3.26

Отчет подтверждает, что система основана на Raspberry Pi Compute Module 5 Rev 1.0, работает под управлением Debian GNU/Linux 12 (bookworm) с ядром 6.12.34+rpt-rpi-2712 на 64-битной архитектуре ARM (aarch64). Четырехъядерный процессор Cortex-A76 работает на частоте до 2,4 ГГц, с масштабированием между 1,5 и 2,4 ГГц, и все четыре ядра работали на максимальной частоте на момент отчета. Система включает 7,88 ГБ оперативной памяти, из которых примерно 23–28% использовалось вскоре после загрузки, и 29,12 ГБ локального хранилища, из которых около 27% уже было занято. Температура процессора около 47–48 °C свидетельствует о стабильном тепловом поведении при небольшой нагрузке.

Со стороны графики устройство использует графический процессор Broadcom BCM2712 (VC4/V3D) с Mesa 24.2.8, поддерживающий OpenGL 3.1 и выводящий изображение на дисплей 1920 × 1080 @ 60 Гц через HDMI. Рабочий стол работает в среде Wayland (LabWC) с включенным Xwayland. Для сетевого взаимодействия во время теста был активен интерфейс Gigabit Ethernet (eth0), в то время как дополнительные интерфейсы Ethernet, Wi-Fi, CAN и Bluetooth присутствовали, но были неактивны на тот момент. Аудиовыход осуществляется через HDMI с использованием ALSA, а в фоновом режиме работает PipeWire.

В целом, эти заявленные аппаратные и программные детали соответствуют рекламируемым характеристикам reComputer Industrial R2135-12, включая платформу Compute Module 5, четырехъядерный процессор Cortex-A76 и конфигурацию с 8 ГБ памяти.

Тестирование производительности

SBC-Bench

Далее была установлена и запущена утилита sbc-bench , которая успешно завершилась, пройдя все проверки. Результаты показали отсутствие троттлинга процессора или подкачки (swapping), стабильные тактовые частоты, достигающие заявленного максимума, и приемлемую фоновую активность на протяжении всего теста.

Производительность памяти была стабильной на всех ядрах Cortex-A76: пропускная способность memcpy составила около 5,1 ГБ/с, а memset — около 8,5 ГБ/с. Задержка памяти оставалась очень низкой в пределах диапазонов кэша (примерно 1,7 нс) и плавно увеличивалась по мере роста размера буфера, достигая примерно 120–135 нс для очень больших буферов.

...
Memory performance (all 8 CPU clusters measured individually):
memcpy: 5149.2 MB/s (Cortex-A76)
memset: 8584.0 MB/s (Cortex-A76)
memcpy: 5148.8 MB/s (Cortex-A76)
memset: 8577.6 MB/s (Cortex-A76)
memcpy: 5143.4 MB/s (Cortex-A76)
memset: 8584.4 MB/s (Cortex-A76)
memcpy: 5145.6 MB/s (Cortex-A76)
memset: 8585.5 MB/s (Cortex-A76)
memcpy: 5154.8 MB/s (Cortex-A76)
memset: 8585.6 MB/s (Cortex-A76)
memcpy: 5133.8 MB/s (Cortex-A76)
memset: 8577.9 MB/s (Cortex-A76)
memcpy: 5149.0 MB/s (Cortex-A76)
memset: 8576.4 MB/s (Cortex-A76)
memcpy: 5149.6 MB/s (Cortex-A76)
memset: 8590.0 MB/s (Cortex-A76)
...
        32k: 1.691 1.690 1.690 1.690 1.690 1.691 1.692 3.296 
        64k: 1.701 1.697 1.701 1.697 1.700 1.700 1.702 3.303 
       128k: 5.072 5.071 5.071 5.073 5.071 5.769 7.212 12.81 
       256k: 5.426 5.259 5.251 5.216 5.251 5.837 7.288 12.82 
       512k: 7.258 7.734 7.469 7.737 7.159 8.220 9.185 15.00 
      1024k: 17.89 17.10 17.78 17.10 17.68 17.87 20.00 29.25 
      2048k: 19.21 18.72 18.64 18.72 18.74 19.88 23.22 31.64 
      4096k: 76.75 78.28 77.24 78.45 76.25 89.41 120.7 159.3 
      8192k: 119.0 102.7 104.4 103.1 102.8 109.7 142.4 193.9 
     16384k: 113.6 112.0 113.4 112.9 112.9 118.7 143.9 162.7 
     32768k: 126.9 123.9 125.8 123.5 125.4 126.6 131.4 141.6 
     65536k: 129.4 126.8 128.7 126.7 128.7 127.8 130.5 133.9 
    131072k: 129.8 128.5 129.6 128.5 129.6 128.5 129.8 132.5 
...

Что касается вычислительных нагрузок, тест 7-Zip сообщает о многопоточных общих оценках примерно в 11 100 по повторным запускам и об одноядерной оценке около 3 121, что демонстрирует стабильную и повторяемую производительность сжатия и распаковки.

...
7-zip total scores (3 consecutive runs): 11110,11136,11131, single-threaded: 3121
...

В криптографических тестах результаты OpenSSL являются высокими и стабильными на всех ядрах: пропускная способность AES-128-CBC близка к 1,88 ГБ/с, AES-192-CBC — около 1,57 ГБ/с, а AES-256-CBC — приблизительно 1,35 ГБ/с при больших размерах блоков. В целом, результаты sbc_bench_2_c.txt представляют собой последовательный и проверенный профиль производительности, выделяя стабильное поведение процессора, надежную пропускную способность памяти, предсказуемое масштабирование задержки, а также надежную целочисленную и криптографическую производительность.

...
OpenSSL results (all 8 CPU clusters measured individually):
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
aes-128-cbc     594976.14k  1290786.28k  1694330.03k  1827406.51k  1881746.09k  1886972.59k (Cortex-A76)
aes-128-cbc     595541.14k  1291237.40k  1693894.83k  1828485.12k  1881284.61k  1887262.04k (Cortex-A76)
aes-128-cbc     596013.89k  1289307.41k  1694745.86k  1827424.94k  1881426.60k  1887447.72k (Cortex-A76)
aes-128-cbc     595018.13k  1293503.04k  1694060.89k  1826374.66k  1881770.67k  1887300.27k (Cortex-A76)
aes-128-cbc     598141.49k  1291072.23k  1694859.86k  1827430.40k  1881655.98k  1887485.95k (Cortex-A76)
aes-128-cbc     598797.65k  1289548.05k  1694564.52k  1826965.50k  1881718.78k  1887327.57k (Cortex-A76)
aes-128-cbc     594819.94k  1290364.86k  1696595.46k  1827517.78k  1881795.24k  1887431.34k (Cortex-A76)
aes-128-cbc     595902.32k  1289898.33k  1695651.93k  1827775.15k  1881655.98k  1887316.65k (Cortex-A76)
aes-192-cbc     562560.68k  1124640.34k  1432901.29k  1518641.83k  1569901.23k  1573453.82k (Cortex-A76)
aes-192-cbc     562473.23k  1124936.36k  1432863.06k  1518676.99k  1569764.69k  1573306.37k (Cortex-A76)
aes-192-cbc     564201.12k  1124473.24k  1433254.57k  1518724.44k  1569559.89k  1573650.43k (Cortex-A76)
aes-192-cbc     563271.49k  1125458.18k  1432898.47k  1518941.18k  1569434.28k  1573557.59k (Cortex-A76)
aes-192-cbc     561526.78k  1123707.39k  1433080.75k  1518962.69k  1569876.65k  1573759.66k (Cortex-A76)
aes-192-cbc     563839.60k  1124952.77k  1432805.12k  1518688.60k  1569884.84k  1573726.89k (Cortex-A76)
aes-192-cbc     561921.38k  1124819.56k  1432981.25k  1518673.92k  1569901.23k  1573765.12k (Cortex-A76)
aes-192-cbc     563001.52k  1124441.58k  1432818.69k  1517664.60k  1569540.78k  1573694.12k (Cortex-A76)
aes-256-cbc     548336.69k   998419.99k  1242847.57k  1316564.65k  1346516.31k  1349380.78k (Cortex-A76)
aes-256-cbc     547503.40k   998072.36k  1242349.57k  1316630.87k  1346502.66k  1347960.83k (Cortex-A76)
aes-256-cbc     547646.89k   998284.86k  1241602.13k  1316511.40k  1346497.19k  1349074.94k (Cortex-A76)
aes-256-cbc     539631.60k   992004.89k  1239950.42k  1315208.19k  1345888.26k  1349211.48k (Cortex-A76)
aes-256-cbc     547980.23k   998398.10k  1242483.54k  1316303.19k  1346377.05k  1349167.79k (Cortex-A76)
aes-256-cbc     547453.64k   999679.94k  1242614.87k  1316233.22k  1346546.35k  1349326.17k (Cortex-A76)
aes-256-cbc     547551.88k   998091.35k  1242746.37k  1316634.28k  1346527.23k  1349266.09k (Cortex-A76)
aes-256-cbc     547312.89k   998043.54k  1241990.14k  1316261.21k  1346543.62k  1349413.55k (Cortex-A76)
...

В целом, результаты показывают, что устройство обеспечивает стабильное поведение процессора, надежную пропускную способность памяти, предсказуемое масштабирование задержки и надежную целочисленную и криптографическую производительность.

Тестирование производительности файловой системы с iozone

Также было проведено тестирование производительности файловой системы с использованием iozone для оценки производительности ввода-вывода хранилища в условиях прямого доступа. Тест был настроен с размером файла 512 МБ и большими размерами записей 1 МБ и 16 МБ, результаты показаны ниже.

...
Include fsync in write timing
O_DIRECT feature enabled
Auto Mode
File size set to 524288 kB
Record Size 1024 kB
Record Size 16384 kB
Command line used: iozone -e -I -a -s 512M -r 1024k -r 16384k -i 0 -i 1 -i 2
Output is in kBytes/sec
Time Resolution = 0.000001 seconds.
Processor cache size set to 1024 kBytes.
Processor cache line size set to 32 bytes.
File stride size set to 17 * record size.
														  random    random     bkwd    record    stride                                    
		  kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread
	  524288    1024    83964    95051   319753   320757   319815    78884                                                                
	  524288   16384    81408    77665   334355   332469   333798    76082    
...

Производительность последовательного чтения была стабильной для обоих размеров записей, составляя приблизительно 320–337 МБ/с. Результаты повторного чтения и случайного чтения находились в том же диапазоне, что указывает на стабильную пропускную способность чтения при повторяющихся шаблонах доступа. Производительность последовательной записи достигла примерно 100–111 МБ/с для обоих размеров записей, при этом пропускная способность случайной записи показала аналогичные значения. В целом, эти результаты указывают на высокую и стабильную пропускную способность при чтении, а также на умеренную и повторяемую производительность записи при тестировании с включенным прямым вводом-выводом.

Тестирование производительности с Geekbench 6.5

Далее была установлена и запущена версия Geekbench 6.5.0. Система показала одноядерный результат 865 и многоядерный результат 1982, что отражает общую производительность ее процессора. Полные результаты теста можно посмотреть по ссылке на результат Geekbench .

Одноядерный тест Geekbench 6 выдал общий результат 865, при этом большинство суб-тестов находились в диапазоне 800 с небольшим. Более высокая одноядерная производительность была отмечена в компиляции Clang, Horizon Detection, Navigation и PDF Rendering, в то время как общие нагрузки, такие как Text Processing, HDR, HTML5 браузинг, Ray Tracing и Structure from Motion, оставались близкими к среднему значению. Более требовательные задачи, связанные с компьютерным зрением, в частности Object Detection и Object Remover, показали заметно более низкие результаты.

Geekbench single-core score.
Одноядерный результат Geekbench.

Многоядерные результаты отражают, насколько хорошо система масштабируется на все ядра процессора при параллельных нагрузках. Высокие результаты были достигнуты в Asset Compression, Ray Tracing и компиляции Clang, что указывает на эффективное использование нескольких ядер для ресурсоемких вычислений. Другие нагрузки, такие как PDF Rendering, Structure from Motion, Navigation, Background Blur, Photo Library и HDR, также выиграли от параллельного выполнения, в то время как задачи, такие как Text Processing, HTML5 браузинг и Object Detection, показали более умеренное масштабирование.

Geekbench multi-core score.
Многоядерный результат Geekbench.

В целом, многоядерный результат примерно в 2,3 раза выше одноядерного, что ясно показывает преимущество распределения нагрузок по нескольким ядрам процессора. Задачи, которые показывают результат в середине 800 в одноядерном режиме, обычно превышают 2000 в многоядерных тестах, а некоторые преодолевают 3000, в то время как нагрузки, такие как Object Detection и Object Remover, улучшаются, но остаются относительно низкими из-за ограничений производительности на одно ядро.

Тестирование производительности веб-браузера с Speedometer 3.1

Далее было использовано приложение Speedometer 3.1 для тестирования производительности двух веб-браузеров, предустановленных в образе ОС. Оба браузера показали очень похожие результаты Speedometer.

Для Chromium тест Speedometer сообщил о среднем результате около 4,16, с результатами, тесно сгруппированными по запускам, и средним геометрическим временем выполнения примерно 240 мс, что указывает на стабильную производительность браузера. Большая часть времени выполнения была потрачена на задачи, интенсивно использующие JavaScript и DOM, такие как сложные обновления пользовательского интерфейса и отрисовка графиков.

Firefox показал очень похожие результаты и сравнительно низкое отклонение между запусками, снова соответствуя среднему геометрическому времени выполнения в том же диапазоне ~240 мс. Небольшая разница между двумя браузерами находится в пределах нормальной вариации теста и не указывает на какой-либо значительный разрыв в производительности, что позволяет предположить, что оба предлагают практически одинаковую производительность веб-приложений в этой системе.

Speedometer 3.1 score on Firefox.
Результат Speedometer 3.1 в Firefox.
Speedometer 3.1 score on Chromium.
Результат Speedometer 3.1 в Chromium.

Небольшая разница между Chromium и Firefox находится в пределах нормальной вариации теста и не указывает на значительный разрыв в производительности; в целом, оба браузера обеспечивают практически одинаковую производительность веб-приложений в этой системе.

Тестирование производительности воспроизведения видео на YouTube

Далее было протестировано воспроизведение YouTube путем проигрывания видео 4K в полноэкранном режиме на мониторе 4K (3840 × 2160) с включенной функцией «Статистика для гиков». Воспроизведение было плавным и стабильным от 144p до 1080p, без наблюдаемых потерь кадров. Однако варианты разрешения выше 1080p были недоступны.

При низких разрешениях (144p–360p) воспроизведение работало на скромных битрейтах и постоянно поддерживало длительное состояние буфера, часто около 120 секунд, что указывает на достаточный запас производительности декодирования и сети даже при масштабировании на большой 4K-дисплей. При более высоких разрешениях (480p–1080p) воспроизведение оставалось надежным в той же конфигурации дисплея, скорость соединения масштабировалась соответствующим образом, а состояние буфера оставалось в комфортном диапазоне, обычно от 30 до 120 секунд. Даже при 1080p/30 система поддерживала плавное воспроизведение без потерь кадров, демонстрируя стабильное поведение декодирования видео и буферизации для всех обычно используемых разрешений YouTube.

YouTube Stats for Nerds at 144p
Статистика YouTube для гиков при 144p.
YouTube Stats for Nerds at 240p.
Статистика YouTube для гиков при 240p.
YouTube Stats for Nerds at 360p.
Статистика YouTube для гиков при 360p.
YouTube Stats for Nerds at 480p.
Статистика YouTube для гиков при 480p.
YouTube Stats for Nerds at 720p.
Статистика YouTube для гиков при 720p.
YouTube Stats for Nerds at 1080p.
Статистика YouTube для гиков при 1080p.

Тестирование производительности 3D-рендеринга веб-браузера с использованием WebGL

Далее была оценена производительность 3D-рендеринга веб-браузера с использованием демо WebGL Aquarium в веб-браузере Chromium.

При фиксированном размере холста 1024 × 1024 результаты показали четкое и предсказуемое масштабирование производительности по мере увеличения сложности сцены. При малом количестве объектов производительность была отличной: сцена работала со стабильными 60 кадрами в секунду при 1–100 рыбах, оставалась близкой к реальному времени при 500 рыбах (~54 кадра/с) и все еще обеспечивала приемлемую плавность при 1000 рыб (~48 кадров/с). По мере дальнейшего увеличения количества рыб частота кадров неуклонно снижалась, достигая около 29 кадров/с при 5000 рыбах, где анимация начала ощутимо терять плавность.

FPS for the WebGL Aquarium demo with 1, 100, 500, 1000, and 5000 fish.
FPS для демо WebGL Aquarium с 1, 100, 500, 1000 и 5000 рыбами.

При более тяжелых нагрузках ограничения графического процессора стали более очевидными. При 10 000 рыб частота кадров упала примерно до 16 кадров/с, снизившись дальше примерно до 11 кадров/с при 15 000 рыб и 8 кадров/с при 20 000 рыб. Чрезвычайно плотные сцены с 25 000–30 000 рыб снизили производительность до примерно 6–7 кадров/с, что явно выходит за рамки рендеринга в реальном времени. В целом, эти результаты показали, что Chromium может плавно справляться с умеренными нагрузками WebGL, но производительность быстро снижается по мере увеличения вызовов отрисовки и нагрузки на фрагментный шейдер, подчеркивая ограничения графического процессора, а не нестабильность браузера. Итоговый график ниже сравнивает частоту кадров в этих сценариях.

FPS for the WebGL Aquarium demo with 10000, 15000, 20000, 25000, and 30000 fish.
FPS для демо WebGL Aquarium с 10000, 15000, 20000, 25000 и 30000 рыбами.
Comparison of WebGL Aquarium 3D rendering performance at different fish counts.
Сравнение производительности 3D-рендеринга WebGL Aquarium при разном количестве рыб.

Тестирование AI-ускорителя Hailo-8

Мой промышленный компьютер reComputer Industrial R2135-12 был оснащен предустановленным AI-ускорителем Hailo-8, со всеми необходимыми библиотеками и пакетами, уже установленными и готовыми к использованию. Для тестирования примеров Hailo для Raspberry Pi 5 достаточно было выполнить скрипт настройки окружения по пути  /mnt/hailo-rpi5-examples/setup_env.sh, который активировал предопределенную виртуальную среду и настроил все необходимые пути для среды выполнения Hailo-8. После активации окружения система была немедленно готова к запуску примеров приложений и задач вывода (inference) для Hailo-8 без какой-либо дополнительной настройки. Все предоставленные примеры скриптов на Python были построены на GStreamer и его внутренних конвейерах, которые обрабатывали видеопоток, обработку видео и AI-вывод.

Sourcing the Hailo-8 environment setup script.
Выполнение скрипта настройки окружения Hailo-8.

Для тестирования этих примеров начал со скрипта simple_detection.py — облегченной демонстрации детектирования, разработанной для минимизации нагрузки на CPU. Некоторые полезные параметры командной строки включали --input для выбора источника входного сигнала (например, видеофайла или подключенной USB-вебкамеры) и --show-fps для наложения информации о частоте кадров на видео. При конфигурации по умолчанию, предоставленной в примерах Hailo-8, скрипт работает на примере видеофайла с предустановленным ограничением частоты кадров. В консольном выводе отображаются детали детектирования, такие как показатели достоверности (confidence) для каждого обнаруженного объекта. В целом, демонстрация работала стабильно с частотой приблизительно 30 кадров в секунду (FPS). На следующем изображении показаны результаты работы скрипта simple_detection.py .

Running the simple detection example.
Запуск примера простого детектирования.

Изображение ниже показывает результат запуска полного детектирования с использованием скрипта-примера detection.py.

Running the full detection example.
Запуск примера полного детектирования.

Вот результаты запуска скрипта instance_segmentation.py , который работал, как и ожидалось, достигая аналогичных 30 FPS при конфигурации по умолчанию.

Runing the Instance Segmentation example.
Запуск примера семантической сегментации (Instance Segmentation).

Примерный скрипт depth_estimation.py основан на модели оценки глубины SCDepthV3 и также показал очень хорошие результаты.

Runing the depth estimation example.
Запуск примера оценки глубины.

Последним протестированным примером была демонстрация оценки позы, которая возвращала 17 ключевых точек (HAILO_LANDMARKS) для каждого обнаруженного человека. К ним относятся ориентиры для носа, глаз, ушей, плеч, локтей, запястий, бедер, коленей и лодыжек. Примерный скрипт также работал, как ожидалось, и выдавал стабильные, последовательные результаты оценки позы.

Runing the pose estimation example.
Запуск примера оценки позы.

Демонстрация варианта использования — определение местоположения людей в ограниченной зоне

В этом разделе продемонстрирована AI-производительность reComputer Industrial R2135-12 путем обнаружения людей в видеопотоке и оценки местоположения каждого человека в реальных координатах в реальном времени. Обнаруженные позиции затем были отображены на внешней светодиодной матрице 8×16, управляемой платой разработки на основе ESP32, что эффективно служило простым LED-«планом этажа» для визуализации местоположения людей.

Стоит отметить, что в настройке реального времени для точной оценки положения обычно потребовался бы интерактивный графический интерфейс, позволяющий пользователям щелкать по кадру видео для сбора опорных точек для калибровки. Из-за ограничений по времени этот шаг был пропущен, и вместо этого использовалось предварительно записанное видео, сфокусировавшись на демонстрации вычислительных и AI-возможностей самого reComputer.

Теоретическая основа

Следующий рисунок кратко иллюстрирует концепцию восстановления реальных координат из точек изображения. В этом примере предполагается, что плоскость земли известна и что реальные координаты двух опорных точек, A и B, заданы. Их соответствующие местоположения на изображении также могут быть идентифицированы, обозначены как точка-a и точка-b. Имея эту информацию и зная пирамиду видимости камеры (показана как желтый треугольник на рисунке), можно оценить положение и ориентацию камеры. Основываясь на этой настройке, если объект лежит на плоскости земли и его местоположение на изображении может быть определено (например, точка-c), его реальные координаты могут быть восстановлены путем обратного проецирования луча (показан оранжевым) из центра камеры через точку-c на изображении и нахождения пересечения этого луча с плоскостью земли.

Concept of back-projection.
Концепция обратного проецирования.

Следующее изображение показывает пример того, как можно оценить координаты основания штатива, когда внутренние параметры камеры были известны вместе с четырьмя опорными точками на земле. В этой настройке начало отсчета (0, 0) было определено в центральной точке между точками A–D, при этом каждый квадрат плитки пола имел размер 60 × 60 см. Фактическое расположение основания штатива было приблизительно (0, −60, 0) в мировых координатах. Основываясь на этой конфигурации, оцененное положение штатива (0.3, -59.4, 0.0) близко соответствовало ожидаемому реальному местоположению, демонстрируя точность этого простого подхода к восстановлению координат.

Example of tripod base coordinate estimation.
Пример оценки координат основания штатива.

Настройка сцены и оценка позы камеры

Сначала была выполнена калибровка камеры с использованием набора изображений шахматной доски и функций калибровки камеры OpenCV для получения внутренних параметров (fx, fy, cx, cy) вместе с коэффициентами дисторсии объектива (k1, k2, p1, p2, k3).

fx = 3238.6635331929683
fy = 3241.0613554172223
cx = 2042.009749715308
cy =  925.2763732253052
k1 =  0.2523496972079927
k2 = -1.4002772998133683
p1 =  0.002290276484551306
p2 = -0.0014385064745750323
k3 =  2.7815419705574613

Затем была подготовлена тестовая сцена, как показано на изображении ниже, где синяя лента обозначала начало отсчета (0, 0). Ось +X была определена вдоль направления A–B, а ось +Y — вдоль направления A–D. После этого было записано видео сцены и вручную извлечен кадр для идентификации нескольких опорных точек. Используя эту информацию, была оценена трансформация камеры с помощью функций Python, основанных на методах оценки позы Perspective-n-Point (PnP) OpenCV .

Setting up the testing environment.
Настройка тестовой среды.
Reference points.
Опорные точки.

Ниже приведена функция, использованная для оценки позы камеры.

def estimate_camera_poses(pts_img, pts_world, camera_matrix, dist_coeffs):
    print("-------------------------------------")
    n_image_points  = pts_img.shape
    n_object_points = pts_world.shape

    poses = []
    image_points = pts_img

    objp = pts_world.reshape(-1, 1, 3)
    imgp = pts_img.reshape(-1, 1, 2)

    success, rvec, tvec = cv2.solvePnP(
            objp,
            imgp,
            camera_matrix,
            dist_coeffs)
    R, _ = cv2.Rodrigues(rvec)
    pose = numpy.hstack((R, tvec))  # 3x4 matrix
    poses.append({
        'rotation_vector': rvec,
        'translation_vector': tvec,
        "rotation_matrix": R,
        'pose_matrix': pose
    })

    return poses

Это оцененная информация о вращении и смещении камеры.

R = [[ 0.02303737 -0.99858007  0.04803245],
     [-0.31316605 -0.05283524 -0.94822754],
     [ 0.94941893  0.00680254 -0.31393856]]
t = [-211.98, 101.39, 121.58]

Матрицу вращения было сложнее интерпретировать напрямую, в то время как вектор смещения был гораздо понятнее. В данном случае он указывал на то, что камера была расположена приблизительно в 2,1 м от точки A вдоль отрицательной оси X (к нижней части изображения), около 1 м вдоль оси Y и на высоте примерно 1,2 м над плоскостью земли относительно точки A.

Оценка местоположения ступни

Следующим шагом была оценка 3D-позиции ступни обнаруженного человека. Для простоты использовался пример pose_estimation.py от Hailo-8 для обнаружения ориентиров человеческого тела и извлечения 2D-координат изображения левой и правой лодыжек. Эти координаты изображения затем были преобразованы в мировые координаты с использованием техники обратного проецирования, описанной ранее.

Следующие две функции использовались для построения луча из центра камеры и вычисления его пересечения с плоскостью земли.

def create_a_ray(u, v, K, distCoeffs, R, t):
    pts = numpy.array([[[u, v]]], dtype=numpy.float64)
    undist = cv2.undistortPoints(pts, K, distCoeffs)
    x_n, y_n = undist[0,0]

    d_cam = numpy.array([x_n, y_n, 1.0], dtype=numpy.float64)

    C = -R.T @ t

    d_world = R.T @ d_cam
    d_world = d_world / numpy.linalg.norm(d_world)

    return C.reshape(3), d_world.reshape(3)

def intersect_ray_with_plane(C, d, n, d0):
    denom = n @ d
    if numpy.abs(denom) < 1e-9:
        return None, None
    s = -(n @ C + d0) / denom
    if s < 0:
        return None, None
    X = C + s * d
    return X, s

Основываясь на этом подходе, оцененная позиция ступни составила (202.0, 44.2, 0.0) в мировой системе отсчета. Этот результат был обоснован, так как я стоял очень близко к точке B, чьи известные координаты (240, 0).

Result of foot location estimation.
Результат оценки местоположения ступни.

Отображение обнаруженного местоположения ступни с помощью ESP32 и светодиодных матриц

Заключительным шагом была визуализация местоположения обнаруженного человека с использованием двух светодиодных матриц 8 × 8. Индексы строк и столбцов светодиодов рассчитывались путем линейного масштабирования оцененного диапазона мировых координат (приблизительно 480.0 × 240.0 см) для соответствия сетке светодиодов 8 × 16. Затем эти индексы отправлялись на ESP32 через USB-соединение.

Для этой демонстрации использовалась плата KidBright 32 V1.3, которая включает в себя встроенный контроллер светодиодной матрицы HT16K33, что удобно для быстрого прототипирования. На изображении ниже показана работа системы в реальном времени с входным сигналом от USB-вебкамеры, где подсвеченные светодиоды соответствуют оцененному местоположению человека. Видео этой демонстрации включено в начало этого обзора, а также его можно посмотреть напрямую по этой ссылке на YouTube .

Running the demo application.
Запуск демонстрационного приложения.

Температура и распределение тепла

Заключительный тест был сосредоточен на поведении температуры и распределении тепла. Сначала устройство работало в режиме простоя в течение 5 минут, а затем были сняты тепловые изображения с помощью тепловизора FLIR E4.

Running the device under full load.
Работа устройства под полной нагрузкой.

В режиме простоя средняя температура поверхности составляла около 33 °C при температуре окружающей среды примерно 25 °C, как показано ниже.

Temperature in idle state.
Температура в режиме простоя.

Затем устройство было протестировано под полной нагрузкой путем запуска демонстрации WebGL Aquarium с 30 000 рыб, воспроизведения видео YouTube в разрешении 1080p и одновременного запуска примера AI-приложения. Система работала в этом состоянии в течение 10 минут перед снятием тепловых изображений, показанных ниже.

Temperature under high load.
Температура под высокой нагрузкой.

На основе тепловых изображений устройство демонстрировало стабильный и хорошо распределенный тепловой профиль при различных рабочих состояниях. При более высоких нагрузках температура поверхности корпуса достигала пика примерно 35–37 °C, причем самые теплые области были сосредоточены на верхней панели и верхних боковых поверхностях. Это указывало на то, что внутренние источники тепла — скорее всего, вычислительный модуль и AI-ускоритель — эффективно передавали тепло алюминиевому корпусу, который функционировал как пассивный радиатор. Примечательно, что локальных перегревов не наблюдалось, что говорит об эффективной внутренней тепловой связи и распределении тепла.

Temperature under high load from different view angles.
Температура под высокой нагрузкой с разных углов обзора.

Выводы

Промышленный AI-компьютер reComputer Industrial R2135-12 предлагает широкий спектр проводных и беспроводных вариантов подключения. Предустановленный образ системы и предустановленное программное обеспечение, включая примеры ускорения AI на Hailo-8, сэкономили значительное количество времени на настройку. Его AI-производительность в среднем составляла около 30 FPS, что более чем достаточно для многих исследовательских задач. В этом обзоре была обнаружена лишь одна незначительная проблема: официальная страница продукта была несколько запутанной, так как изображения, показанные на сайте, отличались от полученного устройства, что изначально привело к обращению к неверному руководству пользователя.

Благодарим Seeed Studio за предоставленный для обзора reComputer AI Industrial R2135-12. Его можно приобрести в Seeed Studio за $279.00 для версии с 8 ГБ ОЗУ / 32 ГБ eMMC (26 TOPS), рассмотренной здесь, или выбрать вариант с 16 ГБ ОЗУ за $339 на той же странице. Промышленный AI-ПК Raspberry Pi CM5 Edge в конечном итоге может стать доступным в магазине компании на Amazon и на AliExpress .

Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

0 0 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments