Привет, Хабр! Я Вова, Lead Data Scientist. Заметил, что вам очень нравится вместе с нами разбирать решения задач с хакатонов. Сегодня расскажу, как я занял 4 место в соревновании по выявлению незаконных построек по спутниковым снимкам и что мне не хватило, чтобы попасть в топ-3 на Цифровом прорыве

Информация о задаче, проблема

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

Цель задачи — разработать модель машинного обучения для подсчета зданий на изображении. Обязательное условие: на снимке присутствует хотя бы одна постройка.

Исходные данные и метрика качества

Размер каждого изображения составляет 300x300 пикселя.

Данные представляют из себя две папки и два csv-файла, а именно:

● train/ — папка, содержащая 2100 фотографий тренировочного набора;

● test/ — папка, содержащая 900 фотографий для тестирования;

● train.csv — содержит в себе 2 столбца:

  • id фотографии;

  • количество строений.

Решения оценивались по коэффициенту детерминации, который принимает значения от 0 до 1. Чем выше значение метрики, тем больше статистическая взаимосвязь между предсказанными и фактическими значениями.

Посмотрев на данные, я разделил все снимки на 3 группы

  1. Небольшие дома частного сектора

  1. Парковки с небольшими служебными помещениями

  1. Промышленная или коммерческая недвижимость

По итогу изучения данных я отметил пальмы, большое количество бассейнов в частном секторе и характерные тупики, и пришел к выводу, что снимки были сделаны не в России.

Где-то я уже видел это место...
Где-то я уже видел это место...
Это же Сан-Андреас!
Это же Сан-Андреас!

Первоначальный план

Организаторы соревнования подготовили базовое решение с обучением сверточной нейронной сети на решение задачи регрессии, но я сразу решил не использовать такой подход. На похожих задачах по подсчету моржей и тюленей со спутниковых снимках побеждали решения, которые находят каждого животного по отдельности и затем делают их подсчет. Я решил пойти таким же путем. Мой первоначальный план был такой — разметить около 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 и у неё есть две особенности.

  1. Recursive Feature Pyramid — осуществляется несколько проходов по пирамиде признаков и на каждом проходе учитываются извлеченные признаки из прошлой итерации.

  1. 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, где каждый шаг вынесен в отдельный сервис. Для его запуска нужно выполнить всего лишь несколько шагов: 

  1. Скачать данные соревнования в папку data и разархивировать их.

  2. Скачать train.tar.gz из этого соревнования https://www.aicrowd.com/challenges/mapping-challenge

  3. Запустить скрипт подготовки данных docker compose up --build data_creation.

  4. Запустить обучение docker compose up --build train или загрузить модель в папку model по ссылке

  5. Для предсказания на тестовых данных запустить docker compose up --build inference.

  6. Для визуализации детекции на тестовых данных можно запустить docker compose up --build draw_detections

 

Комментарии (18)


  1. DMGarikk
    01.12.2022 10:57
    +4

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

    а знаете для чего она будет использоваться?

    чтобы фоткать частный сектор — и выставлять счет за неуплаченные налоги людям которые построили незарегистрированный сарай или бассейн
    а то иш, бассейн они построили, а налог за него не платят! и сарайчик — надо признять капитальным и тоже плотить налог

    собственно это основное назначение таких систем. а проблема построек в заповедных территориях — это как блокировка сайтов с ЦП в РФ, если бы проблему хотели решить — не выдавали бы разрешения на такие постройки и осуществляли надзор, ведь парадок в том что у любого особняка построенного в запретной заповедной зоне, будет огромный пакет разрешительных документов с подписью чутьли не Путина. (ну как аналог можно вспомнить историю с магазинами у метро в Мск)
    ==
    эта ситуация не только в РФ такаяже, в некоторых странах ЛА насколько я слышал точно также вылавливают 'незаконные постройки' на частных территориях


    1. red-cat-fat
      01.12.2022 11:34
      +2

      И что плохого в выявлении нарушителей?


      1. Electrohedgehog
        01.12.2022 11:53
        +1

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

        Будем, конечно, искать незаконные постройки в заповедниках. А обучать сетку будем на гаражах пригорода. Определённо, именно такой датасет поможет искать незаконные застройки заповедников.


      1. DMGarikk
        01.12.2022 11:59
        +4

        да ничего плохого, просто было бы честнее если такие проекты назывались по настоящему
        Сеть для выявления незаконных частных построек
        а то что 'для заповедников' — это манипуляция, чтобы люди восприняли это с радостью… даже разок заказчик это и сделает
        но в основном, да и главная причина — это надзор за частными домами и коммерческими постройками
        ==
        Это как в моем районе построили с помпой предприятие по пошиву воздушных шаров! (те кто про дмитровскому шоссе ездил его видел) ура мы будем лидеры в шарах!
        я помню тогда сразу написал в местном паблике что назначение проекта — не это, а чтобы без торгов дали землю под постройку… тогда мне даже ктото из администрации города ответил — мол нет, там шары шьют. (ну да помещение 5 на 5 там под него выделили)
        ну уже через полгода после открытия на нем висело объявление 'сдача промпомещений в аренду', еще через полгода там был картинг.да и остался судя по яндексу (https://yandex.ru/maps/-/CCUjYYvcpB)
        ===
        p.s. сорри, немного токсично получилось. просто со времен пока у меня был бизнес, у меня глаз дергается когда всякими такими формулировками отвлекают внимание от реального назначения проекта


      1. Zara6502
        01.12.2022 12:30
        +3

        Ничего, просто мне трудно понять почему кирпичи сложенные на участке пачкой - это просто кирпичи, а выложенные в виде стен - это уже незаконное строение? Физически ничего не изменяется, то есть повод содрать денег чисто виртуальный, надуманный. Земля моя, я плачу земельный налог, кирпичи мои, я их купил заплатив налог, зарплата моя, были уплачены налоги, а после того как кирпичи образовали строение я обязан еще что-то платить - хоть убейте, но не понимаю это.

        Для строений есть ограничения по высоте, соседству с другими и т.п. ТО есть выполнены все требования по пожаробезопасности и высоте размещения, всё. А 1 строение на участке или 21 - это моё личное и никак не связано с их эксплуатацией якобы в населённом пункте.

        Я могу понять коммерческое назначение (и то весьма условно), но оно будет на балансе и по сути государство суёт руку в ваш карман что присосаться к бизнесу. Ну ок, пусть так. Но причем тут баня, сарай или летняя кухня?


    1. freeExec
      01.12.2022 12:03
      -2

      не переживай, такие снимки в России в ближайшее время не предвидятся


      1. NFlamel
        01.12.2022 21:31

        уже начали в московской области


  1. pewpew
    01.12.2022 11:01
    +1

    Простите, а чем незаконные постройки отличаются от других с точки зрения вашей нейросети?
    Судя по статье вы занимаетесь задачей разметки. А законность построек определяет кто-то другой.


    1. DMGarikk
      01.12.2022 11:32
      +1

      ну там они наверное сравнивают количество и размер строений с реальными данными
      и то что расходится == незаконное


      1. pewpew
        01.12.2022 15:09

        Но ведь нейросеть из статьи просто подсчитывает здания.

        Цель задачи — разработать модель машинного обучения для подсчета зданий на изображении.
        Она не пытается определить их законность. Или я что-то невнимательно читал?


        1. sergeyns
          01.12.2022 16:45

          Законные есть в реестре. Возможно даже с координатами. Сравниваем число строений на фото с числом в реестре - PROFIT. Думаю расставить границы участка по координатам можно и без хатакона..


          1. pewpew
            01.12.2022 19:16

            Вы рассказываете, как воспользоваться данными подсчёта, полученными от ИИ. Это очевидно. Однако в заголовке одно, в содержании статьи — другое. Кухонным ножом можно резать хлеб, а можно убивать.


        1. DMGarikk
          01.12.2022 16:54

          нет, всё верно. я примерно это и сказал

          но чтобы серьезно проект выглядел, можно назвать борьбой с застройкой заповедников и ИИ вычисляющим незаконные вещи.
          Это из той сферы что микроволновка это тоже ИИ — только низкого уровня, сама считает время готовки! интеллект!

          p.s. во многом по этому я и написал первый коммент немного токсичным


      1. kash987
        01.12.2022 21:31

        помечается "к проверке"


  1. J_8
    02.12.2022 13:56

    Как я люблю это красивое слово "Хакатон"

    Которе я воспринимаю так.

    Есть задача которую нужно решить определенному кругу заинтересованных лиц

    ( Администрация, министерства, банки и далее по списку).

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

    И тут о чудо !

    Есть же Хакатон!

    За разработку проекта попросили 10 лямов? Так давайте сделаем приз в лям!! похвалим участников дадим им грамоту на А4.


    1. DMGarikk
      02.12.2022 15:26
      +1

      а поддержка дальнейшая как с выкаткой в прод?

      мне чет кажется это лишь на словах так легко звучит


  1. Arhammon
    02.12.2022 17:30

    Теперь должна встать обратная задача - как покрасить крышу, чтоб здание не опознавалось как здание...


    1. J_8
      02.12.2022 18:44

      Надо рыть метро)