7.1. Что такое нейронная сеть¶
Нейронная сеть – это алгоритм, поведение которого обучается на примерах, а не пишется вручную. Одна и та же архитектура сети, получив миллион изображений лиц, обучается обнаруживать лица. Та же архитектура, получив миллион изображений рук, обучается обнаруживать руки. Та же архитектура, получив размеченный набор данных со множеством категорий объектов, обучается обнаруживать их все сразу. От задачи к задаче меняются только веса, а сами веса создаются процессом обучения вне устройства, который сравнивает предсказания сети с размеченными примерами и корректирует веса до тех пор, пока они не совпадут.
7.1.1. Механизм работы¶
Нейронная сеть – это стек слоёв. Каждый слой умножает выход предыдущего слоя на матрицу весов, прибавляет вектор смещения и применяет к результату нелинейную функцию. Выход одного слоя является входом следующего. Захваченное изображение поступает на вершину стека, проходит вниз через десятки или сотни слоёв и выходит снизу в виде тензора, элементы которого описывают, что было на изображении.
То, что делают веса каждого слоя, зависит от того, на чём была обучена сеть. Матрица весов раннего слоя в сети машинного зрения может срабатывать на короткой горизонтальной границе; чуть более глубокий слой может срабатывать на углу; ещё более глубокий – на круглой форме глаза; самые глубокие слои могут срабатывать на расположении черт всего лица. Ничего из этого не было написано вручную. Процесс обучения прошёл по миллионам размеченных примеров, сдвигая веса вниз по функции потерь, и иерархия «граница – угол – глаз – лицо» сложилась сама из данных.
Небольшая классификационная сеть в виде стека слоёв. Входной тензор поступает сверху с формой захваченного изображения и проходит вниз через слои, каждый из которых преобразует размерности тензора. Выходной тензор внизу содержит по одному элементу на каждый класс. Сети обнаружения и сети ключевых точек имеют ту же форму стека слоёв; меняется лишь интерпретация выходного тензора.¶
Архитектура сети – то, как расположены слои и какие операции их соединяют, – определяет то, что сеть может делать. Веса – это то, что сеть выучила. Задача камеры в этом процессе – загрузить файл весов, созданный при обучении, и выполнить ту же арифметику, что выполнял тренер, но для захваченного кадра, а не для обучающего набора.
7.1.2. Что подаётся на вход и что получается на выходе¶
Оба конца сети представляют собой тензоры – многомерные массивы чисел, тот же тип объектов, что был только что представлен в главе про numpy. Входной тензор для сети машинного зрения – это захваченное изображение, преобразованное в формат, который ожидает сеть: обычно это 4-элементная форма (B, H, W, C), где B – размер пакета (всегда 1 на камере, так как кадры обрабатываются по одному), H и W – ожидаемые сетью высота и ширина в пикселях, а C – количество каналов (3 для RGB-сети, 1 для оттенков серого).
Выходной тензор зависит от назначения сети:
Сеть классификации выдаёт одномерный тензор оценок уверенности, по одной на каждый класс. Индекс наибольшей оценки – это предсказанный класс. Детектор присутствия человека на основе MobileNet, который поставляется с большинством камер, имеет такую форму: две оценки, одна для «человек», другая для «не человек».
Сеть обнаружения выдаёт двумерный тензор, элементы которого описывают список ограничивающих рамок и вероятности классов. YOLOv8 имеет такую форму: тензор
(84, N), где 4 из 84 строк – это значения регрессии рамки, а остальные 80 – вероятности по классам, повторённые дляNякорных позиций.Сеть ключевых точек выдаёт тензор, элементы которого – пиксельные координаты именованных ориентиров. Модель лицевых ориентиров MediaPipe имеет такую форму: 468 ключевых точек на каждое обнаруженное лицо.
Сеть сегментации выдаёт двумерный тензор, элементы которого – попиксельные метки классов; те же размерности, что и у входа, с индексом категории в каждой позиции.
Сеть регрессии выдаёт одно число или короткий вектор чисел – оценку глубины, угол, температуру.
У каждой формы есть свой постобработчик на камере, который преобразует исходный выходной тензор обратно в форму результата, используемую остальной частью приложения, – ограничивающие рамки, списки ключевых точек, метки классов, числовые оценки. Постобработчик – это код на стороне приложения, который знает формат выхода сети; сама же сеть – это лишь арифметика, производящая тензор.
7.1.3. Почему это работает на камере¶
Два приёма в арифметике делают это применимым для устройства класса микроконтроллера. Первый – квантование. Обучение происходит в 32-битной арифметике с плавающей точкой; вывод может выполняться в 8-битной целочисленной арифметике практически без потери точности для большинства сетей. 8-битные веса занимают четверть памяти и работают в несколько раз быстрее, чем 32-битные числа с плавающей точкой. Каждая модель, поставляемая с камерой, уже была квантована вне устройства.
Второй – аппаратное ускорение. Ту же арифметику, которую центральный процессор микроконтроллера выполняет по одной инструкции за раз, ускоритель нейронных сетей выполняет сотнями операций сразу. Новые камеры (AE3 и N6) несут на борту выделенный модуль нейронной обработки (NPU) – тензорный ускоритель на SoC, – который превращает модель, выполнявшуюся бы секунду на CPU, в модель, работающую за десятки миллисекунд. Глава про движки вывода описывает, как выглядит часть этого процесса на камере.
7.1.4. Что охватывает глава¶
Обучение – не задача камеры. Обученная модель попадает на камеру в виде файла .tflite; камера загружает его, пропускает через него каждый захваченный кадр и декодирует получившийся тензор в результат, на который может реагировать приложение. Всё дальнейшее посвящено каждому из этих шагов:
загрузка и осмотр модели;
раздел флеш-памяти, где хранятся файлы моделей;
четыре стадии вызова вывода;
движки, которые фактически выполняют арифметику;
и постобработчики, которые превращают выходной тензор обратно в список рамок, ключевых точек или классов.
Каждый из детекторов в главе про изображения был рассчитан на конкретную задачу. Те, что охватывает остальная часть этой главы, обучаются на данных, при этом один и тот же движок выполняет любую модель, которую загружает скрипт. Изменение рабочего процесса, пришедшее вместе с ними, – замена алгоритма под конкретную задачу на файл весов под конкретную задачу – это следующее, что стоит рассмотреть.