7.16. Заключение¶
В этой главе были рассмотрены те части модуля ml, к которым обращается приложение OpenMV, когда шаг вывода является частью конвейера:
Концепции – что такое нейронная сеть с точки зрения арифметики (стек обучаемых операторов, отображающий тензор в тензор), что машинное обучение изменило по сравнению с классической обработкой изображений (написанный человеком итоговый алгоритм исчез, его заменили веса, выученные на размеченных данных), и демонстрация hello, которая запускала детектор лиц в нескольких строках Python.
Модуль ml – объект
ml.Modelи его свойства для исследования входных и выходных тензоров, пути к файлам моделей, которые он принимает, и где эти файлы находятся: раздел ROMFS только для чтения для выполнения непосредственно из флеш-памяти или любая другая файловая система MicroPython, когда модель можно скопировать в RAM во время загрузки.Конвейер вывода – три этапа, которые
predict()выполняет последовательно (предобработка, диспетчеризация движка, постобработка), дескрипторNormalizationна первом этапе, дескриптор постобработчика на третьем этапе и арифметика квантования, которая связывает целочисленные тензоры, с которыми работает камера, с вещественными числами, на которых обучалась сеть.Движки вывода – TFLM (интерпретатор операторов, который запускает большинство камер), CMSIS-NN (библиотека SIMD-ядер под ним на Cortex-M) и NPU (Arm Ethos-U55 на AE3 в паре с офлайн-компилятором Vela, ST Neural-ART на N6 в паре с STAI и STEdgeAI). Движок задан камерой; скрипт его не выбирает.
Декодирование вывода – постобработчики, которые превращают сырые выходные тензоры в рамки, ключевые точки или списки по классам, класс
NMS, который объединяет перекрывающиеся кандидаты, разбор YOLOv8, показывающий, как сохранить декодирование быстрым, применяя порог до деквантования, и протокол написания собственного декодера, когда каталог не охватывает модель.
7.16.1. Что теперь доступно¶
Три вещи, к которым подготавливает эта глава:
Загрузка обученной модели и её запуск. Всё, что находится в
/rom/, работает без дополнительной подготовки; всё, что предоставлено извне в виде совместимого.tflite, работает после того, как офлайн-инструмент для целевой камеры (Vela для AE3, STEdgeAI для N6) создаст правильную раскладку.Декодирование любого выходного тензора. Когда архитектура есть в каталоге, выбор правильного постобработчика механический:
YoloV8для модели YOLOv8,BlazeFaceдля BlazeFace и так далее. Когда её нет, протокол writing-your-own описывает контракт, а разбор YOLOv8 – самый понятный образец для копирования.Рассуждения о производительности. Модель, которая работает на скорости 30 FPS на NPU, может работать на скорости 3 FPS на Cortex-M7; соотношение зависит от того, какую часть сети камера может снять с CPU. Квантование, размещение в ROMFS, компиляция для NPU и охват операторов целевым движком – это четыре рычага, и в главе рассмотрен каждый из них.
7.16.2. ML сочетается с остальными возможностями камеры¶
Вывод редко выполняется изолированно. Модуль image захватывает и предобрабатывает кадр, модуль ml запускает сеть, а ulab.numpy выполняет любую числовую работу, для которой ни у одной из сторон нет встроенного средства. Типичный скрипт обнаружения объединяет все три: захват с помощью csi, при необходимости корректировка кадра с помощью image, запуск predict(), постобработка результата подходящим модулем из ml.postprocessing и обращение к ulab.numpy для любых пользовательских вычислений, которые приложение хочет выполнить поверх рамок, возвращённых постобработчиком. Эти три модуля используют одну и ту же модель памяти; границы между ними по возможности работают без копирования.