5.34. Подведение итогов

Модуль image – это крупнейший API, который предоставляет камера, и эта глава только что охватила его в общих чертах: как изображение представлено в памяти, как камера читает и записывает отдельные пиксели, как она рисует в захваченных кадрах, как она преобразует их арифметически и геометрически, как она выполняет пороговую классификацию и фильтрацию, как она извлекает из них измерения и обнаружения, как она декодирует из них напечатанные символы, как она сравнивает одно изображение с другим и как она передаёт результаты на камеру и с неё.

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

5.34.1. Шаблон конвейера

Большинство нетривиальных приложений камеры следуют одной и той же схеме. Захватите кадр с датчика. Предобработайте его: преобразуйте форматы, выровняйте гистограмму, размойте шум. Локализуйте интересующие области или признаки: обнаружение блобов, обнаружение линий, сопоставление шаблонов, декодирование кодов. Проанализируйте то, что было найдено: геометрические измерения, оценка схожести, статистика. Решите, что делать на основе анализа: переключить GPIO, отправить полезную нагрузку, захватить-и-записать, передать кадр модели машинного обучения. Выведите решение или захваченный артефакт: сохраните, закодируйте, отправьте, нарисуйте обратно в кадр для предпросмотра в IDE.

Ни одна страница главы не охватывала каждый шаг; глава охватывала строительные блоки, из которых составляется конвейер. Выбор того, какие блоки использовать и в каком порядке – это работа скрипта приложения.

5.34.2. Куда ведёт эта глава

Модуль image имеет дело с изображениями как с изображениями – пиксели, области, рисование, обнаружения. Множество задач по работе с захваченными данными не вписывается в эти рамки. Вычисление статистики по произвольному числовому массиву, выполнение векторизованной арифметики над сырыми данными датчика, применение пользовательского матричного преобразования, за которым не стоит метод модуля image, подготовка данных для модели машинного обучения, которой нужна определённая компоновка тензора – всё это задачи для библиотеки числовых массивов, а не для библиотеки обработки изображений.

Следующая глава охватывает именно это. Модуль ulab.numpy, поставляемый с MicroPython на камере, является подмножеством NumPy, и два моста соединяют его с модулем image: to_ndarray() копирует пиксели кадра в ndarray для численной работы, а конструктор Image принимает ndarray, чтобы построить новое изображение из результата, готовое к отображению, сохранению или возврату в библиотеку image. Два модуля сочетаются – каждый делает то, чего не делает другой, и вместе они охватывают числовую и визуальную работу, которая нужна приложению встраиваемого зрения.