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 для зрозумілих для людини назв класів – без жорсткого кодування, без припущень.