Привет, Хабр! Я Вова, Lead Data Scientist. Заметил, что вам очень нравится вместе с нами разбирать решения задач с хакатонов. Сегодня расскажу, как я занял 4 место в соревновании по выявлению незаконных построек по спутниковым снимкам и что мне не хватило, чтобы попасть в топ-3 на Цифровом прорыве.
Информация о задаче, проблема
С каждым годом спрос на снимки со спутников для Дистанционного Зондирования Земли (ДЗЗ) увеличивается. В результате количество получаемых снимков с поверхности Земли растет. Последующая обработка полученной спутниковой информации усложняется из-за многократного увеличения получаемых данных. Сейчас подобная работа занимает несколько десятков или сотен часов труда специалистов по дешифровке. Чтобы повысить качество и скорость обработки космических данных, требуется создание специально обученных сверхточных нейросетей, способных осуществлять разметку данных и в автоматическом режиме проводить поиск и отметку значимой для пользователя информации. Подобная система, например, способна в автоматическом режиме провести обработку спутниковых данных с территории заповедника и идентифицировать незаконную постройку. Создание подобного сервиса на основе сверхточных нейросетей должна помочь в работе с космическими данными, увеличив качество аналитики и сократив время работы специалистов.
Цель задачи — разработать модель машинного обучения для подсчета зданий на изображении. Обязательное условие: на снимке присутствует хотя бы одна постройка.
Исходные данные и метрика качества
Размер каждого изображения составляет 300x300 пикселя.
Данные представляют из себя две папки и два csv-файла, а именно:
● train/ — папка, содержащая 2100 фотографий тренировочного набора;
● test/ — папка, содержащая 900 фотографий для тестирования;
● train.csv — содержит в себе 2 столбца:
id фотографии;
количество строений.
Решения оценивались по коэффициенту детерминации, который принимает значения от 0 до 1. Чем выше значение метрики, тем больше статистическая взаимосвязь между предсказанными и фактическими значениями.
Посмотрев на данные, я разделил все снимки на 3 группы
Небольшие дома частного сектора
Парковки с небольшими служебными помещениями
Промышленная или коммерческая недвижимость
По итогу изучения данных я отметил пальмы, большое количество бассейнов в частном секторе и характерные тупики, и пришел к выводу, что снимки были сделаны не в России.
Первоначальный план
Организаторы соревнования подготовили базовое решение с обучением сверточной нейронной сети на решение задачи регрессии, но я сразу решил не использовать такой подход. На похожих задачах по подсчету моржей и тюленей со спутниковых снимках побеждали решения, которые находят каждого животного по отдельности и затем делают их подсчет. Я решил пойти таким же путем. Мой первоначальный план был такой — разметить около 100 фотографий в LabelStudio, затем обучить модель на object detection или instance segmentation и затем проверить жизнеспособность моего плана
Я запустил LabelStudio через docker простой командой и разметил несколько фото.
docker pull heartexlabs/label-studio:latest
docker run -it -p 8080:8080 -v $(pwd)/mydata:/label-studio/data heartexlabs/label-studio:latest
Но столкнулся с одной проблемой — количество домой, который разметил я, не сходилось с тем, что указано в представленных данных. Например, на фотографии выше я разметил 13 зданий, а в метаданных отмечено 17. Стало понятно, что на глаз не могу отделить небольшие строения вроде сторожевых будок или сараев от просто случайных однотонных пятен на фото, и поэтому моя разметка расходилась от данных организаторов на плюс-минус 3-5 домов.
И тут в чате соревнования всплыли данные с разметкой на instance segmentation, из которых организаторы собрали свой датасет. И я перестал размечать данные и взял новые данные для обучения.
Используемые данные
Как оказалось, данные от организатор являются частью данных из соревнования Mapping Challenge на AICrowd. Эти данные размечены под задачу Instance Segmentation в формате COCO, т.е. семантическая маска каждого дома выделена как отдельный объект. Датасет содержит 280 тысяч таких снимков, из которых я убрал снимки из тестовой части соревнования.
Используемый подход
Я взял модель архитектуры DetectoRS, у которой есть вариации для Object Detection и Instance Segmentation, потому что решил использовать информацию не только о координатах, но и конкретных масках домов. Также из своего опыта знаю, что для дообучения такой сети нужно не очень большое количество эпох. И еще одним плюсом было то, что фреймворк MMDetection, на котором я обучал модель, из коробки работает с форматом COCO.
Эта архитектура является продолжением идей двухстадийных детекторов таких, как FasterRCNN и MaskRCNN и у неё есть две особенности.
Recursive Feature Pyramid — осуществляется несколько проходов по пирамиде признаков и на каждом проходе учитываются извлеченные признаки из прошлой итерации.
Switchable Atrous Convolution — один и тот же сверточный модуль запускают с разным расстоянием между пикселями, тем самым позволяя учитывать взаимосвязь пикселей на разном расстоянии относительно изображения.
Для начала я ограничил датасет 10 тысячами изображений и использовал версию модели для Object Detection. Так, столкнулся с первой проблемой — модель на локальной валидации выдавала низкие метрики. Я начал изучать разметку и понял, что формат координат детекционной рамки отличается от общепринятого. Потратив несколько дней, пытаясь понять как правильно использовать эти метаданные, пришел к выводу — разметка детекционной рамки сама по себе кривая и её не стоит использовать. Я пересобрал эту разметку из координат точек сегментационных масок.
def change_anno(i):
i['category_id'] = 1
i['bbox'] = [min(i['segmentation'][0][0::2]),
min(i['segmentation'][0][1::2]),
max(i['segmentation'][0][0::2]) - min(i['segmentation'][0][0::2]),
max(i['segmentation'][0][1::2]) - min(i['segmentation'][0][1::2])]
return i
Модель теперь стала обучаться. Так я получил значение метрики 0.75.
Затем решил перейти к обучении модели на задаче Instance Segmetation. Для такой модели требуется дополнительная информация в виде semantic segmentation масок, т. е. изображения со значением 1 там, где находятся здания и 0 где зданий нет. Эти маски я также сформировал с помощью координат точек сегментационных масок каждого здания, используя следующие функции.
def make_mask(img):
mask = np.zeros((300, 300), np.uint8)
for an in train['annotations']:
if an['image_id'] != img['id']:
continue
seg = an['segmentation']
rr, cc = polygon(seg[0][1::2], seg[0][::2])
mask[np.clip(rr, 0, 299), np.clip(cc, 0, 299)] = 1
cv2.imwrite(f'/data/train/masks/{img["file_name"].replace("jpg", "png")}', mask)
На этой версии модели я получил значение метрики 0.8.
Дальше я уже обучал на всех данных и использовал Test Time Augmentation для улучшения значения метрики.
Test Time Augmentation — подход применения аугментации на этапе предсказания модели. Я использовал три аугментации, не ухудшающие исходное изображение и их комбинации. Таким образом, у меня получалось 8 вариаций исходного изображения, для которых я делал предсказания и затем усреднял их. Для получения аугментированных изображений использовал следующую функцию.
def tta(image, vertical_flip=False, horizontal_flip=False, rotate=False):
if vertical_flip:
image = cv2.flip(image, 0)
if horizontal_flip:
image = cv2.flip(image, 1)
if rotate:
image = np.rot90(image)
return image
Обучение на всех данных занимало больше суток и соревнование уже подходило к концу, поэтому я успел обучить модель только одну эпоху. Финальное значение метрики получилось 0.92.
Итог
Если бы я выстроил тайм менеджмент более грамотно и изначально потратил бы больше времени на изучение разметки данных, не смешивая её с обучением, я бы успел обучить итоговую модель большее число эпох и получил бы метрики выше. Не забывайте заранее проверять, что ваши данные соответствуют тому, что ожидаете вы и ваша модель.
По ссылкам можно ознакомиться с кодом и презентацией моего решения:
https://github.com/Vlako/satellite-building-counting
Выявление незаконных построек по спутниковым снимкам. Владимир Фоменко
Решение оформлено через docker compose, где каждый шаг вынесен в отдельный сервис. Для его запуска нужно выполнить всего лишь несколько шагов:
Скачать данные соревнования в папку data и разархивировать их.
Скачать train.tar.gz из этого соревнования https://www.aicrowd.com/challenges/mapping-challenge.
Запустить скрипт подготовки данных
docker compose up --build data_creation
.Запустить обучение
docker compose up --build train
или загрузить модель в папку model по ссылке.Для предсказания на тестовых данных запустить
docker compose up --build inference
.Для визуализации детекции на тестовых данных можно запустить
docker compose up --build draw_detections
.
Комментарии (18)
pewpew
01.12.2022 11:01+1Простите, а чем незаконные постройки отличаются от других с точки зрения вашей нейросети?
Судя по статье вы занимаетесь задачей разметки. А законность построек определяет кто-то другой.DMGarikk
01.12.2022 11:32+1ну там они наверное сравнивают количество и размер строений с реальными данными
и то что расходится == незаконноеpewpew
01.12.2022 15:09Но ведь нейросеть из статьи просто подсчитывает здания.
Цель задачи — разработать модель машинного обучения для подсчета зданий на изображении.
Она не пытается определить их законность. Или я что-то невнимательно читал?sergeyns
01.12.2022 16:45Законные есть в реестре. Возможно даже с координатами. Сравниваем число строений на фото с числом в реестре - PROFIT. Думаю расставить границы участка по координатам можно и без хатакона..
pewpew
01.12.2022 19:16Вы рассказываете, как воспользоваться данными подсчёта, полученными от ИИ. Это очевидно. Однако в заголовке одно, в содержании статьи — другое. Кухонным ножом можно резать хлеб, а можно убивать.
DMGarikk
01.12.2022 16:54нет, всё верно. я примерно это и сказал
но чтобы серьезно проект выглядел, можно назвать борьбой с застройкой заповедников и ИИ вычисляющим незаконные вещи.
Это из той сферы что микроволновка это тоже ИИ — только низкого уровня, сама считает время готовки! интеллект!
p.s. во многом по этому я и написал первый коммент немного токсичным
J_8
02.12.2022 13:56Как я люблю это красивое слово "Хакатон"
Которе я воспринимаю так.
Есть задача которую нужно решить определенному кругу заинтересованных лиц
( Администрация, министерства, банки и далее по списку).
Есть конторы которые эту задачу умеют решать эффективно и профессионально, но они за свою работу хотят получить оплату, которая обычно прямо пропорциональна сложности проекта плюс жадность компании зависящая скорее от ее положения на рынке и частично от профессионализма.
И тут о чудо !
Есть же Хакатон!
За разработку проекта попросили 10 лямов? Так давайте сделаем приз в лям!! похвалим участников дадим им грамоту на А4.
DMGarikk
02.12.2022 15:26+1а поддержка дальнейшая как с выкаткой в прод?
мне чет кажется это лишь на словах так легко звучит
DMGarikk
а знаете для чего она будет использоваться?
чтобы фоткать частный сектор — и выставлять счет за неуплаченные налоги людям которые построили незарегистрированный сарай или бассейн
а то иш, бассейн они построили, а налог за него не платят! и сарайчик — надо признять капитальным и тоже плотить налог
собственно это основное назначение таких систем. а проблема построек в заповедных территориях — это как блокировка сайтов с ЦП в РФ, если бы проблему хотели решить — не выдавали бы разрешения на такие постройки и осуществляли надзор, ведь парадок в том что у любого особняка построенного в запретной заповедной зоне, будет огромный пакет разрешительных документов с подписью чутьли не Путина. (ну как аналог можно вспомнить историю с магазинами у метро в Мск)
==
эта ситуация не только в РФ такаяже, в некоторых странах ЛА насколько я слышал точно также вылавливают 'незаконные постройки' на частных территориях
red-cat-fat
И что плохого в выявлении нарушителей?
Electrohedgehog
Зависит исключительно от вашей точки зрения на закон и основания для его применения. Ну вот например, давайте обучим нейросеть фейки в соцсетях искать. Это же сколько нарушителей закона привлекут к ответственности!
Будем, конечно, искать незаконные постройки в заповедниках. А обучать сетку будем на гаражах пригорода. Определённо, именно такой датасет поможет искать незаконные застройки заповедников.
DMGarikk
да ничего плохого, просто было бы честнее если такие проекты назывались по настоящему
Сеть для выявления незаконных частных построек
а то что 'для заповедников' — это манипуляция, чтобы люди восприняли это с радостью… даже разок заказчик это и сделает
но в основном, да и главная причина — это надзор за частными домами и коммерческими постройками
==
Это как в моем районе построили с помпой предприятие по пошиву воздушных шаров! (те кто про дмитровскому шоссе ездил его видел) ура мы будем лидеры в шарах!
я помню тогда сразу написал в местном паблике что назначение проекта — не это, а чтобы без торгов дали землю под постройку… тогда мне даже ктото из администрации города ответил — мол нет, там шары шьют. (ну да помещение 5 на 5 там под него выделили)
ну уже через полгода после открытия на нем висело объявление 'сдача промпомещений в аренду', еще через полгода там был картинг.да и остался судя по яндексу (https://yandex.ru/maps/-/CCUjYYvcpB)
===
p.s. сорри, немного токсично получилось. просто со времен пока у меня был бизнес, у меня глаз дергается когда всякими такими формулировками отвлекают внимание от реального назначения проекта
Zara6502
Ничего, просто мне трудно понять почему кирпичи сложенные на участке пачкой - это просто кирпичи, а выложенные в виде стен - это уже незаконное строение? Физически ничего не изменяется, то есть повод содрать денег чисто виртуальный, надуманный. Земля моя, я плачу земельный налог, кирпичи мои, я их купил заплатив налог, зарплата моя, были уплачены налоги, а после того как кирпичи образовали строение я обязан еще что-то платить - хоть убейте, но не понимаю это.
Для строений есть ограничения по высоте, соседству с другими и т.п. ТО есть выполнены все требования по пожаробезопасности и высоте размещения, всё. А 1 строение на участке или 21 - это моё личное и никак не связано с их эксплуатацией якобы в населённом пункте.
Я могу понять коммерческое назначение (и то весьма условно), но оно будет на балансе и по сути государство суёт руку в ваш карман что присосаться к бизнесу. Ну ок, пусть так. Но причем тут баня, сарай или летняя кухня?
freeExec
не переживай, такие снимки в России в ближайшее время не предвидятся
NFlamel
уже начали в московской области