7.6. Анатомія predict¶
Model.predict(inputs, *, callback=None) – це місце, де завантажений об’єкт моделі фактично виконує роботу. Між входом даних та виходом результату послідовно виконуються три стадії: попередня обробка, диспетчеризація двигуна, постобробка. Дві з трьох приймають параметри, які скрипт контролює безпосередньо; двигун посередині визначається камерою.
Три стадії predict(). Попередня обробка та постобробка приймають параметри, якими керує скрипт; двигун посередині визначається камерою.¶
7.6.1. Попередня обробка¶
Стадія попередньої обробки перетворює кожен вхід у щільний тензор, який очікує мережа. Найпоширеніший вхід – image.Image, захоплений у форматі RGB565. Стадія обрізає та масштабує його до input_shape мережі, конвертує з RGB565 у формат каналів, на якому навчалась мережа (RGB888 для більшості мереж комп’ютерного зору), застосовує масштабування та зміщення по каналах і – коли мережа очікує цілочисельний вхід – квантує до input_dtype моделі за той самий прохід. Мережі, навчені для float-входу, пропускають крок квантування та отримують результат масштабування та зміщення безпосередньо.
Стандартний ml.preprocessing.Normalization зчитує тип вхідних даних моделі та автоматично виконує відповідне перетворення. Налаштований вручну 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. Постобробка¶
Стадія постобробки перетворює необроблені вихідні тензори мережі назад у придатний результат. Поведінка за замовчуванням – деквантування кожного вихідного тензора до числа з плаваючою комою (або пропуск без змін для мереж із float-виходами) та повернення їх у вигляді списку об’єктів ndarray. Більшість додатків реєструють постпроцесор – виклик, що знає компонування виходу мережі – для декодування тензорів у форму результату, з якою працює додаток: список обмежувальних прямокутників, список ключових точок, список класів.
Скрипт керує цією стадією двома способами. Ключове слово postprocess= у конструкторі реєструє постпроцесор, що виконується при кожному виклику. Ключове слово callback= у predict() перевизначає зареєстрований постпроцесор лише для одного виклику – корисно для перемикання між кількома декодерами без перезавантаження моделі. Обидві форми отримують (model, inputs, outputs) та повертають усе, що очікує додаток.
7.6.4. Що контролює скрипт¶
Попередня обробка та постобробка – два важелі скрипта. Стандартний препроцесор обробляє більшість моделей комп’ютерного зору; правильний постпроцесор для даного сімейства мереж вибирається з каталогу під ml.postprocessing. Двигун посередині визначається збіркою та працює однаково незалежно від того, що запитує скрипт.