RASPBERRY PI камера зі штучним інтелектом

RASPBERRY PI камера зі штучним інтелектом

У статті наведена коротка інформація про 12- мегапіксельну камеру Raspberry Pi зі штучним інтелектом, побудовану на основі датчика зобра­ження Sony IMX 500. Розглянуті основні характе­ристики камери та рекомендації по роботі з нею.

В. Макаренко

Компанія Raspberry Pi Foundation окрім модулів Raspberry Pi випускає модулі відеокамер. Однією з останніх розробок є 12-мегапіксельна камера зі штучним інтелектом що використовує датчик зобра­ження Sony IMX 500 для забезпечення високої про­дуктивності і можливостями штучного інтелекту для будь-якої програми камери .

Камера Raspberry Pi AI (рис. 1), сумісна з усіма комп’ютерами Raspberry Pi, використовує переваги інтелектуального датчика зору Sony IMX500, щоб допомогти створювати додатки vision AI і моделі нейронних мереж з використанням вбудованого процесора штучного інтелекту. Тісна інтеграція IMX500 зі стеком програмного забезпечення для ка­мер Raspberry Pi дозволяє користувачам розгортати власні моделі нейронних мереж з мінімальними зу­силлями.

Рис. 1. Raspberry Pi AI Camera

Для початку розглянемо посібник, який допомо­же запустити на камері готову або виготовлену на замовлення модель нейронної мережі.

Ці інструкції передбачають, що ви використовує­те камеру штучного інтелекту, підключену до плати Raspberry Pi 4 Model B або Raspberry Pi 5. З невели­кими змінами ви можете слідувати цим інструкціям на інших моделях Raspberry Pi з роз’ємом камери, включаючи Raspberry Pi Zero 2 W та Raspberry Pi 3 Model B+.

По-перше, переконайтеся, що на вашому Rasp­berry Pi встановлено найновіше програмне забезпе­чення. Виконайте наступну команду для оновлення:

sudo apt update && sudo apt full-upgrade

Встановлення вбудованого ПЗ IMX500

При запуску AI-камера повинна завантажити вбудоване ПЗ. Щоб встановити це вбудоване ПЗ на Raspberry Pi, треба виконати таку команду:

sudo apt install imx500-all

Ця команда:

  • встановлює файли / lib/firmware/ imx500_loader.apkта / lib/firmware/ ітх500_^гіттоаге.для файлів вбудованого ПЗ, не­обхідних для роботи датчика IMX500
  • розміщує кілька файлів вбудованого програм­ного забезпечення для моделей нейронних мереж у/usr/share/ imx500-models/
  • встановлює програмне забезпечення для по­дальшої обробки IMX500 у rpicam-apps
  • встановлює інструменти для упаковки мереже­вих моделей Sony.

Драйвер пристрою IMX500 kernel завантажує всі файли вбудованого ПЗ при запуску камери. Це може зайняти кілька хвилин, якщо вбудована мо­дель нейронної мережі не була попередньо кешова- на. У наведених нижче демонстраціях на консолі ві­дображається індикатор виконання, що показує хід завантаження вбудованого ПЗ.

Після встановлення ПЗ необхідно зробити пере­завантаження Raspberry Pi, виконаши команду:

sudo reboot

Як тільки всі системні пакети будуть оновлені, а вбудовані файли встановлені, можна запускати прикладні програми. Raspberry Pi AI Camera повні­стю інтегрується з програмами libcamera, програ­мами rpicam та Pi camera 2.

Додатки rpicam-apps

Програми для камер rpicam-apps включають ета­пи виявлення об’єктів IMX500 та оцінки пози, які можна запускати в процесі постобробки. Додаткові відомості про процес постобробки наведені в доку­ментації з постобробки. Приклади використовують файли JSON для подальшої обробки, розташовані в /usr/share/rpicam-assets/.

Виявлення об’єктів

Нейронна мережа MobileNet SSD виконує базове виявлення об’єктів, надаючи обмежувальні рамки і значення достовірності для кожного знайденого об’єкта. Файл imx500_mobilenet_ssd.json містить па­раметри конфігурації для етапу подальшої обробки результатів виявлення об’єктів IMX500 з викори­станням нейронної мережі MobileNet SSD.

Файл imx500_mobilenet_ssd.json запускає конве­єр після обробки, який містить два етапи:

  • imx500_object_detection, який вибирає обме­жувальні рамки та значення довіри, що генеруються нейронною мережею, у вихідному тензорі
  • object_detect_draw_cv, який малює обмежу­вальні рамки та написи на зображенні.

Тензор MobileNet SSD не вимагає додаткової по- стобробки на Raspberry Pi для отримання остаточ­ного результату у вигляді обмежувальних рамок. Всі операції по виявленню об’єктів виконуються безпо­середньо камерою штучного інтелекту.

Наступна команда запускає rpicam-hello з по­дальшою обробкою виявлення об’єктів:

rpicam-hello -t 0s –post-process-file / usr/share/rpi-camera- assets/imx500_mobilenet_ssd.json –viewfinder-width 1920 –viewfinder-height 1080 –framerate 30

Після виконання команди ви побачите видошу­кач, який накладає обмежувальні рамки на об’єкти, розпізнані нейронною мережею (рис. 2).

Рис. 2. Обмежувальні рамки на об’єктах, розпізнаних нейронною мережею

Щоб записати відео з накладанням об’єктів виявлення, використовуйте команду rpicam-vid:

rpicam-vid -t 10s -o output.264 –post-process-file /usr/share/rpi-camera- assets/imx500_mobilenet_ssd.json –width 1920 -­height 1080 –framerate 30

Розпізнанвання imx500_object_detection можна налаштувати різними способами.

Наприклад, параметр max_detections визначає максимальну кількість об’єктів, які конвеєр виявить у будь-який момент часу. поріг визначає мінімальне значення довіри, необхідне для того, щоб конвеєр міг розглядати будь-які вхідні дані як об’єкт.

Необроблені вихідні дані цієї мережі можуть бути досить зашумленими, тому на цьому етапі також ви­конується деяка часова фільтрація та застосову­ється гістерезис. Щоб вимкнути цю фільтрацію не­обхідно видалити конфігураційний блок temporal_fil- ter.

Оцінка пози

Нейронна мережа PoseNet виконує оцінку пози, позначаючи ключові точки на тілі, пов’язані з сугло­бами та кінцівками. Файл imx500_posenet.json мі­стить параметри конфігурації для етапу постоброб- ки оцінки пози IMX500 за допомогою нейронної ме­режі PoseNet. Він активує конвеєр постобробки, який містить два етапи:

  • imx500_posenet, який отримує вихідний тензор із нейронної мережі PoseNet
  • plot_pose_cv, який малює лінії, що накладають­ся на зображення.

Камера штучного інтелекту виконує базове ви­явлення, але вихідний тензор потребує додаткової пост-обробки на хості Raspberry Pi, щоб отримати остаточний результат.

Наступна команда запускає rpicam-hello з по- стобробкою оцінки пози (рис. 3):

rpicam-hello -t 0s –post-process-file /usr/share/rpi-camera-as- sets/imx500_posenet.json –viewfinder-width 1920 –viewfinder-height 1080 –framerate 30

Рис. 3. Результат постообробки оцінки пози

Налаштувати етап imx500_posenet можна різни­ми способами.

Наприклад, max_detections визначає максималь­ну кількість тіл, які конвеєр виявить у будь-який мо­мент часу. threshold визначає мінімальне значення достовірності, необхідне для того, щоб конвеєр роз­глядав вхідні дані як тіло.

Picamera2

Приклади класифікації зображень, виявлення об’єктів, сегментації об’єктів і оцінки пози за допо­могою Picamera2 (див. у репозиторії picamera2 Url: GitHub https://github.com/raspberrypi/picam- era2/tree/main/examples/imx500).

Більшість прикладів використовують OpenCV для додаткової обробки. Щоб установити залежності, необхідні для запуску OpenCV, треба виконати таку команду:

sudo apt install python3-opencv python3-munkres

Необхідно завантажити репозиторій picamera2 на свій Raspberry Pi, щоб запустити приклади. При­клади файлів знаходяться у кореневому каталозі з додатковою інформацією у файлі readme.md.

Запустіть наступний скрипт зі сховища, щоб за­пустити виявлення об’єктів YOLOv8:

python imx500_object_detection_demo.py –model

/usr/share/imx500-models/imx500_network_ssd_mo- bilenetv2_fpnlite_320x320_pp.rpk

Щоб спробувати оцінити позу в Pi camera 2, запу­стіть наступний скрипт зі сховища:

python imx500_pose_estimation_higherhrnet_demo.py

Структура AI-камери Raspberry Pi відрізняється від традиційних камер на базі штучного інтелекту, як показано на рис. 4.

На рис. 4,а наведена структура традиційної си­стеми камер зі штучним інтелектом. У такій системі камера передає зображення на Raspberry Pi. який обробляє зображення, а потім виконує логічний висновок за допомогою штучного інтелекту. Тради­ційні системи можуть використовувати зовнішні прискорювачі штучного інтелекту (як показано на рис.4,а) або покладатися виключно на центральний процесор.

На рис.4,б наведена структура системи, що ви­користовує IMX500. Модуль камери містить проце­сор обробки сигналів зображення (ISP), який пере­творює необроблені дані зображення з камери у вхідний тензор. Модуль камери відправляє цей тен­зор безпосередньо в прискорювач штучного інте­лекту всередині камери, який генерує вихідні тензо­ри, що містять результати логічного висновку. При­скорювач штучного інтелекту надсилає ці тензори до Raspberry Pi. Немає необхідності ні в зовнішнь­ому прискорювачі, ні в Raspberry Pi для запуску про­грамного забезпечення нейронної мережі на цент­ральному процесорі.

Рис. 4. Структура звичайної камери зі штучним інтелектом (а) та Raspberry Pi  AI-камери (б)

Щоб повністю зрозуміти цю систему, треба озна­йомитись з наступними поняттями:

Вхідний тензор

Частина зображення з сенсора, передана в ме­ханізм штучного інтелекту для виведення. Ство­рюється невеликим вбудованим провайдером, який також обробляє і масштабує зображення з камери до розмірів, очікуваних завантаженою нейронною мережею. Вхідний тензор, як правило, недоступний для додатків, хоча до нього можна отримати доступ для налагодження.

Область інтересу (ROI)

Визначає, яка саме частина зображення датчика обрізається перед зміною масштабу до розміру, не­обхідного для нейронної мережі. Може бути запита­на і встановлена додатком. В якості одиниць вимі­рювання завжди використовуються пікселі на виході датчика з повним дозволом. Налаштування ROI за замовчуванням використовує повне зображення, отримане з датчика, без обрізання даних.

Вихідні тензори

Результати логічного висновку, виконаного ней­ронною мережею. Точна кількість і форма виходу залежать від нейронної мережі. Код програми повинен розуміти, як поводитися з тензорами.

Архітектура системи обробки зображень

На рис. 5 наведені програмні компоненти камери (виділені зеленим кольором), що використовуються в наведеному прикладі використання зображень/виводу з апаратним забезпеченням мо­дуля камери Raspberry Pi AI (виділено червоним кольором).

Рис. 5. Програмні компоненти Raspberry Pi AI-камери

При запуску сенсорний модуль IMX500 заванта­жує вбудоване ПЗ для запуску певної моделі нейро- нної мережі. Під час потокової передачі IMX500 ге­нерує як потік зображень, так і потік логічних вис­новків. Цей потік логічних висновків містить вхідні та вихідні дані моделі нейронної мережі, також відомі як тензори вводу/виводу.

Драйвери пристроїв

На найнижчому рівні драйвер сенсорного ядра IMX500 налаштовує модуль камери по шині I2C. драйвер CSI2 (CFE на Pi 5, Unicam на всіх інших плат­формах Pi) налаштовує приймач на запис потоку да­них зображення в буфер кадрів разом з потоками вбудованих даних і даних логічного виводу в інший буфер в пам’яті.

Файли вбудованого ПЗ також передаються по шині I2C. На більшості пристроїв для цього викори­стовується стандартний протокол I2C, але в Rasp­berry Pi 5 використовується спеціальний високош- видкісний протокол. Драйвер RP2040 SPI в ядрі управляє передачею файлів вбудованого ПЗ, ос­кільки для передачі використовується мікроконтро- лер RP2040. Мікроконтролер забезпечує передачу даних I2C з ядра в IMX500 по шині SPI. Крім того, RP2040 кешує файли вбудованого ПЗ у вбудованій пам’яті. Це дозволяє уникнути необхідності передачі цілих двійкових файлів вбудованого ПЗ по шині I2C, що значно прискорює завантаження прошивки, яка використовувалась.

Libcamera

Після того як libcamera знімає з черги буфери да­них зображення та логічного виводу з ядра, спеці­альна бібліотека cam-helper IMX500 (частина Rasp­berry Pi IPA в libcamera) аналізує буфер логічного ви­воду (висновків) для доступу до тензорів введення/виведення. Ці тензори упаковані як спеці­альні елементи керування libcamera для Raspberry Pi від постачальника. Libcamera повертає елементи керування, наведені в табл. 1.

Програма rpicam

Програма rpicam-apps надає базовий клас етапу постобробки IMX500, який реалізує помічники для етапів постобробки IMX500 – IMX500PostProcess- ingStage. Потрібно використовувати цей базовий клас для отримання нового етапу постобробки для будь-якої моделі нейронної мережі, що працює на IMX500. Для прикладу наведено imx500_object_de- tection.cpp:

class ObjectDetection : public IMX500PostProcess- ingStage

{

public:

ObjectDetection(RPiCamApp *app) : IMX500PostProcessingStage(app) {}

char const *Name() const override;

void Read(boost::property_tree::ptree const

&params) override;

void Configure() override;

bool Process(CompletedRequestPtr &com- pleted_request) override;

};

Для кожного кадру, отриманого програмою, ви­кликається  функція  Process()

(ObjectDetection::Process() у наведеному вище прикладу). У цій функції можна отримати вихідний тензор для подальшої обробки або аналізу:

auto output = completed_request-

>metadata.get(controls::rpi::CnnOutputTensor);

if (!output)

{

LOG_ERROR(“No output tensor found in metada­ta!”);

return false;

}

std::vector<float> output_tensor(output->data(), output->data() + output->size());

Після завершення кінцеві результати можуть бути візуалізовані або збережені в метаданих і вико­ристані на іншому наступному етапі або самому до­датку верхнього рівня. У випадку об’єктного виснов­ку:

if (objects.size())

completed_request-

>post_process_metadata.Set(“object_detect.results”,

objects);

На етапі постобробки object_detect_draw_cv, що наведений нижче, отримує ці результати з метада- них і малює обмежувальні прямокутники на зобра­женні у функції ObjectDetectDrawCvStage::Process():

std::vector<Detection> detections;

completed_request- >post_process_metadata.Get(“object_detect.results”, detections);

Таблиця 1. Елементи керування що повертаються libcamera

У табл. 2 міститься повний список допоміжних функцій, наданих IMX500PostProcessingStage.

Таблиця 2. список допоміжних функцій IMX500PostProcessingStage

Picamera2

Інтеграція IMX500 в Pi camera 2 дуже схожа на те, що доступно в програмах rpicam. Picamera2 має до­поміжний клас IMX500, який забезпечує ту саму функціональність, що і базовий клас rpicam-apps IMX500PostProcessingStage. Його можна імпортува­ти в будь-який сценарій Python за допомогою скрип­та:

from picamera2.devices.imx500 import IMX500

# This must be called before instantiation of Picam- era2

imx500 = IMX500(model_file)

Щоб отримати вихідні тензори, необхідно їх ви­тягнути з елементів керування. Потім можна засто сувати додаткову обробку у своєму сценарії Python.

Наприклад, в разі використання логічного вис­новку об’єкта, такому як

imx500_object_detection_demo.py, обмежувальні рамки об’єкта та значення довіри витягуються з parse_detections () і малюються на зображенні в draw_detections():

class Detection:

def __init__(self, coords, category, conf, metada­ta):

“””Create a Detection object, recording the bounding box, category and confidence.””” self.category = category self.conf = conf

obj_scaled = imx500.convert_inference_co- ords(coords, metadata, picam2)

self.box = (obj_scaled.x, obj_scaled.y, obj_scaled.width, obj_scaled.height)

def draw_detections(request, detections, stream=”main”):

“””Draw the detections for this request onto the ISP output.”””

labels = get_labels()

with MappedArray(request, stream) as m: for detection in detections:

x, y, w, h = detection.box

label = f”{labels} ({de- tection.conf:.2f})”

cv2.putText(m.array, label, (x + 5, y + 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) cv2.rectangle(m.array, (x, y), (x + w, y + h), (0, 0, 255, 0))

if args.preserve_aspect_ratio:

b = imx500.get_roi_scaled(request)

cv2.putText(m.array, “ROI”, (b.x + 5, b.y + 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1)

cv2.rectangle(m.array, (b.x, b.y), (b.x + b.width, b.y + b.height), (255, 0, 0, 0))

def parse_detections(request, stream=’main’): “””Parse the output tensor into a number of de­tected objects, scaled to the ISP output.”””

outputs = imx500.get_outputs(request.get_meta- data())

boxes, scores, classes = outputs, out- puts, outputs

detections = draw_detections(request, detections, stream)

На відміну від прикладу з rpicam-apps, у цьому прикладі не застосовується додаткова гістерезисна або часова фільтрація.

Клас IMX500 у Pi camera 2 надає допоміжні функ­ції наведені в табл. 3.

Розгортання моделі

Щоб розгорнути нову модель нейронної мережі для камери Raspberry Pi зі штучним інтелектом, не­обхідно виконати такі дії:

  • Надати модель нейронної мережі.
  • Кількісно обробити і стиснути модель, щоб вона могла працювати з використанням ресурсів, доступних в модулі камери IMX
  • Перетворити стиснуту модель у формат IMX
  • Упакувати модель у файл вбудованого про­грамного забезпечення, який можна завантажити в камеру під час виконання.

Перші три кроки зазвичай виконуються на більш потужному комп’ютері, наприклад на настільному комп’ютері або сервері. Завершальний етап упаков­ки необхідно виконати на Raspberry Pi.

Створення моделей

Існуючі моделі можна повторно використовувати або створювати нові, використовуючи популярні фреймворки, такі як TensorFlow або PyTorch. Для от­римання додаткової інформації треба відвідати офі­ційний веб-сайт розробника ANDROID.

Квантування та стиснення

Для квантування і стиснення моделей викори­стовується інструментарій Sony Model Compression Toolkit. Щоб встановити інструментарій, необхідно виконати наступну команду:

pip install model_compression_toolkit

Інструментарій стиснення моделей генерує квантовану модель у наступних форматах:

  • Keras (TensorFlow)
  • НА NX (PyTorch)

Перетворення моделі

Щоб перетворити модель, спочатку необхідно встановити інструменти конвертера:

TensorFlow

pip install imx500-converter

Завжди необхідно використовувати ту саму вер сію TensorFlow, яка використовувалась для стиснен­ня моделі.

PyTorch

pip install imx500-converter

Якщо вам потрібно встановити обидва пакети, використовуйте два окремі віртуальні середовища Python. Це запобігає конфліктам між TensorFlow та PyTorch.

Потім потрібно перетворити модель:

TensorFlow

imxconv-tf -i <compressed Keras model> -o <out­put folder>

PyTorch

imxconv-pt -i <compressed ONNX model> -o <out­put folder>

Обидві команди створюють вихідну папку, що мі­стить звіт про використання пам’яті та файл packer- Out.zip.

Для оптимального використання пам’яті, доступ­ної для прискорювача на сенсорі IMX500, треба до­дати до вищевказаних команд –no-input-persisten­cy. Однак це призведе до відключення генерації вхідного тензора та повернення до програми нала­годження.

Таблиця 3. Допоміжні функції Pi camera 2

Для отримання додаткової інформації про про цес перетворення моделі потрібно звернутись до офіційної документації конвертера Sony IMX 500.

Упаковка моделі

На завершальному етапі модель буде упакована у файл RPK. Під час запуску моделі нейронної мере­жі необхідно завантажити цей файл у камеру штуч­ного інтелекту. Перш ніж продовжити, необхідно ви­конати наступну команду, щоб встановити необхідні інструменти sudo apt install imx500-tools.

Щоб упакувати модель у файл RPK, необхідно виконати таку команду:

imx500-package -i <path to packerOut.zip> -o <output folder>

Ця команда повинна створити файл під назвою network.rpk у вихідній папці. Необхідно передати на­зву цього файлу програмам камери IMX500.

Більш повний набір інструкцій і додаткові відомо­сті про використовувані інструменти наведені в до­кументації до Sony IMX 500 Packager .

ЛІТЕРАТУРА

Останні новини

Надтонкі джерела живлення MEAN WELL серії XDR потужністю до 960 Вт
Brands

Надтонкі джерела живлення MEAN WELL серії XDR потужністю до 960 Вт

ПЛК MEAN WELL PLC-DPLC-32MT/ET для промислової автоматизації
Brands

ПЛК MEAN WELL PLC-DPLC-32MT/ET для промислової автоматизації

Двонаправлені перетворювачі MEAN WELL BIC-5K 5 кВт
Brands

Двонаправлені перетворювачі MEAN WELL BIC-5K 5 кВт

Інтелектуальні системи живлення 1–18 кВт на базі AC/DC-перетворювачів MEAN WELL серії RCP
Brands

Інтелектуальні системи живлення 1–18 кВт на базі AC/DC-перетворювачів MEAN WELL серії RCP

VD MAIS стає членом Global Electronics Association
VD MAIS

VD MAIS стає членом Global Electronics Association

Mean Well SHP — промислові джерела живлення великої потужності (10–30 кВт)
Brands

Mean Well SHP — промислові джерела живлення великої потужності (10–30 кВт)