profile
Дмитрий Антонычев
  • 1 месяц назад
  • ·
  • Опубликовано на веб-форуме
Распознавание объектов в реальном времени на Raspberry Pi YOLO

Мир компьютерного зрения стремительно меняется, и то, что еще пару лет назад требовало мощных серверов и громоздких видеокарт, сегодня помещается в ладонь. В 2026 году запуск нейросетей семейства YOLO (You Only Look Once) на одноплатных компьютерах Raspberry Pi перестал быть экспериментом энтузиастов и превратился в надежную инженерную практику. Благодаря появлению специализированных AI-ускорителей для платформы RPi и оптимизированных версий моделей, мы можем получать стабильные 15–30 FPS при детекции объектов прямо на устройстве размером с кредитную карту. Эта статья — ваше исчерпывающее пошаговое руководство по созданию системы распознавания объектов в реальном времени. Мы не будем ограничиваться теорией, а пройдем весь путь от выбора железа до тонкой настройки порогов уверенности и решения проблем с перегревом. Если вы хотите создать умный видеоглазок, систему учета деталей на конвейере или автономного робота-сортировщика, этот материал написан специально для вас. Актуальность стека технологий в 2026 году

Прежде чем приступить к пайке и программированию, важно понять, почему именно сейчас лучшее время для этого проекта. Эпоха попыток запустить тяжелые модели YOLOv8 или v9 на чистом CPU Raspberry Pi 4 ушла в прошлое. В 2026 году стандартом де-факто стала связка Raspberry Pi 5 (или обновленной ревизии Pi 4B) с официальным AI Kit на базе чипа Hailo-8L, либо использование альтернативных NPU-модулей, таких как Milk-V или Seeed Studio reComputer. Эти ускорители позволяют перенести инференс с центрального процессора на специализированный кремний, освобождая ядра ARM для обработки логики, стриминга видео и работы с базами данных. Что касается самих моделей, то в 2026 году для embedded-систем наиболее актуальны архитектуры YOLOv10-Nano, YOLOv11-Nano и специализированные RT-DETR-Mobile. Ключевой тренд — это не просто уменьшение размера модели, а нативная поддержка квантования INT8 без существенной потери точности. Фреймворки Ultralytics и Roboflow теперь предоставляют инструменты экспорта, которые автоматически адаптируют модель под архитектуру NPU Raspberry Pi, избавляя разработчика от необходимости вручную писать конвертеры ONNX. Это радикально снижает порог входа: вам больше не нужно быть экспертом в компиляции нейросетей, чтобы получить рабочий результат. Однако понимание процесса все равно необходимо для качественной отладки, поэтому мы разберем каждый этап подробно. Выбор и подготовка аппаратной части

Успех проекта на 70% зависит от правильного выбора комплектующих. Для комфортной работы с YOLO в реальном времени в 2026 году рекомендуется следующий минимальный набор. Во-первых, сама плата: Raspberry Pi 5 с 8 ГБ оперативной памяти является предпочтительным выбором благодаря шине PCIe 2. 0, позволяющей подключать AI-ускорители напрямую без потерь пропускной способности. Если бюджет ограничен, подойдет и Raspberry Pi 4B (4/8 ГБ), но будьте готовы к тому, что FPS будет ниже, а подключение NPU придется осуществлять через USB 3. 0, что создает узкое место. Во-вторых, модуль искусственного интеллекта. Официальный Raspberry Pi AI Kit (Hailo-8L) обеспечивает производительность до 13 TOPS, чего более чем достаточно для одновременного запуска двух потоков YOLOv11n в разрешении 640x640. Альтернативой могут служить Waveshare AI HAT+ или Coral USB Accelerator (хотя последний уже считается устаревающим решением). В-третьих, камера. Забудьте о старых CSI-камерах V1/V2. Используйте Raspberry Pi Camera Module 3 или Global Shutter Camera. Глобальный затвор критически важен для движущихся объектов, так как он устраняет эффект «желе» (rolling shutter), который может снизить точность детекции на 10–15%. Не забывайте о системе охлаждения. Инференс YOLO создает постоянную нагрузку на NPU и CPU. Пассивного радиатора недостаточно. Обязательно установите активный кулер (официальный Active Cooler или аналоги от Geekworm) и настройте мониторинг температур. Также потребуется качественный блок питания мощностью не менее 27 Вт (для Pi 5) или 15 Вт (для Pi 4), так как просадки напряжения под нагрузкой являются самой частой причиной нестабильной работы и внезабных перезагрузок. Подготовьте microSD-карту класса A2 объемом от 64 ГБ или, что еще лучше, NVMe SSD через адаптер PCIe для Pi 5 — скорость чтения моделей и записи логов возрастает в разы. Установка операционной системы и базового окружения

Начните с установки последней версии Raspberry Pi OS (Bookworm или новее). В 2026 году настоятельно рекомендуется использовать 64-битную версию, так как большинство библиотек машинного обучения и драйверы NPU оптимизированы именно под архитектуру aarch64. После первой загрузки выполните полное обновление системы через терминал:

sudo apt update && sudo apt full-upgrade -y

sudo reboot

После перезагрузки установите необходимые системные зависимости для работы с Python, OpenCV и мультимедиа:

sudo apt install -y python3-pip python3-venv libopencv-dev libcamera-dev ffmpeg git cmake build-essential

Крайне важно использовать виртуальные окружения Python. Системный Python в современных дистрибутивах защищен от изменений, и попытка установить пакеты глобально приведет к ошибкам. Создайте рабочую директорию и окружение:

mkdir ~/yolo-project && cd ~/yolo-project

python3 -m venv venv

source venv/bin/activate

Теперь установите ключевые библиотеки. В 2026 году стек выглядит следующим образом: ultralytics (для работы с YOLO), opencv-python-headless (версия без GUI-зависимостей, легче и быстрее), numpy и, самое главное, драйверы для вашего AI-ускорителя. Для официального AI Kit установка выполняется одной командой:

sudo apt install hailo-all

pip install ultralytics opencv-python-headless numpy pillow

Если вы используете другой ускоритель, обратитесь к документации производителя для установки соответствующего runtime (например, rknn-toolkit2 для Rockchip или tflite-runtime для Coral). Проверьте установку, импортировав библиотеку Hailo или соответствующий бэкенд в интерпретаторе Python. Отсутствие ошибок означает, что железо готово к работе. Подготовка и экспорт модели YOLO для NPU

Это самый ответственный технический этап. Вы не можете просто взять стандартный файл. Pt и подать его на NPU. Модель должна быть сконвертирована в специальный формат (HEF для Hailo, RKNN для Rockchip, TFLite для Coral). В 2026 году фреймворк Ultralytics значительно упростил этот процесс, добавив нативную поддержку экспорта под популярные edge-платформы. Для начала скачайте предобученную нано-модель. Для Raspberry Pi оптимальны варианты nano или small. Версии medium и large будут работать слишком медленно даже с ускорителем. From ultralytics import YOLO

model = YOLO('yolo11n. Pt')

Далее выполните экспорт. Укажите целевой формат, соответствующий вашему железу. Для Hailo-8L команда будет выглядеть так:

model. Export(format='hef', imgsz=640, batch=1, int8=True)

Обратите внимание на параметр int8=True. Квантование до 8-битных целых чисел обязательно для достижения высокой производительности на NPU. Потеря точности при этом обычно составляет менее 1–2%, что приемлемо для большинства прикладных задач. Процесс экспорта включает в себя калибровку, для которой потребуется небольшой набор репрезентативных изображений (датасет калибровки). Ultralytics автоматически скачает набор COCO128 для этих целей, но для лучшего результата рекомендуется указать путь к вашим собственным данным, если вы планируете дообучение. После завершения экспорта вы получите файл с расширением. Hef (или другим, в зависимости от платформы). Именно этот файл будет загружаться в NPU во время инференса. Важно сохранить также файл метаданных (. Yaml), содержащий названия классов и информацию о постпроцессинге, так как NPU выполняет только свертки, а декодирование bounding boxes происходит на CPU. Написание скрипта инференса в реальном времени

Теперь перейдем к практике. Ниже представлен полный код скрипта захвата видео, инференса и отображения результатов. Код адаптирован для использования с Hailo Runtime, но логика остается схожей для других платформ. Сохраните его как detect. Py. Import cv2

import numpy as np

from hailo_platform import HEF, ConfigureParams, InputVStreamParams, OutputVStreamParams, InferVStreams

from ultralytics import YOLO

import time

Загрузка конфигурации и модели

hef = HEF('yolo11n. Hef')

target =. . . # Инициализация устройства Hailo (см. Документацию SDK)

network_group = target. Configure(hef)[0]

input_vstream_params = InputVStreamParams. Make(network_group)

output_vstream_params = OutputVStreamParams. Make(network_group)

Загрузка модели Ultralytics только для получения имен классов и параметров постпроцессинга

yolo_meta = YOLO('yolo11n. Pt')

class_names = yolo_meta. Names

cap = cv2. VideoCapture(0)

cap. Set(cv2. CAP_PROP_FRAME_WIDTH, 640)

cap. Set(cv2. CAP_PROP_FRAME_HEIGHT, 480)

cap. Set(cv2. CAP_PROP_FOURCC, cv2. VideoWriter_fourcc(*'MJPG'))

prev_time = time. Time()

with InferVStreams(network_group, input_vstream_params, output_vstream_params) as pipeline:

while True:

ret, frame = cap. Read()

if not ret:

break

   # Предобработка: ресайз и нормализация

    blob = cv2. Resize(frame, (640, 640))
    blob = blob. Astype(np. Float32) / 255. 0
    blob = np. Expand_dims(blob, axis=0)

    # Инференс на NPU
    raw_results = pipeline. Infer({
        hef. Get_input_vstream_infos()[0]. Name: blob
    })

    # Постпроцессинг (декодирование боксов, NMS)
    # В 2026 году рекомендуется использовать утилиты из hailo_model_zoo или ultralytics
    detections = postprocess_yolo(raw_results, conf_thresh=0. 5, iou_thresh=0. 45)

    # Отрисовка
    for det in detections:
        x1, y1, x2, y2, conf, cls = det
        label = f'{class_names[int(cls)]} {conf: . 2f}'
        cv2. Rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
        cv2. PutText(frame, label, (int(x1), int(y1)-10), cv2. FONT_HERSHEY_SIMPLEX, 0. 5, (0, 255, 0), 2)

    # Расчет и вывод FPS
    curr_time = time. Time()
    fps = 1 / (curr_time - prev_time)
    prev_time = curr_time
    cv2. PutText(frame, f'FPS: {fps: . 1f}', (10, 30), cv2. FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    cv2. Imshow('YOLO on RPi', frame)
    if cv2. WaitKey(1) & 0xFF == ord('q'):
        break

cap. Release()

cv2. DestroyAllWindows()

Важное замечание по коду: функция postprocess_yolo здесь указана схематично. В реальном проекте следует использовать готовые реализации из пакета hailo_model_zoo. Postprocessing или экспортировать модель сразу с включенным декодером (format='hef', nms=True), чтобы NPU выдавал уже готовые bounding boxes, а не сырые тензоры. Это существенно снижает нагрузку на CPU и повышает итоговый FPS. Оптимизация производительности и борьба за каждый кадр

Даже с NPU вы можете столкнуться с тем, что FPS ниже ожидаемого. Вот чеклист оптимизации, актуальный для 2026 года. Первое: убедитесь, что камера работает в формате MJPEG или RAW, а не в YUV. Декодирование H. 264/H. 265 на CPU съедает ресурсы. Установка CAP_PROP_FOURCC в MJPG, как показано выше, часто дает прирост в 5–8 FPS. Второе: используйте многопоточность. Захват кадра должен происходить в отдельном потоке, пока основной поток занят инференсом и отрисовкой. Библиотека threading или queue. Queue в Python позволяют реализовать конвейер, где камера никогда не ждет окончания обработки предыдущего кадра. Третье: настройте размер входного изображения. 640x640 — это стандарт, но для многих задач достаточно 320x320 или 416x416. Уменьшение разрешения в 4 раза ускоряет инференс почти линейно. Четвертое: отключите ненужные классы. Если вы детектируете только людей и автомобили, нет смысла тратить ресурсы на поиск тостеров и зонтиков. При экспорте модели можно указать список нужных классов, что уменьшит размер выходного тензора и ускорит постпроцессинг. Пятое: мониторьте тепловыделение. При температуре выше 80°C Raspberry Pi начинает троттлить, и FPS падает вдвое. Используйте команду vcgencmd measure_temp для проверки. Если температура стабильно высока, улучшите охлаждение или снизьте частоту кадров программно, дав железу передышки. Шестое: используйте headless-режим. Если вам не нужен локальный дисплей, а результаты передаются по сети, полностью откажитесь от cv2. Imshow(). Передача потока по RTSP или MQTT потребляет значительно меньше ресурсов, чем рендеринг на экране. Отладка, тестирование и типовые проблемы

При разработке вы неизбежно столкнетесь с проблемами. Самая частая — «модель не видит объекты». Причины: неправильная предобработка (нормализация, порядок каналов BGR/RGB), несоответствие размера входа, слишком высокий порог уверенности. Всегда начинайте отладку с статического изображения и визуализации промежуточных тензоров. Вторая проблема — низкая точность на специфических объектах. Предобученные модели COCO хороши для общего случая, но плохо различают, например, конкретные типы промышленных деталей. Решение: fine-tuning (дообучение) на собственном датасете. В 2026 году это делается за считанные часы через интерфейс Ultralytics HUB или локально с помощью LoRA-адаптеров, которые требуют минимум данных и вычислений. Третья проблема — утечки памяти при длительной работе. Скрипт падает через несколько часов. Причина: некорректное освобождение буферов камеры или тензоров. Используйте контекстные менеджеры (with), явно вызывайте gc. Collect() в цикле и профилируйте память с помощью memory_profiler. Четвертая проблема — рассинхронизация аудио и видео при записи. Решается использованием аппаратного кодирования через libcamera-vid или gstreamer вместо программного OpenCV VideoWriter. Для автоматизированного тестирования создайте набор эталонных изображений с размеченными bounding boxes и скрипт, который прогоняет модель и считает mAP. Это позволит объективно оценивать влияние каждой оптимизации на точность, а не полагаться на субъективное впечатление «стало быстрее». Ведите журнал изменений: какая версия модели, какие параметры экспорта, какой FPS и mAP получены. Это сэкономит недели работы в будущем. Практические примеры применения и интеграция

Теория оживает в проектах. Рассмотрим три сценария, реализуемых на этом стеке в 2026 году. Первый: умный домофон. Камера у двери детектирует лица и посылает событие в Home Assistant через MQTT. При обнаружении курьера система делает снимок и отправляет уведомление в Telegram. Интеграция занимает 15 минут благодаря готовым аддонам HA. Второй: сортировка отходов. Камера над конвейером распознает пластик, стекло и бумагу. Сигнал на сервопривод подается через GPIO. Здесь важна скорость: решение должно приниматься за <50 мс. Использование NPU и малого разрешения 320px позволяет уложиться в этот бюджет. Третий: мониторинг безопасности на производстве. Детекция касок, жилетов и запрещенных зон. Система пишет лог нарушений в базу данных SQLite и генерирует ежедневные отчеты. Важно настроить зону интереса (ROI), чтобы игнорировать проход за пределами цеха. Во всех случаях помните о приватности и этике. Обрабатывайте данные локально, не отправляйте видео в облако без необходимости, информируйте людей о ведении записи. Техническая возможность не всегда означает этическую допустимость. Заключение и перспективы развития

Создание системы распознавания объектов на Raspberry Pi в 2026 году — это баланс между доступностью, производительностью и гибкостью. Мы прошли путь от выбора железа до тонкой оптимизации, и теперь у вас есть все знания для реализации собственных проектов. Помните, что экосистема развивается быстро: следите за обновлениями Ultralytics, релизами новых NPU и публикациями в сообществе Raspberry Pi. Экспериментируйте, комбинируйте модели, делитесь результатами. Компьютерное зрение перестало быть магией — это ремесло, доступное каждому, кто готов учиться и практиковаться. Ваш следующий шаг — включить плату, запустить скрипт и увидеть, как мир вокруг оживает в рамке bounding box. Удачи в творчестве!

Комментарии (555)
profile Войдите в систему, чтобы опубликовать свой комментарий
Profile
Присоединился
Был
Посты
0
Голоса "За"
0
Голоса "Против"
0

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

Разрешить