Обезлесяването е основен проблем в наши дни. Може да причини изменение на климата, ерозия на почвата, наводнения и увеличаване на парниковите газове в атмосферата. И такава дейност като незаконната сеч е една от основните причини за обезлесяването. Процесът на намиране на тези чисти сечи се състои от изтегляне на изображения от сателит, предварителна обработка на лентите, анализ на изображението и етикетиране от човек. Така че има много ръчна рутинна работа, която може да бъде автоматизирана с помощта на Deep Learning.

Изглед на изпълнение

За решаването на този проблем е разработено решение, което автоматично изтегля нови изображения от сателитното хранилище, обработва предварително и подготвя данни за сегментиране на сечи. След това модел за дълбоко обучение преобразува изображения в двоични маски на чисти сечи и ги полигонизира във векторни обекти, които могат да бъдат показани на картата. След това крайните потребители могат да проверят всяка открита чиста сечка и да получат статистическа информация за промените в площта с течение на времето.

Услугата се състои от обработка на изображения, бек- и фронтенд на уеб приложение.

Услуга ClearCut: clearcut.quantumobile.com

Обработка на изображение

Изтегляне на изображение

  1. Посочете идентификационни данни за изображение, координати, дата, облачно покритие и т.н.;
  2. Изтеглете каналите на изображението от сървъра Sentinel-2.

Подготовка на изображението

  1. Филтърни канали;
  2. Създайте лента NDVI;
  3. Мащабирайте и обединявайте ленти в един TIFF.

Прогноза на модела

  1. Модел на натоварване;
  2. Маска за прогнозиране на сегментиране;
  3. Полигонизирайте маската;
  4. Запазете полигони и изображение на двоичната маска.

Бекенд на уеб приложение

Бекендът на услугата е просто WSGI приложение зад uWSGI, внедрено с Django и Postgres (PostGIS) за съхраняване на геопространствени данни като полигони. Той осигурява необходимите REST крайни точки за интерфейса на уебсайта, който включва:

а. Обаждане на модел
b. Получаване на площна хистограма
c. Филтриране на чистите сечи по дата

Crontab има планирана актуализация на базата данни (веднъж на всеки 5 дни се изтеглят нови изображения, обработват се и полигоните се записват в базата данни).

Преден интерфейс на уеб приложение

  1. Покажете 3 вида чисти сечи:
    a. Данни, които са се променили с времето
    b. Данни, които не са се променили или са се променили значително
    c. Данни, за които не сме сигурни в случай на облаци или проблеми с изображението
  2. Филтриране по дата

Задача за сегментиране

Както бе споменато по-горе, процесът на намиране на чисти сечи е задача за компютърно зрение. Всяка чиста сеч има своя форма и площ. Така че нашата цел е не само да намерим позицията на ясен изрез (откриване на обект), но и да определим кои пиксели принадлежат към него (семантично сегментиране).

Изображенията по-горе показват пример за входно изображение и желан изход с отделен фон и преден план (чисти изрезки).

Метрика

Първото нещо, което трябва да установим, са нашите показатели. Метриките дават разбираема мярка за ефективността на решението. Ето няколко показателя, които могат да се използват в задачата за сегментиране:

точност

Основната цел на сегментирането е да се отделят екземплярите на преден план от фона. Точността е безполезна, когато класовете ни са изключително небалансирани. В нашия случай чистите сечи съставляват малка част от изображението. Така че точността може да бъде 90%, без дори да бъдат открити чисти сечи.

IoU

Intersection-Over-Union (IoU), известен също като индекс на Jaccard, е един от най-често използваните показатели в семантичното сегментиране. Като цяло показателят IoU има тенденция да санкционира единични случаи на лоша класификация, което е по-информативно, отколкото точност.

Резултат от зарове

Резултатът от Dice или F е много подобен на IoU, но не е толкова строг. Подобно на начина, по който L2 може да санкционира най-големите грешки повече от L1, показателят IoU има тенденция да има ефект на „квадратиране“ на грешките спрямо резултата F. Докато F резултатът измерва средно представяне, IoU резултатът измерва нещо по-близко до най-лошия случай. Така че в нашия случай това е по-подходящ показател.

Функция на загуба

Второто важно нещо е функцията на загубите. По време на обучението на нашия модел за машинно обучение трябва да променим теглата в правилната посока, за да получим по-добри прогнози. В класификацията често използваната функция на загуба е функцията на загуба на кръстосана ентропия. Крос-ентропията намалява, тъй като прогнозата става все по-точна. В нашия случай ние прогнозираме класа пиксел (фон и преден план) и двоичната крос-ентропия показва несигурност между два класа.

Също така, за да санкционираме модела за пропуснати класификации, добавяме загуба на зарове с някакъв коефициент към нашата функция за загуба.

Архитектура на модела

Често използвани невронни мрежови архитектури за семантично сегментиране са U-net, LinkNet, PSPNet и FPN. Ето една лесна за използване реализация на тези модели (Keras, PyTorch). Можете да пускате моделите с различни гръбнаци, които имат предварително обучени тежести.

Тествахме всичко по-горе с опорни мрежи ResNet-50 и ResNet-101. U-net и FPN с ResNet-50 дават най-добри резултати по нашите данни. За по-нататъшни подобрения тествахме само тези архитектури.

Канали

Когато работите със сателитни изображения, добра идея е да използвате допълнителни канали (ленти), за да увеличите производителността на вашия модел. Може да бъде много полезно да видите тези ленти на частта от картата, преди да ги добавите към вашия модел, така че Sentinel-Hub и ArcGis са добри опции за извършване на някои експерименти с канали.

Тествахме много комбинации от канали (RGB, NDVI, NDVI_COLOR, B2, B3, B4, B8) и най-добрата е комбинацията от RGB, NDVI и B8 (инфрачервен). Той е най-рентабилният в случай на време и памет и дава по-добри резултати от обикновен RGB канал.

Работен поток от данни

Основната част от всяка система за машинно обучение са данните. Ние получаваме необработени данни и след това ги преобразуваме в бизнес решение, така че е изключително важно да обработваме нашите данни по правилния начин. Процесът на работа с данни за системата за ясно сегментиране включва няколко стъпки, изброени по-долу.

Изтегляне на изображения от Sentinel-2

Първото нещо, което трябва да направим, е да изтеглим необработени изображения от сателита. В нашия случай ние работим със Sentinel-2 и L2A продукти. L2A данните са атмосферно коригирани, с филтрирани коефициенти на отражение, така че получавате по-ясно изображение без допълнителен шум.

За изтегляне можете да използвате Scihub Copernicus API. В мрежата можете да намерите различни работещи решения, които ви позволяват да зададете параметри за изтегляне по по-лесен начин и ето едно от тях с две реализации: първата на базата на Scihub API и още една на базата на френско огледало .

Предварителна обработка на данни

След изтеглянето трябва да подготвите данните, преди да ги поставите във вашия модел. В изтегления архив имате няколко различни ленти, така че трябва да ги филтрираме. След това създайте NDVI канал от ленти B4 и B8, мащабирайте всички ленти, преобразувайте го в 8-битови изображения (стойности на пиксела 0–255) и ги обединете всички в едно изображение. TIFF форматът е напълно подходящ за съхранение на сателитни изображения. Той запазва метаданни като географски координати, така че можете да преглеждате изображения в QGIS, и съхранява всяка лента като отделен слой.

Оригиналният размер на изтеглените изображения с разделителна способност 10 метра на пиксел е приблизително 10K*10K. Не можем да работим с толкова големи изображения, така че следващата стъпка е да изрежем цялото изображение на малки парчета с размер 224*224.

След това маркираните чисти сечи трябва да бъдат преобразувани от полигони на GeoJSON в двоични маски (0 — фон, 1 — преден план или чист изрез). Възможно е също така да нямате напълно обозначено изображение, така че някои от частите на изображението няма да имат маркиране и ние трябва да ги филтрираме. Можем да зададем праг за процента на пикселите на преден план спрямо общия брой пиксели на изображение, за да се отървем от изображения с малко количество полезна информация. Но е добра идея да оставите някои необозначени изображения, за да подобрите ефективността на модела в региони без чисти сечи, като градове, реки или посеви.

Разделяне на набор от данни

Имайте предвид, че разполагаме с данни от различни сезони, така че можем да обучим различни модели за всеки сезон поотделно или както в нашия случай – да смесим данни от всички сезони заедно.

След подготовката на данните трябва да разделим нашите данни на набори от данни. Наборът от данни за обучение е най-големият, обикновено около 70–80% от всички данни, останалото отива за набори от данни за валидиране и тестване. Ето списък с техники, които могат да се използват за разделяне на вашите данни:

Разделение на обучение/тест

Разделянето на влак/тест е най-простият. Всяко изображение на случаен принцип отива към някои от наборите от данни с фиксирана вероятност. Ние правим единично разделение за влак-тест (70–30%) или многократно разделение за влак-тест-валидиране (70–20–10%).

Стратифицирано разделяне

Стратифицирано разделяне — подобно на разделянето на обучение/тест, но също така запазваме баланса на класовете (площи на полигони). В нашия случай това не доведе до значително подобрение.

Географско разделение

Географско разделяне — тази техника на разделяне се използва, когато работим с различни сезони, които могат да уловят зони, които са леко завъртяни или изместени. Ние разделяме набора от данни по координати, така че предотвратява ситуации, при които данните за влака от един сезон могат да се появят в тестов или валидиращ набор от друг сезон.

Сгънат разделен

Fold split — е само географско разделяне, но чрез гънки. Ние разделяме набора от данни на определен брой сгъвания и един допълнителен за теста. След това използваме класическо кръстосано валидиране, което обикновено дава по-добри резултати от обикновеното разделяне на влак/тест.

Увеличения

От един TIFF файл (10K*10K) получаваме 2401 изображения (224*224) и приблизително само 10–15% от тях са етикетирани. Това е наистина малък брой проби за обучение, дори ако имаме изображения от различни дати. Така че решението на този проблем е да се приложат някои увеличения. Albumentations е добър пакет с внедрени разширения, който също дава възможност за лесно изграждане на конвейери за вашата предварителна обработка. В нашия случай използвахме RGBShift и CLAHE за RGB лента, RandomRotate90 и Flip за всички ленти. Тези подобрения увеличават броя на пробите за обучение, за да се предотврати пренастройването и да не се изкривяват толкова много изображенията.

Резултати

Окончателна конфигурация

Гръбнак: U-Net с ResNet50.

Набор от данни: зима (2016.01.03) и лято (2016.06.21, 2016.08.30, 2019.06.26) + 10% немаркирани изображения за предоставяне на допълнителен контекст (отървете се от неправилно разпознаване в града и други области).

Канали: RGB, NDVI, B8.

Функция за разделяне: разделяне на обучение/тест (80–20%). Ние не използваме географско разделяне, защото открихме област, която не се променя с течение на времето, така че няма смесване на данни от влака и тестове в различни сезони, ако посочим произволното семе.

Хиперпараметри:

  • Адам оптимизатор (lr=1e-3)
  • График (основни етапи = [10, 20, 40], гама = 0,3)
  • Епохи = 100 (тествахме 500 и 700 — и моделът беше преоборудван)
  • Размер на партидата = 8
  • Функция на загуба — двоична кръстосана ентропия, комбинирана с резултат от зара (bce_weitgh=0,2, dice_weight=0,8)

Увеличения:

  • RandomRotate90, Flip, RandomSizedCrop за всички канали
  • RGBShift, CLAHE за RGB канал

Mertics:

  • Влак
    Зарове = 0,5757
    Загуба = 0,3482
  • Потвърждение
    Зарове = 0,5722
    Загуба = 0,3516

При тестови данни без маркиране тази конфигурация дава най-добър резултат. Проверихме производителността на различни дати и версията със 100 епохи не е пренастроена през зимата (на други дати дава ужасни резултати, почти не се открива ясен разрез).

В допълнение към директния подход тествахме следните методи:

Мултикласова прогноза

Можем да разделим чистите сечи на такива класове като нови чисти сечи, които имат по-остри ръбове и контрастен цвят, обрасла чиста сеч, която е изсечена преди много години. Така че нашият модел трябва да предвиди маски и да класифицира типа.

Гръбнак: FPN с Resnet50.

Набор от данни: Есен + 2 лета + зима (26.10.16, 30.08.16, 21.06.16, 03.01.16).
Създадени плочки 320x320 и произволно изрязани 224x224 от тях. Премахнато е „лошото“ маркиране от Dataframes.

Канали: RGB.

Хиперпараметри:

  • Адам оптимизатор (lr=1e-3)
  • График (основни етапи = [10, 20, 40], гама = 0,3)
  • Епохи = 100 (тествахме 500 и 700 — и моделът беше преоборудван)
  • Размер на партидата = 8
  • Функция на загуба — двоична кръстосана ентропия, комбинирана с резултат от зара (bce_weitgh=0,2, dice_weight=0,8)

Увеличения:

  • Случайни ротации
  • Произволен хоризонтал
  • Вертикално обръщане
  • RGBShift
  • КЛАЕ

Mertics:

  • Влак
    Зарове = 0,4727
    Загуба = 0,4476
  • Потвърждение
    Зарове = 0,3873
    Загуба = 0,5154
  • Тест
    Зарове = 0,5296 (добавени вероятности от 2 класа горска сеч)

Прогноза за сезона

Добавено прогнозиране на сезона като допълнителен изход и модифицирана функция за загуба като комбинация от загуба на зарове и двоична кръстосана ентропия за прогнозиране на сезона.

Гръбнак: FPN с Resnet50.

Набор от данни: Есен + 2 лета + зима (26.10.16, 30.08.16, 21.06.16, 03.01.16).
Изтрити са всички данни, където количеството маркиране е твърде малко (‹ 0,1% от размера на изображението) и данни, при които по-голямата част от маркирането е на ръба на изображението.

Канали: RGB.

Хиперпараметри:

  • Адам оптимизатор (lr=1e-3)
  • График (основни етапи = [10, 20, 40], гама = 0,3)
  • Епохи = 100 (тествахме 500 и 700 — и моделът беше преоборудван)
  • Размер на партидата = 8
  • Функция на загуба — двоична кръстосана ентропия, комбинирана с резултат от зарове + двоична кръстосана ентропия за прогнозиране на сезона. (bce_weight=0.2, dice_weight=0.8, season_weight=0.2)

Увеличения:

  • Случайни ротации
  • Произволен хоризонтал
  • Вертикално обръщане
  • RGBShift
  • КЛАЕ

Mertics:

  • Влак
    Зарове = 0,634
    Загуба = 0,25
  • Потвърждение
    Зарове = 0,607
    Загуба = 0,579
  • Тест
    Зарове = 0,5124

Автокодер

Ние сме обучили автоматичен енкодер на нашия набор от данни (също използвахме предварително обучен енкодер на сателитни изображения) и използвахме неговите тегла, за да инициализираме невронна мрежа за сегментиране.

Гръбнак: FPN с Resnet50.

Набор от данни: Есен + 2 лета + зима (26.10.16, 30.08.16, 21.06.16, 03.01.16).
Изтрити са всички данни, където количеството маркиране е твърде малко (‹ 0,1% от размера на изображението) и данни, при които по-голямата част от маркирането е на ръба на изображението.
Създадени са плочки 320x320 и произволно изрязани 224x224 от тях. Премахнато е „лошото“ маркиране от Dataframes.

Канали: RGB.

Хиперпараметри:

  • Адам оптимизатор (lr=1e-3)
  • График (основни етапи = [10, 20, 40], гама = 0,3)
  • Епохи = 100 (тествахме 500 и 700 — и моделът беше преоборудван)
  • Размер на партидата = 8
  • Функция на загуба — двоична кръстосана ентропия, комбинирана с резултат на зарове. (bce_weight=0.2, dice_weight=0.8)

Увеличения:

  • Случайни ротации
  • Произволен хоризонтал
  • Вертикално обръщане
  • RGBShift
  • КЛАЕ

Mertics:

  • Влак
    Зарове = 0,4943 (средна партида)
    Загуба = 0,4355 (средна партида)
  • Потвърждение
    Зарове = 0,5696 (средна партида)
    Загуба = 0,3750 (средна партида)
  • Тест
    Зарове = 0,4422 (средно)

Гънки

Използвахме кръстосано валидиране на гънките за разделяне на набора от данни. Дава известно подобрение, но не го използвахме в производството, защото не сме го тествали с многоканални изображения.

Гръбнак: FPN с Resnet50.

Набор от данни: Есен + 2 лета + зима (26.10.16, 30.08.16, 21.06.16, 03.01.16).
Създадени плочки 320x320 и произволно изрязани 224x224 от тях. Премахнато „лошо“ маркиране от Dataframes.
Данните бяха разделени с помощта на географска информация. Долната част от маркировката/изображението беше взета в тестовия набор. Горната част на изображението беше разделена на равни части между комплекти за влак и валидиране.
Разпределение на гънките по брой:

  1. влак: 478, val: 77
  2. влак: 431, val: 124
  3. влак: 444, val: 111
  4. влак: 416, val: 139

Канали: RGB.

Хиперпараметри:

  • Адам оптимизатор (lr=1e-3)
  • График (основни етапи = [10, 20, 40], гама = 0,3)
  • Епохи = 100 (тествахме 500 и 700 — и моделът беше преоборудван)
  • Размер на партидата = 8
  • Функция на загуба — двоична кръстосана ентропия, комбинирана с резултат на зарове. (bce_weight=0.2, dice_weight=0.8)

Увеличения:

  • Случайни ротации
  • Произволен хоризонтал
  • Вертикално обръщане
  • RGBShift
  • КЛАЕ

Mertics:

  • Тренирайте чрез гънки
  1. Зарове = 0,6543
    Загуба = 0,2936
  2. Зарове = 0.6496
    Загуба = 0.3002
  3. Зарове = 0.6876
    Загуба = 0.2650
  4. Зарове = 0.6667
    Загуба = 0.2849
  • Потвърждение чрез сгъване
  1. Зарове = 0,6259
    Загуба = 0,3251
  2. Зарове = 0.5970
    Загуба = 0.3421
  3. Зарове = 0.6801
    Загуба = 0.2802
  4. Зарове = 0.6363
    Загуба = 0.3080
  • Тест
    Зарове = 0,5643

Онлайн услуга

Като краен резултат създадохме уеб приложение, което позволява наблюдение на състоянието на горите. Приложението чете и обработва данни от сателита веднъж на всеки 5 дни, извършва сегментиране, конвертира резултатите от полигоните и съхранява резултатите. Крайните потребители имат възможност да видят голите сечи на картата и да сравнят горските условия през времето.

Програмата открива и класифицира сечищата за определен период от време. Така потребителите могат лесно да разпознават стари и нови.

Данните се показват на OpenStreetMap (в момента само за един регион). Там можем да намерим следните класове чисти сечи:

  1. Жълт многоъгълник — зоната на обезлесяване, която не се променя през определения период от време.
  2. Червен полигон — зоната, в която е открита увеличена площ на обезлесяване.
  3. Сив многоъгълник — зоните с несигурност относно чистите сечи. Преди имаше сечи, но сега ги няма. Облаците и други променливи фактори могат да повлияят на прогнозите на модела.

За всяка чиста сечка можем да начертаем графика, съответстваща на промените в нейната площ. Когато щракнем върху чистата сеч, получаваме хистограма с площта на обезлесяването във времето. Помага да се определят райони с най-интензивна сеч.

Заключение

Обезлесяването е голям проблем, но ние се опитахме да предприемем стъпки за разрешаването му с модерни техники. Дълбокото обучение е страхотен инструмент, който може да направи нашата планета и живот по-добри. Но това не е окончателното решение, ние продължаваме да подобряваме производителността и точността на модела. Проектът е с отворен код, така че вие ​​също можете да допринесете. Радваме се да получим обратна връзка, предложения и въпроси от вас.

Услуга ClearCut: clearcut.quantumobile.com
Git хранилище: github.com/QuantuMobileSoftware/clearcut_detection

Написано от Никита Лузан
Корекция от Надия Пивовар, Клим Ямковый