Kaggle анализ на терена на Амазонка от сателитни изображения

Наскоро имаше състезание „Планетата да разбере Амазонка от космоса“ на kaggle.com Не бях правил разпознаване на изображения преди, така че реших, че това е чудесен шанс да се науча как да работя с картини. Освен това, според уверенията на хората в чата, прагът за влизане е много нисък, някой дори нарече набора от данни „MNIST на стероиди“.
Всъщност с какво започва всяко състезание - с формулирането на проблема и показателя за качество. Задачата беше следната: бяха дадени сателитни снимки на района на Амазонка и за всяко изображение беше необходимо да се поставят етикети: път, река, поле, гора, облаци, ясно небе и т.н. (общо 17 броя). Освен това няколко класа могат да бъдат едновременно на една снимка. Както можете да видите, освен вида на терена, имаше и класове, свързани с метеорологичните условия и, което изглежда логично, на снимката може да има само едно време. Е, не може да е ясно и облачно едновременно. Когато решавах състезанието, не гледах данните с очите си, надявайки се, че самата машина ще разбере кой е чий брат, така че трябваше да се разровя, за да дам примери за изображения:

Как да решим такъв проблем? Вземете някаква конволюционна невронна мрежа, предварително обучена на голям набор от данни, и обучете теглата на вашия собствен набор от снимки. На теория, разбира се, чух това и всичко тук изглежда ясно, но досега ръцете ми не са стигнали до него и не са го приложили на практика. Е, първата стъпка е да изберете рамка за работа. Тръгнах по лесния начин и използвах keras, тъй като има много добра документация и четим от човека код.
Сега малко повече за процедурата за допълнителна тренировка на тежести (в индустрията това се наричаFine-tune). Взимаме конволюционна невронна мрежа,например VGG16, обучен на набор от данни на ImageNet, състоящ се от няколко милиона снимки, предсказва един от 1000 класа. Е, тя прогнозира котка, куче, кола и какво от това? Имаме напълно различни класове ... И въпросът е, че по-ниските слоеве на невронната мрежа вече са в състояние да разпознаят такива основни компоненти на изображението като линии и градиенти. Просто трябва да премахнем най-горния слой от 1000 неврона и да го заменим с наши собствени от 17 неврона (това е колко класове могат да бъдат на сателитните изображения).
Така невронната мрежа ще предвиди вероятността за всеки от 17-те класа. Как да кажем с вероятност дали има определен клас на снимката? Най-простата идея е да се отреже с един праг: ако вероятността е по-голяма от например 0,2, тогава включваме класа, ако е по-малка, тогава не го включваме. Можете да изберете този праг за всеки клас поотделно и аз не измислих нищо по-умно от независимо (което разбира се не е вярно, подобряването на един праг може да повлияе на избора на друг), сортирайки, както се наричаха в чата,прагове.
Казано, сторено. Резултатът етоп 90%от класацията. Да, лошо е, но трябва да се започне отнякъде. И тук искам да кажа за огромното предимство на състезанието - форум, където много хора, професионалисти и не толкова, работят върху един проблем и дори се публикуват готови базови линии. От дискусиите веднага разбрах, че съм сбъркал фината настройка. Факт е, че трябва да тренирате тежестите на два етапа:
- „Замразете“ теглата на всички слоеве, с изключение на последния (този от 17 неврона) и обучете само него
- След като загубата спадне до определена стойност и ще продължи да се колебае около нея, „размразете“ всички тежести и обучете цялата мрежа
увеличения
Чух, че за да обогатите набора от данни, можете да направите аугментация - някои трансформации на изображението, подадено на входа на невронната мрежа. Е, наистина, ако обърнем картината, тогава реката или пътят няма да отидат никъде, но сега за тренировка ще имаме не една снимка, а две. Реших да не бъда много умен и завъртях снимките само под ъгли, кратни на 90 градуса, и също ги огледах. По този начин размерът на обучителния набор от данни се увеличи 8 пъти, което незабавно имаше положителен ефект върху качеството.

Ансамбъл 1
Напоследък има мнение, че за да спечелите състезанието, просто трябва да „стекате xgboosts“. Да, без изграждане на ансамбли е малко вероятно да успеете да стигнете до върха, но без добро инженерство на функции, без компетентно валидиране, това просто няма да даде резултат. Ето защо, преди да продължите с ансамбъла, трябва да свършите много работа. Какви модели могат да се комбинират в проблем с разпознаване на изображение? Очевидната идея е различни архитектури на конволюционни невронни мрежи. Можете да прочетете за техните топологии в тази статия.
Използвах следното:
- VGG16
- VGG19
- Resnet101
- Resnet152
- Начало_v3
Най-малкото стигнах до границата на бронзовия медал. Междувременно оставаше седмица до края на състезанието. Точно по това време идва така нареченият merge deadline - моментът, след който екипирането е забранено. И сега, 20 минути преди крайния срок, си мисля, защо всъщност не се обединя с някой в екип? Поглеждам класацията с надеждата да намеря някой от чата близо до мен. Но никой не е онлайн. Само асанакой, който по това време беше с 40 реда по-висок от мен. Какво, изведнъж? Е, написах. Остават 2 минути до крайния срок - получавам отговор, че asanakoy не е против обединяването, ако съм готов да продължа да правя нещо. Артьом Санакоев се оказа докторант по компютърно зрение с вече победи в състезания, което, разбира се, не можеше да не ме зарадва. Работата в екип еогромен плюсот участието в състезания на kaggle, защото позволява на начинаещи като мен да научат нови неща директно от своите по-опитни колеги, докато решават проблем заедно. Опитайте се да участвате и ако имате дори малки успехи и голямо желание да направите нещо, тогава определено ще бъдете отведени в екипа, където ще ви научат на всичко и ще ви покажат всичко. Е, първото нещо, което искате след сливането, е да получите незабавен тласък чрез сливане на вашите решения. Което и направихме, като се изкачихме с 30 позиции, което беше доста добре предвид минималните усилия, положени в него. Благодарение на Артьом разбрах, че съм обучил много мрежите си и един от неговите модели в кошчето направи всички мои комбинирани по отношение на качеството. Но все още имаше време за използванесъвет от неговия съотборник да поправи всичко.
Ансамбъл 2
И сега оставаха няколко дни до края на състезанието, Артьом замина за конференцията на CVPR, а аз останах да седя с куп прогнози за различни мрежи. Осредняването е добре, но има по-напреднали техники като залагане. Идеята е да разделите набора за обучение, например, на 5 части, да обучите модела на 4 от тях, да прогнозирате на 5-та, и да направите това за всичките 5 сгъвания. Обяснителна снимка:

Можете да прочетете повече за залагането, като отново използвате конкуренцията като пример, тук.
Как да приложим това към нашия проблем: имаме прогнози за вероятностите на всяка мрежа за всеки от 17-те класа, за общо 6 мрежи * 17 класа = 102 характеристики. Това ще бъде нашият нов тренировъчен комплект. На получената таблица обучих двоичен класификатор за всеки от класовете (общо 17 класификатора). В резултат на това изходът беше вероятностите за етикети за всяко изображение. След това можем да приложим към тях използвания преди това алгоритъм. Но, за моя изненада, залагането се представи по-лошо от обикновеното осредняване. За себе си обясних това с факта, че имахме различни разделения на комплекта за обучение на гънки - Артьом използваше 5 гънки, а аз само 4 (колкото повече гънки, толкова по-добре, но трябва да отделите повече време за обучение на модели). Тогава беше решено да се заложи само на прогнозите на техните невронни мрежи и след това да се вземе претеглената сума на резултата с прогнозите на Артьом. Следните бяха използвани като модели от второ ниво: lightgbm, xgboost и трислоен перцептрон, след което техните резултати бяха осреднени.

И тук залагането наистина започна да работи, в класацията се изкачихме до уверени сребърни медали. Почти не останаха идеи и време и реших да добавя още една към залоганевронна мрежа с последния слой от четири неврона и softmax активация, която предсказва само метеорологичните условия. Ако е известна по-тясна задача, тогава защо да не я използваме? Това даде подобрение, но да не кажа, че беше много силно.
Въпреки това, в резултат се озовахмена 17-то мястоот почти хиляда, което изглежда много добре за първото състезание по дълбоко обучение. Златните медали започнаха от 11-то място и разбрах, че сме много близо, а решението се различава от горното, може би само в детайлите на изпълнението.