7.4. Завантаження моделі#

ml.Model читає файл моделі з флеш-пам’яті, аналізує його, виділяє оперативну пам’ять, необхідну мережі під час інференсу, та повертає об’єкт, що містить усе необхідне для роботи решти скрипта із завантаженою мережею.

7.4.1. Конструктор#

Конструктор приймає шлях та необов’язковий постпроцесор:

model = ml.Model("/rom/blazeface_front_128.tflite",
                 postprocess=BlazeFace())

Моделі на /rom/ (файлова система, що зберігається у флеш-пам’яті) зчитуються безпосередньо: ваги мережі залишаються у флеш-пам’яті, а завантажена модель використовує лише обсяг оперативної пам’яті, що відповідає тензорній арені. Моделі на /sdcard/ копіюються в оперативну пам’ять під час завантаження, тому загальна вартість дорівнює розміру файлу моделі плюс тензорна арена. Обидва шляхи підходять; компроміс полягає у використанні оперативної пам’яті.

Якщо поряд існує файл .txt з тим самим базовим ім’ям, його вміст автоматично завантажується до labels. Ключове слово postprocess= реєструє виклик, який predict() виконує після кожного інференсу.

7.4.2. Властивості лише для читання#

Завантажена модель надає невеликий набір властивостей лише для читання, що описують мережу без її запуску.

Файл та пам’ять.

  • len – розмір файлу моделі на диску, у байтах.

  • ram – розмір тензорної арени, необхідної мережі для проміжних активацій під час інференсу, у байтах.

Вхідні тензори.

  • input_shape – список кортежів, по одному на вхідний тензор, що описує форму, яку очікує мережа. Мережі комп’ютерного зору мають один вхід із формою (1, H, W, C).

  • input_dtype – список кодів типів даних у вигляді одного символу ('b' int8, 'B' uint8, 'h' int16, 'H' uint16, 'f' float32), по одному на вхід.

  • input_scale та input_zero_pointпараметри квантування, що перетворюють між дійсно-значеним входом, на якому навчалась мережа, та цілочисельним представленням, яке використовує камера.

Вихідні тензори. Дзеркало вхідного набору: output_shape, output_dtype, output_scale, output_zero_point. Мережі виявлення виробляють два або три вихідних тензори (рамки, оцінки впевненості, іноді ймовірності класів); класифікаційні мережі виробляють один.

Додатково. labels – це список назв класів, завантажений із суміжного файлу .txt, або None. postprocess – зареєстрований постпроцесор, або None.

7.4.3. Перевірка BlazeFace#

Завантаження вбудованої моделі BlazeFace та виведення кожної властивості дає реальні числа:

import ml
from ml.postprocessing.mediapipe import BlazeFace

model = ml.Model("/rom/blazeface_front_128.tflite",
                 postprocess=BlazeFace())

print("file size:    ", model.len, "bytes")
print("tensor arena: ", model.ram, "bytes")
print("input shape:  ", model.input_shape)
print("input dtype:  ", model.input_dtype)
print("input scale:  ", model.input_scale)
print("input zp:     ", model.input_zero_point)
print("output shape: ", model.output_shape)
print("output dtype: ", model.output_dtype)
print("output scale: ", model.output_scale)
print("output zp:    ", model.output_zero_point)

Числа конкретно описують інтерфейс мережі: один вхідний тензор (1, 128, 128, 3) типу int8 та два вихідних тензори int8 – один для коефіцієнтів регресії рамок, другий для оцінок впевненості по якорях. Параметри квантування описують, як ці значення int8 відповідають дійсним числам float, на яких навчалась мережа; постпроцесор використовує їх для скасування квантування перед декодуванням рамок.

Кожна властивість є єдиним джерелом достовірності для того, що вона описує. Скрипти зчитують input_shape, щоб знати роздільну здатність захоплення, зчитують output_scale та output_zero_point для ручного декодування тензорів, та зчитують labels для зрозумілих для людини назв класів – без жорсткого кодування, без припущень.