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