Нейронная сеть на практике с Python и Keras
Машинное обучение — это область искусственного интеллекта, использующая статистические методы, чтобы предоставить компьютерным системам способность «учиться». То есть постепенно улучшать производительность в конкретной задаче, с помощью данных без явного программирования. Хороший пример — то, насколько эффективно (или не очень) Gmail распознает спам или насколько совершеннее стали системы распознавания голоса с приходом Siri, Alex и Google Home.
С помощью машинного обучения решаются следующие задачи:
- Распознавание мошенничества — отслеживание необычных шаблонов в транзакциях кредитных карт или банковских счетов
- Предсказание — предсказание будущей цены акций, курса обмена валюты или криптовалюты
- Распознавание изображений — определение объектов и лиц на картинках
Машинное обучение — огромная область, и сегодня речь пойдет лишь об одной из ее составляющих.
Из 2D в 3D
На этом сервисе вы сможете вдохнуть новую жизнь в свои старые фотографии, сделав их объемными. Весь процесс занимает меньше минуты, необходимо загрузить изображение и через несколько секунд получить 3D-модель, которую можно покрутить и рассмотреть во всех деталях. Впрочем, есть два нюанса — во-первых, фотография, должна быть портретной (для лучшего понимания требований на главной странице сайта представлены наиболее удачные образцы снимков, которые ранее загружали другие пользователи; во-вторых, детализация получаемой модельки зачастую оставляет желать лучшего, особенно, если фотография в низком разрешении. Однако авторы разрешают не только ознакомиться с результатом в окне браузера, но и скачать получившийся файл в формате obj к себе на компьютер, чтобы затем самостоятельно его доработать.
Из чего состоят нейросети
Обычная искусственная нейронная сеть состоит из десятков, сотен, тысяч или даже миллионов искусственных нейронов. Их называют блоками — они выстроены в слои, где каждый блок соединен с соседним. Есть блоки ввода, с помощью которых нейросеть получает информацию, и блоки вывода — они как раз отвечают за результат обработки.
Когда сеть обучается, образцы информации «скармливают» ей через блоки ввода, а затем добираются до блоков вывода. Например, можно показать нейросети огромное количество фотографий стульев и столов, максимально доступно объяснив ей разницу между этими предметами мебели. А затем попросить ее распознать объект на картинке, где изображен шкаф. В зависимости от того, насколько эффективно вы обучили нейросеть, она попытается отнести увиденное к категории, основываясь на имеющемся опыте.
Шаг 3. Добавляем набор данных
Набор данных нужен для обучения нейронной сети. Это входные данные, на основе которых нейронная сеть научится понимать, какой цветок расположен на картинке.
Сначала скачиваем набор данных (датасет) Google с цветами. В нашем примере — это набор небольших фотографий, отсортированный по папкам с их названиями.
Содержимое архива нужно распаковать в папку /tf_files классификатора.
Почему нейросети еще далеки до человеческого мозга?
Самым главным отличием, которое в корне меняет принцип и эффективность работы системы — это разная передача сигналов в искусственных нейронных сетях и в биологической сети нейронов. Дело в том, что в ИНС нейроны передают значения, которые являются действительными значениями, то есть числами. В человеческом мозге осуществляется передача импульсов с фиксированной амплитудой, причем эти импульсы практически мгновенные. Отсюда вытекает целый ряд преимуществ человеческой сети нейронов.
Во-первых, линии связи в мозге намного эффективнее и экономичнее, чем в ИНС. Во-вторых, импульсная схема обеспечивает простоту реализации технологии: достаточно использование аналоговых схем вместо сложных вычислительных механизмов. В конечном счете, импульсные сети защищены от звуковых помех. Действенные числа подвержены влиянию шумов, в результате чего повышается вероятность возникновения ошибки.
Пример использования экосистемы X-CUBE-AI
В данном разделе рассмотрен практический пример проектирования нейронной сети на базе отладочной платы NUCLEO-G474RE.
Внешний вид платы показан на рисунке 7.
Рис. 7. Внешний вид платы NUCLEO-G474RE
Эта плата содержит микроконтроллер STM32G474RET6 в корпусе с 64 выводами. Максимальная частота ядра процессора – 170 МГц, объем Flash-памяти – 512 кбайт, объем статической памяти – 128 кбайт. Также плата содержит встроенный высокоскоростной отладчик/программатор ST-LINK/V3, что позволяет производить программирование и отладку платы без использования каких-либо внешних отладочных средств.
Микроконтроллеры семейства STM32G4 обладают высокой производительностью и богатым набором периферийных устройств. Также производитель предлагает широкий набор программных и отладочных средств для разработки, в том числе решений в области нейронных сетей, поэтому представитель именно этого семейства был выбран для практического рассмотрения.
Как было показано выше, для развертывания нейросети в микроконтроллере STM32 нужна готовая тренированная модель сети. Для данного примера будет использована нейросеть HAR-CNN-Keras, исходный код которой доступен для скачивания по ссылке: Это – сверточная нейросеть, написанная с использованием открытой нейросетевой библиотеки Keras. Сеть служит для распознавания нескольких элементов активности человека, таких как спуск по лестнице, пробежка, сидение, стояние, подъем по лестнице, пешая прогулка. Входными данными для сети являются показания нескольких акселерометров, расположенных в смартфоне и обеспечивающих 20 выборок данных в секунду.
Для загрузки модели нейросети переходим по ссылке, указанной выше, и в окне проекта кликаем мышкой на файл model.h5, как это показано на рисунке 8.
Рис. 8. Выбор модели нейросети
Далее нажимаем кнопку “Download” и сохраняем файл в удобном для работы месте (рисунок 9). Для целей этого примера файл модели переименован в «har_github.h5».
Рис. 9. Загрузка файла модели
Для программирования отладочной платы необходимо установить программное обеспечение. Для начала нужно установить STM32CubeMX версии 5.1.0 или новее. На момент написания статьи самой свежей является версия программы 6.0.0. STM32CubeMX доступен как для операционной системы Windows, так и для Linux. Заодно можно скачать пакет расширения X-CUBE-AI и среду STM32CubeIDE, которая будет необходима для компиляции сгенерированного кода.
После установки STM32CubeMX пакет X-CUBE-AI устанавливается следующим образом.
- Запускается STM32CubeMX. В меню выбирается пункт «Help» → «Manage embedded software packages», можно также напрямую нажать кнопку «INSTALL/REMOVE», как это показано на рисунке 10.
Рис. 10. Выбор встроенных пакетов в STM32CubeMX
- В окне «Embedded Software Packages Manager» нажимаем кнопку «Refresh» для получения обновленного списка дополнительных модулей. Для поиска X-CUBE-AI выбираем вкладку «STMicroelectronics», как это показано на рисунке 11.
Рис. 11. Установка X-CUBE-AI в STM32CubeMX
Если X-CUBE-AI уже был установлен, желательно удалить его перед новой установкой.
- Необходимая версия пакета выбирается и устанавливается путем нажатия кнопки «Install Now». После завершения установки квадрат рядом с необходимой версией пакета становится зеленым, после чего можно нажать кнопку «Close» (рисунок 12).
Рис. 12. X-CUBE-AI в STM32CubeMX
После установки и запуска приложения STM32CubeMX выбираем пункт «ACCESS TO BOARD SELECTOR» (рисунок 13).
Рис. 13. Выбор отладочной платы NUCLEO-G474RE в STM32CubeMX
В открывшемся окне в поле «Commercial Part Number» набираем «NUCLEO-G474RE», в списке «Board List» выделяем необходимую отладочную плату (рисунок 14).
Рис. 14. Инициализация проекта
Двойным кликом запускаем проект (рисунок 15). При запуске проекта появляется сообщение “Initialize all peripherals with their Default Mode?”(«Инициализировать всю периферию в состояние по умолчанию?»). Отвечаем “Yes” («Да»).
Рис. 15. Запуск проекта
Выводы контроллера также автоматически сконфигурированы согласно трассировке отладочной платы NUCLEO-G474RE.
Тактовую частоту проекта можно проверить и, при необходимости, изменить во вкладке “Clock configuration” («Настройка тактовой частоты»), как это показано на рисунке 16.
Рис. 16. Настройка тактовой частоты
Для отладочной платы NUCLEO-G474RE максимальная частота ядра – 170 МГц. Именно это значение (параметр «HCLK (MHz)») и было выбрано (рисунок 16).
Для обмена данными с компьютером используется порт LPUART1, основные настройки которого можно посмотреть, выбрав «Categories» à «Connectivity» à «LPUART1», как это показано на рисунке 17.
Рис. 17. Настройки порта UART
Далее необходимо подключить к проекту модуль X-CUBE-AI. Для этого выбираем в меню «Software Packs» → «Select components.» Затем в открывшемся окне выбираем «STMicroelectronics.X-CUBE-AI» → «Artificial Intelligence X-CUBE-AI» → «Core», и «Application» → «Application template», как это показано на рисунке 18.
Рис. 18. Выбор модуля X-CUBE-AI
Существует несколько типов приложений, которые можно выбрать:
- System performance – для проверки производительности реализаций различных нейросетей на целевой платформе;
- Validation – для проверки производительности нейросетей и сравнения результатов вычислений;
- Application template – шаблон, позволяющий создавать пользовательские приложения. Этот тип приложения используется в данном примере и также позволяет оценить производительность и сравнить результаты вычислений.
Далее выбираем «Categories» → «STMicroelectronics.X-CUBE-AI». В окне «Configuration» → Model inputs» выбираем название для модели нейросети – в данном примере это network (рисунок 19). Тип сети – «Keras», выбираем «Saved model», то есть используется заранее сохраненная сеть. Указываем путь до файла нейросети *.h5, который был ранее загружен. Выбираем степень сжатия модели – в данном случае 8, и нажимаем кнопку «Analyze». После окончания анализа проверяем вычислительные ресурсы, необходимые для реализации данной сети с заданной степенью сжатия. Согласно рисунку 19, необходимо 367 кбайт Flash-памяти и 25 кбайт памяти RAM. В скобках рядом указаны размеры памяти выбранного микроконтроллера.
Рис. 19. Расчет вычислительных ресурсов
Коэффициент сжатия 8 был выбран из-за ограниченного объема памяти, так как модель с коэффициентом 4 уже не вместилась бы во Flash-память выбранного микроконтроллера.
Далее необходимо проверить, насколько точно код, сгенерированный для микроконтроллера, соответствует оригинальной модели нейросети. Для этого существует два вида тестов: на компьютере и на устройстве STM32 (рисунок 20).
Рис. 20. Виды проверки нейросети
Модель нейросети, сгенерированная на языке С, запускается на выполнение на процессоре х86 или STM32, и результат выполнения сравнивается с оригинальной моделью. При ошибке L2 меньше 0,01 результат построения С-модели считается успешным. Большое влияние на ошибку оказывает степень сжатия.
Сначала проверяется модель на компьютере в среде х86. После нажатия кнопки «Validate on desktop» открывается окно, отображающее процесс проверки. В данном случае в качестве входных данных используются случайные числа. Результат выполнения проверки на компьютере показан на рисунке 21.
Рис. 21. Результат проверки модели на компьютере
Ошибка L2 = 5,01e-07, что значительно меньше допустимой погрешности 0,01. Также виден процент использования вычислительных ресурсов разными слоями нейросети.
Для проверки модели на STM32 нажимаем кнопку «Validate on target». При этом открывается окно конфигурации проверки (рисунок 22).
Рис. 22. Настройка проверки модели в STM32
Имя порта зависит от операционной системы. В данном примере использовалась система Ubuntu18.04, где порт для связи с отладочной платой получил автоматическое название /dev/ttyACM0. В операционной системе Windows это будут названия типа COM1, COM2 и так далее. Скорость 115200 соответствует настройкам проекта. Для проверки модели в микроконтроллере необходима среда (Toolchain/IDE) для компиляции исходных кодов, сгенерированных с помощью STM32CubeMX. В данном случае для компиляции используется среда STM32CubeIDE, которая была предварительно установлена на компьютер.
После выполнения необходимых настроек нажимаем «OK» и ожидаем выполнения теста, который включает в себя компиляцию проекта, прошивку платы, выполнение теста, анализ полученных результатов. На рисунке 23 показан результат выполнения теста.
Рис. 23. Результат выполнения теста в STM32
Ошибка L2 в этом случае также значительно меньше 0,01, а значит модель, сгенерированная для микроконтроллера STM32, соответствует оригинальной.