Основы ML для периферийных устройств (2/4)
Разбираем алгоритмы, методы оптимизации и полный жизненный цикл Edge AI — от выбора модели до развёртывания на микроконтроллере.
В предыдущем модуле мы выяснили, что такое Edge AI и зачем он нужен во встраиваемых системах. Теперь погрузимся глубже: разберём, какие алгоритмы подходят для ресурсоограниченных устройств, как их оптимизировать и как выглядит полный цикл разработки Edge AI-приложений.
Типы алгоритмов для Edge AI
Далеко не каждый алгоритм машинного обучения можно запустить на микроконтроллере. Разберёмся, что делает Edge AI-алгоритмы эффективными и какие классы задач они решают.
Эффективные алгоритмы для ресурсоограниченных устройств
Микроконтроллеры и другие периферийные устройства жёстко ограничены по памяти, вычислительной мощности и энергопотреблению. Поэтому алгоритмы Edge AI должны быть максимально компактными и быстрыми [1].
Первый критерий — малое потребление памяти. Модель должна помещаться во Flash-память (для хранения) и SRAM (для выполнения инференса). Типичная TinyML-модель занимает от 10 КБ до 250 КБ в зависимости от железа [2].
Второй критерий — низкая вычислительная сложность: нужно минимизировать количество математических операций при формировании предсказания. Это обычно измеряют в FLOPS (операций с плавающей точкой в секунду) или MACs (операций умножения с накоплением).
Для приложений реального времени также важна предсказуемая задержка — время отклика между двумя событиями должно быть примерно постоянным. Наконец, для устройств с батарейным питанием критична энергоэффективность.
В таблице ниже — наиболее распространённые типы моделей в Edge AI:
| Model Type | Characteristics | Typical Use Cases |
|---|---|---|
| Decision trees | Low memory consumption, fast inference | Simple classification, anomaly detection |
| Small neural networks | Balance between accuracy and efficiency | Signal classification, pattern recognition |
| Optimized CNNs | Efficient for spatial data | Computer vision, image classification |
| Anomaly detection models | Low resource consumption | Predictive maintenance, sensor monitoring |
Классификация, регрессия и детектирование аномалий
Алгоритмы машинного обучения различаются по типу решаемой задачи. Понимание этих различий помогает выбрать правильный подход для конкретного приложения [3].
Классификация
Классификация — задача обучения с учителем, при которой модель присваивает входным данным метку категории. В процессе обучения модель учится различать заранее заданные классы.
Выход модели — категория, например «норма» или «аномалия». Задача может быть бинарной (два класса) или многоклассовой (более двух вариантов). При инференсе модель выдаёт вероятность принадлежности к каждому классу вместе с уверенностью предсказания.
В Edge AI классификация применяется для распознавания голосовых команд, классификации жестов по данным акселерометра, идентификации звуков окружающей среды и определения активности человека (ходьба, бег и т.д.).
Качество классификатора оценивается следующими метриками:
- Accuracy (Точность): доля правильных предсказаний от общего числа.
- Precision (Точность по классу): доля корректно предсказанных положительных примеров.
- Recall (Полнота / Чувствительность): доля реальных положительных примеров, которые модель правильно обнаружила.
- F1-Score: гармоническое среднее между Precision и Recall. В отличие от простого среднего, штрафует за дисбаланс — высокий F1-Score достигается только при хороших значениях обеих метрик.
Регрессия
Регрессия — задача обучения с учителем, при которой модель предсказывает непрерывное числовое значение, обучаясь математической зависимости между входными и выходными переменными.
В отличие от классификации, выход — число, которое может принимать любое значение в некотором диапазоне. Модель аппроксимирует функцию, отображающую входы в выходы, что полезно для количественных предсказаний.
Примеры применения регрессии в Edge AI: прогнозирование температуры или влажности по показаниям датчиков, оценка оставшегося заряда батареи, предсказание энергопотребления, оценка расстояния или положения.
Метрики оценки регрессии отличаются от метрик классификации:
- MSE (Mean Squared Error): среднее квадратов ошибок. Возведение в квадрат делает метрику чувствительной к выбросам — большие ошибки влияют непропорционально сильно.
- MAE (Mean Absolute Error): среднее абсолютных значений ошибок. Более интуитивна, чем MSE, поскольку выражена в тех же единицах, что и предсказываемая переменная, и менее чувствительна к выбросам.
- R² (Коэффициент детерминации): доля дисперсии, объяснённой моделью. Значение 1.0 — идеальное соответствие, 0.0 — модель не лучше простого среднего.
Детектирование аномалий
Детектирование аномалий — задача выявления паттернов, значительно отклоняющихся от нормального поведения. В отличие от традиционной классификации, такие модели обычно обучаются только на «нормальных» данных [4].
Модель учится, что считать нормой, а при инференсе фиксирует отклонения от этого паттерна. Главное преимущество: не нужны примеры всех возможных аномалий — это идеально, когда аномалии редки, непредсказуемы или заранее неизвестны.
В промышленности детектирование аномалий позволяет выявлять нетипичную вибрацию двигателей, посторонние звуки в оборудовании и нерегулярное потребление электроэнергии. В сфере безопасности — обнаруживать вторжения и подозрительное поведение.
Основные метрики оценки:
- True Positive Rate (Чувствительность): доля реальных аномалий, которые модель правильно обнаружила.
- False Positive Rate (Ложная тревога): доля нормальных случаев, ошибочно классифицированных как аномалии. Высокое значение порождает лишние предупреждения.
- AUC-ROC: кривая ROC (Receiver Operating Characteristic) показывает компромисс между чувствительностью и долей ложных тревог при разных порогах принятия решений. AUC — площадь под этой кривой: 1.0 — идеальное разделение классов, 0.5 — случайная классификация.
Детектирование объектов
Детектирование объектов объединяет классификацию и локализацию: модель одновременно определяет, что изображено на картинке, и где именно. Это более сложная задача, требующая больше вычислительных ресурсов, чем простая классификация [5].
Модель не просто классифицирует всё изображение целиком — она находит несколько объектов, указывает их расположение с помощью ограничивающих рамок (bounding boxes) и присваивает каждому класс. Для этого нужны специализированные архитектуры — YOLO (You Only Look Once) или SSD (Single Shot Detector), способные обнаруживать несколько объектов за один проход через сеть.
В Edge AI детектирование объектов применяется для подсчёта людей в торговых помещениях, контроля наличия товаров на полках, выявления дефектов на производственных линиях и мониторинга дикой природы.
Обработка сигналов и компьютерное зрение
По типу обрабатываемых данных Edge AI-приложения делятся на две большие категории: обработка сигналов и компьютерное зрение. У каждой — свои особенности, техники и требования к ресурсам.
Обработка сигналов
Обработка сигналов работает с последовательными данными от датчиков: акселерометров, микрофонов, датчиков окружающей среды. Такие данные обычно одномерны или низкоразмерны, что делает их более удобными для ресурсоограниченных устройств [6].
Входные данные — временные ряды, аудиосигналы или показания датчиков. Перед подачей в модель применяется предобработка: фильтрация, нормализация, извлечение признаков. Итоговые модели обычно занимают менее 50 КБ и обеспечивают задержку в несколько миллисекунд.
Наиболее распространённые преобразования для извлечения признаков из сигналов:
- FFT (Fast Fourier Transform): переводит сигнал из временной области в частотную, выявляя частотные составляющие, скрытые в исходном сигнале.
- MFCC (Mel-Frequency Cepstral Coefficients): компактное представление аудиосигнала, имитирующее восприятие человеческого слуха. Широко используется в распознавании речи.
- Спектрограммы: визуальное представление того, как частотное содержимое сигнала меняется во времени.
Компьютерное зрение
Компьютерное зрение обрабатывает изображения и видео для извлечения визуальной информации. Такие приложения, как правило, требуют больше ресурсов из-за высокой размерности данных: небольшое изображение 96×96 пикселей в оттенках серого содержит более 9 000 значений [7].
Предобработка включает изменение размера изображений, нормализацию значений пикселей и аугментацию данных. Наиболее распространённые архитектуры — свёрточные нейронные сети (CNNs), в особенности оптимизированные варианты: MobileNet и EfficientNet. Размер моделей варьируется от 50 КБ до более чем 500 КБ, типичная задержка — от десятков до сотен миллисекунд.
При реализации компьютерного зрения на периферийных устройствах стоит учитывать несколько факторов. Уменьшение разрешения изображения существенно снижает вычислительные требования. Изображения в оттенках серого требуют в 3 раза меньше памяти, чем цветные. Архитектуры MobileNet и EfficientNet специально разработаны для мобильных и встраиваемых систем и обеспечивают хороший баланс между точностью и эффективностью.
TinyML: машинное обучение на ресурсоограниченных устройствах
TinyML — это пересечение машинного обучения и ультраэффективных встраиваемых систем. Разберём фундаментальные принципы, позволяющие запускать ML-модели на микроконтроллерах с минимальными ресурсами.
Принципы и методы оптимизации
Чтобы запустить ML-модель на устройстве с килобайтами памяти и милливаттами потребляемой мощности, нужны специализированные техники оптимизации [8]. Они применяются как на этапе проектирования модели, так и после обучения.
Эффективное проектирование модели
Первый шаг в TinyML — выбор или проектирование изначально эффективных архитектур. Слой — это группа связанных информационных единиц. Неглубокие нейронные сети с 2–4 слоями достаточны для многих задач Edge AI и уменьшают как размер модели, так и время инференса.
Depthwise Separable Convolutions, применяемые в архитектурах типа MobileNet, значительно сокращают число операций в свёрточных слоях, разделяя пространственные свёртки и свёртки по каналам [9]. Дополнительно уменьшение числа каналов ограничивает количество фильтров в каждом слое, пропорционально снижая размер модели и число операций.
Прореживание (Pruning)
Pruning — удаление связей или нейронов, которые практически не влияют на выходные данные модели [10]. Есть два основных подхода: неструктурированное прореживание удаляет отдельные веса со значениями, близкими к нулю, а структурированное прореживание — целые нейроны, каналы или слои.
Эта техника позволяет уменьшить размер модели на 50–90% при минимальной потере точности — в зависимости от задачи и степени прореживания.
Дистилляция знаний (Knowledge Distillation)
Эта техника обучает маленькую модель («ученик») воспроизводить поведение большой, более точной модели («учитель») [11]. Процесс состоит из трёх шагов: сначала учитель обучается до полной мощности; затем ученик учится воспроизводить выходы учителя; наконец, ученик сохраняет ключевые знания в более компактной архитектуре.
Квантизация и сжатие модели
Квантизация снижает числовую точность весов и активаций модели. Стандартно модели машинного обучения используют 32-битные числа с плавающей точкой (FP32), но в Edge AI можно применять более компактные представления [12].
Квантизация — одна из важнейших техник уменьшения размера модели и ускорения инференса на периферийных устройствах. Её влияние настолько значительно, что практически все модели, развёртываемые на микроконтроллерах, используют ту или иную форму квантизации.
В таблице ниже — наиболее распространённые типы данных и их влияние на размер модели:
| Type | Bits | Value Range | Size Reduction |
|---|---|---|---|
FP32 | 32 | ±3.4 × 10³⁸ | Base (1x) |
FP16 | 16 | ±6.5 × 10⁴ | 2x |
INT8 | 8 | -128 to 127 | 4x |
INT4 | 4 | -8 to 7 | 8x |
Виды квантизации
Существует несколько подходов к квантизации, каждый со своим балансом между простотой и точностью:
* Post-training quantization применяется после обучения модели. Наиболее простой способ реализации. Однако может приводить к большей потере точности, поскольку модель не обучалась с учётом ограничений квантованного представления.
* Quantization-Aware Training имитирует эффекты квантизации прямо во время обучения. Это позволяет модели адаптироваться к числовым ограничениям, что обеспечивает лучшую точность после квантизации.
* Dynamic quantization — гибридный подход: веса квантизируются статически, а активации — динамически во время инференса.
Влияние квантизации
Квантизация с FP32 до INT8 обычно даёт 4-кратное уменьшение размера модели, ускорение инференса в 2–4 раза, снижение энергопотребления, а потеря точности в большинстве случаев не превышает 1–2%. Именно поэтому квантизация INT8 стала де-факто стандартом для развёртывания на микроконтроллерах.
Фреймворки и инструменты
Экосистема инструментов TinyML заметно повзрослела, что существенно упрощает разработку Edge AI-приложений даже без глубокой экспертизы в оптимизации моделей.
TensorFlow™ Lite Micro
TensorFlow Lite Micro — версия TensorFlow, специально разработанная для микроконтроллеров [13]. Это эталонный фреймворк для TinyML: оптимизированный интерпретатор для устройств с килобайтами памяти, поддержка квантованных операций (INT8), независимость от операционной системы и совместимость с множеством архитектур микроконтроллеров.
Типичный рабочий процесс с TensorFlow Lite Micro:
- Обучить модель в TensorFlow (на компьютере или в облаке)
- Конвертировать модель в формат TensorFlow Lite (.tflite)
- Применить квантизацию при конвертации
- Интегрировать модель в приложение для микроконтроллера
Однако у фреймворка есть ограничения: поддерживаются не все операции TensorFlow, интеграция требует знания C/C++, а отладка может быть непростой.
Edge Impulse
Edge Impulse — комплексная платформа разработки для Edge AI, упрощающая весь жизненный цикл [14]. Именно она станет нашим основным инструментом в практической части курса.
platform предлагает интуитивный веб-интерфейс для всего рабочего процесса, сбор данных прямо с устройств, автоматическую предобработку сигналов и изображений, обучение моделей, оптимизированное для периферийных устройств, автоматическую квантизацию и оптимизацию, а также развёртывание в один клик для Arduino и других микроконтроллеров.
Для тех, кто только начинает работу с Edge AI, Edge Impulse даёт ощутимые преимущества: не требует предварительного опыта в машинном обучении, обеспечивает нативную интеграцию с платами Arduino, предлагает библиотеку предобученных моделей и позволяет профилировать производительность ещё до развёртывания.
Рабочий процесс в Edge Impulse:
- Подключить устройство и собрать данные
- Спроектировать конвейер обработки (processing blocks)
- Выбрать и настроить модель обучения
- Обучить и оценить модель
- Оптимизировать под целевое железо
- Скачать библиотеку для Arduino
Сравнение инструментов
В таблице ниже — ключевые различия между двумя инструментами:
| Aspect | TensorFlow Lite Micro | Edge Impulse |
|---|---|---|
| Learning curve | Steep | Gentle |
| Flexibility | High | Medium |
| Arduino integration | Manual | Automatic |
| Data collection | External | Integrated |
| Optimization | Manual | Automatic |
| Cost | Free | Free (basic tier) |
Цикл разработки Edge AI
Успешное Edge AI-приложение требует структурированного процесса — от постановки задачи до развёртывания и поддержки системы.
Обзор полного цикла
Цикл разработки Edge AI состоит из шести основных фаз, выполняемых итеративно [15]:
- Постановка задачи
- Сбор данных
- Обработка данных
- Обучение модели
- Оценка и развёртывание
- Мониторинг и улучшение
Фаза 1: Постановка задачи
Прежде чем приступать к технической разработке, нужно чётко сформулировать задачу. На этом этапе необходимо ответить на ключевые вопросы: какое решение или действие должна принимать система? Какова минимально допустимая точность? Каковы требования к задержке? Какие аппаратные ограничения существуют? Как будет измеряться успех проекта?
Фаза 2: Сбор данных
Данные — топливо машинного обучения. На этом этапе определяются необходимые данные для обучения модели, разрабатывается процесс их сбора, собираются репрезентативные данные по всем классам и сценариям, данные корректно размечаются и проверяются на качество и разнообразие.
Фаза 3: Обработка данных
Сырые данные редко готовы к обучению сразу. Обработка включает очистку данных (удаление шума и выбросов), нормализацию и стандартизацию, извлечение признаков, аугментацию данных для улучшения обобщения, а также разбивку на обучающую, валидационную и тестовую выборки.
Фаза 4: Обучение модели
После подготовки данных начинается обучение модели. Этот этап охватывает выбор архитектуры, настройку гиперпараметров, итеративное обучение с мониторингом метрик, валидацию для предотвращения переобучения и тонкую настройку по результатам.
Фаза 5: Оценка и развёртывание
Перед развёртыванием модель необходимо оценить и оптимизировать. Это включает оценку на тестовой выборке (на данных, которые модель не видела), квантизацию и оптимизацию под целевое железо, проверку соответствия ограничениям по памяти и задержке, интеграцию с кодом приложения и тестирование на реальном устройстве.
Фаза 6: Мониторинг и улучшение
После развёртывания система требует постоянного наблюдения: сбора метрик производительности в продакшне, выявления случаев, когда модель ошибается, периодического переобучения на новых данных и обновления модели на устройствах.
Планирование Edge AI-проектов
Грамотное планирование — залог успеха Edge AI-проекта. Ниже — важные соображения по каждому аспекту.
Выбор железа
Выбор аппаратной платформы должен опираться на конкретные требования проекта:
| Requirement | Hardware Consideration |
|---|---|
| Model size | Available Flash memory |
| Inference speed | Processor frequency, accelerators |
| Sensor type | Available peripherals, interfaces |
| Battery life | Power consumption, low-power modes |
| Connectivity | Wi-Fi, Bluetooth, LoRa, etc. |
| Cost | Unit price, production volume |
Оценка ресурсов
Перед началом разработки важно оценить необходимые ресурсы. Базовый Edge AI-проект обычно требует 6–12 недель, распределённых примерно так: 1–2 недели на определение и планирование, 2–4 недели на сбор данных, 2–4 недели на разработку модели, 1–2 недели на интеграцию и тестирование.
По данным: рекомендуемые объёмы зависят от сложности задачи. Для простой классификации достаточно 100–500 примеров на класс. Сложная классификация требует 500–2 000 примеров на класс. Для детектирования аномалий рекомендуется более 1 000 примеров нормального поведения.
Типичные сложности и способы их решения
Разработка Edge AI сопряжена с уникальными трудностями [16]. Вот наиболее распространённые из них и пути решения.
Сложность 1: Недостаточно данных или дисбаланс классов
Если обучающих данных не хватает или одни классы представлены значительно лучше других, помогут: аугментация данных (повороты, масштабирование, добавление шума), балансировка классов через oversampling или undersampling, трансферное обучение с предобученными моделями, а также дополнительный сбор данных с акцентом на недопредставленные классы.
Сложность 2: Модель слишком большая
Если обученная модель не помещается в доступную память устройства, можно применить более агрессивную квантизацию (INT8 или INT4), уменьшить архитектуру (меньше слоёв, меньше нейронов), использовать pruning для удаления лишних весов или перейти на железо с большим объёмом памяти.
Сложность 3: Слишком высокая задержка
Если время инференса слишком велико для приложения, можно снизить сложность модели, оптимизировать предобработку данных, использовать квантованные операции (они быстрее операций с плавающей точкой) или уменьшить разрешение входных данных и частоту дискретизации.
Сложность 4: Плохая производительность в продакшне
Если модель хорошо работает в лабораторных условиях, но даёт сбои в реальных, нужно собрать данные в более разнообразных и реалистичных условиях; включить в обучение вариации среды, шума и освещения; реализовать надёжную предобработку (например, фильтрацию, адаптивную нормализацию); и тщательно тестировать в условиях реального развёртывания.
Сложность 5: Высокое энергопотребление
Если устройство слишком быстро разряжает батарею, помогут: включение режимов пониженного энергопотребления в периоды простоя, снижение частоты инференса там, где это допустимо, использование детектора активности перед запуском основной модели, а также оптимизация кода для минимизации числа тактов процессора.
Итоги
В этом модуле мы детально разобрали основы машинного обучения для периферийных устройств.
Алгоритмы для Edge AI должны быть эффективны по памяти, вычислениям и энергопотреблению. Основные типы задач — классификация, регрессия и детектирование аномалий — у каждой свои метрики оценки и сферы применения.
Обработка сигналов и компьютерное зрение — две главные прикладные категории. Обработка сигналов работает с данными датчиков и аудио при относительно скромных требованиях к ресурсам. Компьютерное зрение обрабатывает изображения и требует оптимизированных архитектур — таких как MobileNet — для эффективной работы на периферийных устройствах.
TinyML позволяет запускать ML на микроконтроллерах с помощью эффективного проектирования архитектур, прореживания лишних связей, дистилляции знаний и, главное, квантизации модели.
TensorFlow Lite Micro и Edge Impulse — два ключевых инструмента экосистемы. TensorFlow Lite Micro даёт максимальную гибкость, но требует глубоких технических знаний. Edge Impulse значительно упрощает процесс и станет нашим основным инструментом в практической части курса.
Цикл разработки Edge AI итеративен и включает постановку задачи, сбор данных, обработку, обучение, развёртывание и непрерывный мониторинг. На каждом этапе возникают типичные трудности с проверенными решениями.
В следующем модуле мы подробно рассмотрим рабочий процесс создания Edge AI-приложений и подготовимся к практической реализации с платой Arduino UNO R4 WiFi.
Список литературы
[1] P. Warden and D. Situnayake, TinyML: Machine Learning with TensorFlow Lite on Arduino and Ultra-Low-Power Microcontrollers. Sebastopol, CA, USA: O'Reilly Media, 2019.
[2] V. J. Reddi et al., "Widening access to applied machine learning with TinyML," Harvard Data Science Review, vol. 4, no. 1, 2022, doi: 10.1162/99608f92.a31e8c72.
[3] I. Goodfellow, Y. Bengio, and A. Courville, "Machine learning basics," in Deep Learning. Cambridge, MA, USA: MIT Press, 2016, ch. 5. [Online]. Available: https://www.deeplearningbook.org/contents/ml.html
[4] V. Chandola, A. Banerjee, and V. Kumar, "Anomaly detection: A survey," ACM Comput. Surv., vol. 41, no. 3, pp. 1–58, Jul. 2009, doi: 10.1145/1541880.1541882.
[5] R. Girshick, J. Donahue, T. Darrell, and J. Malik, "Rich feature hierarchies for accurate object detection and semantic segmentation," in Proc. IEEE Conf. Comput. Vis. Pattern Recognit. (CVPR), Columbus, OH, USA, 2014, pp. 580–587, doi: 10.1109/CVPR.2014.81.
[6] J. Lin, L. Zhu, W.-M. Chen, W.-C. Wang, and S. Han, "Tiny machine learning: Progress and futures," IEEE Circuits Syst. Mag., vol. 23, no. 3, pp. 8–34, 2023, doi: 10.1109/MCAS.2023.3302182.
[7] A. G. Howard et al., "MobileNets: Efficient convolutional neural networks for mobile vision applications," arXiv preprint arXiv:1704.04861, 2017.
[8] Y. Abadade, A. Temouden, H. Bamoumen, N. Benamar, Y. Chtouki, and A. S. Hafid, "A comprehensive survey on TinyML," IEEE Access, vol. 11, pp. 96892–96922, 2023, doi: 10.1109/ACCESS.2023.3294111.
[9] M. Sandler, A. Howard, M. Zhu, A. Zhmoginov, and L. Chen, "MobileNetV2: Inverted residuals and linear bottlenecks," in Proc. IEEE Conf. Comput. Vis. Pattern Recognit. (CVPR), Salt Lake City, UT, USA, 2018, pp. 4510–4520, doi: 10.1109/CVPR.2018.00474.
[10] S. Han, J. Pool, J. Tran, and W. J. Dally, "Learning both weights and connections for efficient neural networks," in Proc. Adv. Neural Inf. Process. Syst. (NeurIPS), Montreal, Canada, 2015, pp. 1135–1143.
[11] G. Hinton, O. Vinyals, and J. Dean, "Distilling the knowledge in a neural network," arXiv preprint arXiv:1503.02531, 2015.
[12] B. Jacob et al., "Quantization and training of neural networks for efficient integer-arithmetic-only inference," in Proc. IEEE Conf. Comput. Vis. Pattern Recognit. (CVPR), Salt Lake City, UT, USA, 2018, pp. 2704–2713, doi: 10.1109/CVPR.2018.00286.
[13] R. David et al., "TensorFlow Lite Micro: Embedded machine learning for TinyML systems," in Proc. Mach. Learn. Syst. (MLSys), 2021, pp. 800–811.
[14] Edge Impulse, "Edge Impulse Documentation," 2024. [Online]. Available: https://docs.edgeimpulse.com/
[15] A. Garcia, P. Serrano, D. Urda, J. J. Rodriguez, and C. Garcia-Osorio, "Embedded AI and TinyML: A practical analysis of workflows and libraries," in Distributed Computing and Artificial Intelligence (DCAI 2024), vol. 1259, Lecture Notes in Networks and Systems. Cham, Switzerland: Springer, 2025, pp. 1–10.
[16] R. Kallimani et al., "TinyML: Enabling of inference deep learning models on ultra-low-power IoT edge devices for AI applications," Micromachines, vol. 13, no. 6, p. 851, May 2022, doi: 10.3390/mi13060851.