Развёртывание распознавания рукописных цифр на i.MX RT1060 MCU с TensorFlow Lite
Это руководство демонстрирует, как реализовать распознавание рукописных цифр на кроссоверном MCU i.MX RT1060, используя модель TensorFlow Lite и сенсорный GUI.
i.MX RT1060, работающий на ядре Arm® Cortex®‑M7, превосходит в стоимостно-эффективных промышленных решениях и высокопроизводительных потребительских устройствах, требующих богатых дисплейных интерфейсов. В этом туториале мы пройдёмся по созданию встроенного ML-приложения, которое детектирует и классифицирует нарисованные пользователем цифры, используя популярный пример MNIST eIQ.
Обзор датасета MNIST и модели
Мы используем стандартный датасет MNIST, состоящий из 60 000 обучающих и 10 000 тестовых изображений центрированных оттенков-серого рукописных цифр, каждая 28×28 пикселей. Данные собраны у старшеклассников и сотрудников Bureau of Census в США, поэтому они отражают североамериканские стили почерка. Свёрточные нейронные сети (CNN) отлично работают на этом датасете, и даже скромные архитектуры достигают высокой точности, делая TensorFlow Lite идеальным выбором для развёртывания на встраиваемом железе.

Рисунок 1. Пример датасета MNIST
Официальный репозиторий TensorFlow на GitHub предоставляет Python-реализацию модели MNIST, построенной с Keras, tf.data и tf.estimator. CNN достигает отличной производительности на тестовом наборе и служит референсом для нашего процесса конвертации.

Рисунок 2. Визуализация архитектуры модели
Ниже приведено сырое определение модели, соответствующее визуализации выше.

Рисунок 3. Определение модели TensorFlow
Что такое TensorFlow Lite и как оно используется здесь?
TensorFlow — широко принятая open-source платформа глубокого обучения от Google. Чтобы принести TensorFlow inference на ресурсо-ограниченные устройства, Google представил TensorFlow Lite — лёгкий рантайм, поддерживающий подмножество TensorFlow операций. Хотя TensorFlow Lite модели не могут быть дообучены на устройстве, их можно оптимизировать квантованием, приuning и другими пост-обучающими техниками для уменьшения размера и ускорения вывода.
Конвертация модели в TensorFlow Lite
Сначала мы обучаем модель с TensorFlow 1.13.2 для совместимости с инструментами конвертации. Затем модель конвертируется в формат .tflite командой:
tflite_convert --saved_model_dir= --output_file=converted_model.tflite --input_shape=1,28,28 --input_array=Placeholder --output_array=Softmax --inference_type=FLOAT --input_data_type=FLOAT --post_training_quantize --target_ops TFLITE_BUILTINS
После конвертации мы используем xxd для встраивания бинарной модели в наше приложение:
xxd -i converted_model.tflite > converted_model.h
Утилита xxd производит C/C++ заголовок, содержащий модель как байтовый массив, позволяя проекту eIQ загружать её прямо во время компиляции. Подробные инструкции можно найти в руководствах пользователя eIQ и официальной документации TensorFlow Lite.
Краткое введение в Embedded Wizard Studio
Чтобы воспользоваться графическими возможностями MIMXRT1060-EVK, мы включаем сенсорный GUI, построенный с Embedded Wizard Studio. IDE генерирует проекты MCUXpresso и IAR из SDK XNP, позволяя разработчикам тестировать интерфейс сразу на железе. Оценочная версия ограничивает сложность GUI и добавляет водяной знак, но полная лицензия снимает ограничения.
Поскольку сгенерированный GUI код на C, а примеры eIQ на C/C++, мы оборачиваем все включённые заголовки:
#ifdef __cplusplus extern "C" { #endif /* C code */ #ifdef __cplusplus } #endif
Мы также перемещаем исходные и заголовочные файлы в папку middleware SDK и корректируем пути включения. Устройственно-специфичные конфигурационные файлы сливаются для плавной сборки.
Готовое приложение и его функции
GUI представляет сенсорную зону ввода для рисования цифр и выходное поле, отображающее результат классификации. Две кнопки позволяют запустить инференс или очистить холст. После инференса приложение печатает предсказанную цифру и оценку уверенности в стандартный вывод для отладки.

Рисунок 4. GUI приложения с вводом, выводом и кнопками управления
Точность модели TensorFlow Lite
Хотя CNN достигает высокой точности на бумажных образцах MNIST, рукописные цифры, нарисованные на сенсорном экране, значительно отличаются. Это расхождение подчёркивает важность обучения на производственных данных, соответствующих целевой модальности ввода. Для улучшения производительности соберите новый датасет с сенсорного экрана и примените transfer learning, как описано в пошаговом руководстве NXP Community.
Детали реализации
Embedded Wizard использует слоты для реакции на взаимодействия пользователя. Слот рисования захватывает движения касания, рендеря линию в 1 пиксель основным цветом. Слот очистки сбрасывает оба поля ввода и вывода в цвет фона. Когда срабатывает слот запуска инференса, он извлекает битмап, ресайзит до 28×28 и подаёт в TensorFlow Lite интерпретатор.
Поскольку входной холст 112×112, мы предобрабатываем изображение так:
- Выделяем 8-битный массив 112×112 и инициализируем нулями.
- Копируем каждую нарисованную точку (значение 0xFF) в массив.
- Расширяем каждый пиксель в 3×3 блок для утолщения штрихов.
- Обрезаем и центрируем рисунок для соответствия предобработке MNIST.
- Ресайзим 112×112 изображение до 28×28, конвертируя каждый пиксель в float для модели.
Рисунок 5 иллюстрирует промежуточный массив после предобработки.

Рисунок 5. Предобработанный входной массив, готовый для инференса
TensorFlow Lite интерпретатор инициализируется один раз при старте. Для каждого запроса инференса предобработанный входной тензор копируется пиксель-за-пикселем в входной буфер интерпретатора. Память и рантайм-характеристики документированы в аппликейшн ноте NXP.
TensorFlow Lite: жизнеспособное решение
Развёртывание распознавания рукописных цифр на встраиваемых устройствах вызывает вызовы: ограниченные вычислительные ресурсы и вариативные модальности ввода. TensorFlow Lite смягчает эти проблемы, предоставляя лёгкий рантайм и богатую экосистему инструментов оптимизации. Ядро M7 i.MX RT1060 в сочетании с middleware SDK делает возможной реализацию сложных кейсов, вроде безопасной цифровой клавиатуры для электронного замка.
Обучение моделей на реальных производственных данных — цифрах, нарисованных пальцем на сенсорном экране — остаётся необходимым для поддержания высокой точности. Кроме того, региональные вариации почерка следует учитывать при проектировании датасета.
Серия кроссоверных MCU i.MX RT предлагает сбалансированную смесь производительности и стоимости, делая её подходящей для широкого спектра встраиваемых применений. Для деталей посетите страницу продукта i.MX RT.
Индустриальные статьи — форма контента, позволяющая партнёрам делиться полезными новостями, сообщениями и технологиями с читателями All About Circuits там, где редакционный контент не подходит. Все индустриальные статьи подчиняются строгим редакционным правилам для предоставления читателям полезных новостей, технической экспертизы или историй. Точки зрения и мнения в индустриальных статьях принадлежат партнёру и не обязательно совпадают с позицией All About Circuits или его авторов.
Промышленный робот
- Сокращение отходов и энергозатрат с автономными роботами
- Распознавание рукописных цифр на Raspberry Pi с TensorFlow и OpenCV
- Освоение управления питанием с кроссоверными МК NXP i.MX RT500
- Использование NXP i.MX RT500 для DSP-устройств: многопоточность, XOS и Cadence Fusion F1 Audio DSP
- Построение вариационного автоэнкодера с TensorFlow: практическое руководство
- Профессиональное руководство по использованию эпоксидной смолы для консервации произведений искусства
- Автоматизация обслуживания станков с ЧПУ с помощью коботов: повышение эффективности и точности
- Руководство новичка по программированию роботов Yaskawa Motoman: скорость и точность
- Руководство новичка: настройка RoboDK на Raspberry Pi
- Вызов функциональных блоков ПЛК через OPC UA клиентов: Практическое руководство