7.6. Анатомия predict¶
Model.predict(inputs, *, callback=None) – это место, где загруженный объект модели действительно выполняет работу. Между поступающими входными данными и выходным результатом последовательно проходят три этапа: предобработка, диспетчеризация движка, постобработка. Два из трёх принимают параметры, которыми скрипт управляет напрямую; движок посередине определяется камерой.
Три этапа predict(). Предобработка и постобработка принимают параметры, которыми управляет скрипт; движок посередине зафиксирован камерой.¶
7.6.1. Предобработка¶
Этап предобработки превращает каждый вход в плотный тензор, который ожидает сеть. Самый распространённый вход – image.Image, захваченный в RGB565. Этап обрезает и масштабирует его до input_shape сети, преобразует из RGB565 в формат каналов, на котором обучалась сеть (RGB888 для большинства сетей машинного зрения), применяет масштаб и смещение по каждому каналу и – когда сеть ожидает целочисленный вход – квантует к input_dtype модели за тот же проход. Сети, обученные для входа с плавающей точкой, пропускают шаг квантования и получают результат масштабирования и смещения напрямую.
Используемая по умолчанию ml.preprocessing.Normalization читает входной dtype модели и автоматически запускает нужное преобразование. Вручную настроенная Normalization переопределяет значения масштаба, среднего и стандартного отклонения для моделей, обученных на пользовательской статистике каналов (полученные из ImageNet средние и стандартные отклонения – распространённый случай). Обычный вызываемый объект полностью переопределяет этот этап – полезно, когда вход вовсе не является изображением или когда приложение уже само сформировало плотный тензор.
7.6.2. Диспетчеризация движка¶
Этап движка запускает сеть. То, на какой движок он диспетчеризует, зафиксировано камерой: H7 и RT1062 используют TFLM (интерпретатор TensorFlow Lite for Microcontrollers, диспетчеризующий оптимизированные под ARM ядра CMSIS-NN там, где они есть); AE3 использует тот же интерпретатор TFLM с откатом на Cortex-M55 и NPU Ethos-U, обрабатывающий любой оператор, помеченный для ускорителя офлайн-компилятором Vela; N6 использует STAI, среду выполнения ST для специализированного NPU процессора N6.
Скрипт не выбирает движок. Движок, поставляемый с камерой, запускает каждую модель, которую камера загружает.
7.6.3. Постобработка¶
Этап постобработки превращает сырые выходные тензоры сети обратно в пригодный результат. Поведение по умолчанию – деквантовать каждый выходной тензор до плавающей точки (или передать его без изменений для сетей с выходами с плавающей точкой) и вернуть их как список объектов ndarray. Большинство приложений регистрируют постобработчик – вызываемый объект, который знает компоновку выхода сети – чтобы декодировать тензоры в форму результата, с которой работает приложение: список ограничивающих рамок, список ключевых точек, список классов.
Скрипт управляет этим этапом двумя способами. Ключевое слово postprocess= в конструкторе регистрирует постобработчик, который запускается при каждом вызове. Ключевое слово callback= в predict() переопределяет зарегистрированный постобработчик только для одного вызова – полезно для переключения между несколькими декодерами без перезагрузки модели. Любая форма получает (model, inputs, outputs) и возвращает то, что ожидает приложение.
7.6.4. Чем управляет скрипт¶
Предобработка и постобработка – две рукоятки скрипта. Предобработчик по умолчанию справляется с большинством моделей машинного зрения; подходящий постобработчик для конкретного семейства сетей выбирается из каталога в ml.postprocessing. Движок посередине определяется сборкой и работает одинаково независимо от того, о чём просит скрипт.