Search
Write a publication
Pull to refresh

Зачем мы разбрасывали мусор в офисах, или как мы сделали систему для управления гибкими пространствами

Level of difficultyEasy
Reading time4 min
Views1.3K

Привет, Хабр! Меня зовут Вадим, я работаю техническим директором молодой ИТ-компании BPA.

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

Как пришла идея?

Началось всё с того, что появилась идея автоматизировать процесс уборки в офисных пространствах. В гибких офисах и коворкингах поддерживать порядок — тот ещё челлендж, особенно когда нет четкого графика уборки. Мы подумали, а почему бы не сделать систему, которая сама распознает мусор и уведомляет клининговый персонал в реальном времени?

Задача казалась относительно простой: взять камеры, нейронную сетку, обучить на мусоре и дело в шляпе! Но на практике задача оказалась капельку сложнее...

Первая трудность

Первый серьезный затык возник, когда мы начали искать готовые датасеты для обучения. Для городских условий можно было найти какие-то открытые данные по мусору — кучки мусора и прочего хлама на улицах. Но в офисах ситуация совершенно иная: тут тебе не асфальт, а столы, стулья и аккуратненькие рабочие места. Нужен был датасет, который бы покрывал не только мусор, но и интерпретировал его в контексте офисного пространства.

Что делать, если нужного датасета нет? Правильно, собрать его самим.

Как мы собирали данные

Первым шагом было принято решение обратиться к Кластеру "Ломоносов", где было уже установлено 9 камер. Мы договорились, что два дня будем "засорять" пространство. Мы самостоятельно руками разбрасывали мусор, перемещали его с места на место, чтобы получить разнообразие по типам и расположению. Это были бутылки, стаканы, салфетки и пакеты — короче, всё, что потенциально может быть расценено как мусор в офисе.

Фото с камер
Фото с камер

Процесс сбора данных выглядел примерно так: оператор с камер контролировал съемку и координировал перемещение объектов в зоне наблюдения, давая команды типа: «Перемести эту бутылку ближе к столу» или «Сдвинь её в правый угол». Чтобы получить разнообразный датасет, каждые 30 секунд объекты перераспределялись, меняли положение и ориентацию относительно камер.

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

Следующий этап - разметка и создание модели. После двух дней веселья с разбрасыванием мусора началась рутина — разметка. Для этого мы использовали онлайн-сервис RoboFlow, в котором вручную обводили каждый объект в кадре, отмечая его как бутылку, стакан или что-то еще. Собранные изображения мы размечали по классам: бутылки, стаканчики, рюкзаки и "всё остальное" (например, салфетки, крышки от бутылок).

Для обучения object detection мы использовали YOLOv8. Решили не изобретать велосипед и не создавать собственную архитектуру нейросети. Зачем, когда есть готовые модели, предобученные на больших датасетах? Это позволило нам сконцентрироваться на решении прикладной задачи, а не на разработке алгоритмов с нуля.

Особенности работы с камерами

Каждая камера имела разрешение Full HD, а YOLO работала с разрешением 640x640 пикселей. Чтобы не терять качество и улавливать мелкие объекты, которые при сжатии FullHD в 640р просто не были бы нормально видны. Кадр с камеры мы делили на 6 частей (без нахлеста), каждая из которых обрабатывалась отдельно. То есть один кадр обрабатывался за 6 подходов, после чего результаты объединялись.

Задача казалась решенной, но... возникла интересная проблема "понимания" мусора.

Представьте себе: пластиковый стакан стоит на столе, никого вокруг нет — очевидно, что это мусор. Но что если рядом сидит человек? Тогда этот же стаканчик не является мусором, а просто принадлежит человеку, который пьёт кофе.

Так что мусор и не-мусор визуально могут выглядеть одинаково. Нужно было учитывать контекст. Мы решили эту проблему с помощью двух нейронных сетей: одна распознаёт мусор, а вторая — людей. Если мусор попадает в расширенный bounding box, который включает человека, то мы его не считаем мусором. Звучит просто, но в реальности это добавляло сложности: нужно было точно калибровать рамки, чтобы правильно определить, какие объекты находятся рядом с человеком.

Часто возникают ситуации, когда человек в кадре частично закрыт или вовсе отсутствует, в то время как мусор виден полностью. Дополнительно усложняет задачу то, что несколько камер снимают одну и ту же зону с разных углов, создавая избыточные дубли.

В таких случаях важно настроить приоритетность данных с одного из ракурсов, чтобы избежать конфликта при обучении модели.

Маски для исключений

Следующей технической задачей стало исключение определенных зон из анализа.

Например, зона около кофейной стойки: здесь бариста может складывать стаканы, но это не должно восприниматься системой как сигнал для клининга.

Фото с камер
Фото с камер

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

Фото с камер
Фото с камер

Архитектура системы

Мы реализовали backend на FastAPI, обёрнутый в докер-контейнер. Использовали Postgres для хранения обнаружений и путей до кадров. А также сам контейнер с сетями, который мониторил камеры через RTSP и отправлял на бэк чистый кадр, кадр с отрисованными bbox-ами при обнаружении. Сервер по очереди опрашивал камеры, получал кадры, обрабатывал их, и, еслисистема обнаруживала мусор, отправлялся JSON-файл с текстовым описанием объектов. Это описание затем обрабатывалось на backend-сервере, который сверял его с базой данных.

Один из интересных моментов здесь — фильтрация дубликатов. Если, например, стакан лежит на столе полчаса, система не должна захламлять базу данными с одинаковыми кадрами. Мы сделали так, что backend проверяет, отличается ли текущий кадр от предыдущего, и только в случае реальных изменений сохраняет его.

Мы подняли веб-клиент, в котором можно смотреть статистику: количество мусора по дням, камерам, категориям. Также мы добавили функцию отправки уведомлений в Telegram. Например, если система распознала мусор, клининг сразу получает уведомление с указанием, где и что нужно убрать.

Что в итоге?

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

Tags:
Hubs:
Total votes 5: ↑5 and ↓0+5
Comments4

Articles