Если у вас есть опыт разработки программного обеспечения, вы наверняка встречали в своем путешествии термин модульное программирование. По сути, это включает в себя разделение программы на несколько модулей с простыми обязанностями (например, см. SOLID), которые взаимодействуют друг с другом и могут быть заменены, что позволяет избежать монолитной конструкции. Основными преимуществами модульности являются возможность многократного использования модулей и более простая ремонтопригодность.

На этот раз я расскажу о реальном проекте, в котором использование модульной системы существенно сэкономило время и ресурсы MoonVision.

Новая функция? Просто добавьте новый компонент

Все наши конвейеры компьютерного зрения состоят из множества простых шагов, которые необходимо выполнить, чтобы получить окончательный результат на основе исходного изображения. Каждый из этих шагов является компонентом (модулем) в нашем графике выполнения, начиная с поставщика данных и заканчивая хранением результатов, что можно сделать несколькими способами. Но у нас также есть разные виды графиков, в зависимости от того, хотим ли мы обучить модель, выполнить логический вывод по набору данных или просто записать видео с результатами конвейера, среди многих других.

Объединение модулей в наши конвейеры стало возможным благодаря использованию строгой типизации в Python. Знание заранее типов, которые должен обрабатывать каждый модуль, гарантирует правильную обработку входных данных и возврат правильных выходных данных, что делает взаимозаменяемость модулей тривиальной задачей.

В одном из наших недавних проектов нам нужно было обнаруживать объекты очень разных размеров. Для справки: самый маленький объект был примерно в 20 раз меньше самого большого. По этой причине мы решили, что для максимальной эффективности и точности лучше всего использовать несколько моделей обнаружения вместо одной. Таким образом, мы могли бы обучить детектор для более крупных объектов на масштабированных изображениях с очень маленьким коэффициентом, а затем обучить другой детектор для самых маленьких объектов с изображениями с большим разрешением. Такая конструкция позволила значительно сократить время вывода, поскольку в производственной среде вывод обычно выполняется на компьютерах с малым коэффициентом мощности, которые полагаются исключительно на мощность процессора.

Использование нескольких детекторов означает, что результаты каждого детектора в конечном итоге должны быть объединены в один результат. Кроме того, масштабирование в различных точках также увеличивает сложность. Добавляя простые компоненты, которые позаботятся об этом, мы можем легко создавать сложные графики, в которых все компоненты легко взаимодействуют друг с другом.

Не стесняйтесь взглянуть на рисунок 1, чтобы понять все вышеперечисленное.

Рисунок 1: Упрощенный график вывода для одного из наших последних проектов. Модули, выделенные оранжевым цветом, были новыми дополнениями, благодаря которым этот проект стал успешным за очень короткий период времени.

Другим побочным эффектом представления вывода традиционного и глубокого обучения в едином символьном графе является сериализация. Мы можем совместно использовать все приложение между устройствами, работающими в потоке с одной камеры, и вычислительным кластером с автоматическим масштабированием.

Вывод

Модульность гарантирует значительные улучшения гибкости в системе и значительно упрощает внесение изменений на ходу. Это привело к гораздо более быстрому развертыванию новых функций и своевременному завершению проектов клиентов.

Узнайте, чем мы занимаемся, на https://www.moonvision.io/ и проверьте нашу платформу на app.moonvision.io/signup.