Виклик маскування зображень Carvana - інтерв’ю переможця 1-го місця

Опубліковано спочатку: 22.12.2017

виклик

Цього року Carvana, успішний стартап вживаних автомобілів в Інтернеті, закликав спільноту Kaggle розробити алгоритм, який автоматично видаляє фон фотостудії. Це дозволило б Carvana накладати машини на різні фони. В інтерв’ю цього переможця команда перших за рейтингом команд з обробки зображень, названа Team Best [over] fitting, детально ділиться своїм підходом до перемоги.

Як це часто трапляється на змаганнях, ми ніколи не зустрічались особисто, але ми досить добре знали одне одного з плідних бесід про глибоке навчання, проведених у російськомовній спільноті Open Data Science, ods.ai.

Хоча ми брали участь у команді, ми працювали над 3 незалежними рішеннями до злиття за 7 днів до кінця змагань. Кожне з цих рішень потрапило в 10 найкращих - Артьом та Олександр опинились на 2-му місці, а Володимир - на 5-му. Нашим остаточним рішенням було просте середнє з трьох прогнозів. Ви також можете побачити це в коді, який ми підготували для організаторів і випустили на GitHub - є 3 окремі папки:

Кожен з нас витратив на цю проблему близько двох тижнів, хоча для повного відтворення нашого рішення на одному Titan X Pascal потрібно було б близько 90 днів тренуватися і 13 днів робити прогнози. На щастя, у нас було близько 20 графічних процесорів. З точки зору програмного забезпечення, ми використовували PyTorch як Deep Learning Framework, OpenCV для обробки зображень та imgaug для збільшення даних.

Мене звати Володимир Ігловіков. Я отримав ступінь магістра теоретичної фізики високих енергій у Санкт-Петербурзькому державному університеті та доктор філософії. з теоретичної фізики конденсованої речовини з університету Девіс. Після закінчення навчання я спочатку працював у кількох стартапах, де моя повсякденна робота була важкою в традиційному домені машинного навчання. Кілька місяців тому я приєднався до Lyft як науковий співробітник з фокусом на комп'ютерному зорі.

Я вже брав участь у кількох змаганнях з сегментації зображень, і накопичений досвід був справді корисним для вирішення цієї проблеми. Ось мої минулі досягнення:

Цей виклик був схожий на вищезазначені проблеми, і спочатку я не планував брати участь. Але лише для перевірки стану розумності я вирішив зробити кілька подань із скопійованим конвеєром з попередніх проблем. Дивно, але після кількох спроб я потрапив у топ-10, і хлопці запропонували команді об’єднатися. Крім того, Олександр спокусив мене, пообіцявши поділитися своїм підходом, не пов'язаним з ООН, який споживає менше пам'яті, швидше зближується і, мабуть, є більш точним.

Що стосується апаратних засобів, у мене вдома було 2 машини, одна для створення прототипів з 2 х Titan X Pascal і одна для важкого підйому з 4 x GTX 1080 Ti.

Мене звати Олександр Буслаєв. Я закінчив університет ІТМО, Санкт-Петербург, Росія. Я маю 5-річний досвід класичного комп'ютерного зору і працював у ряді компаній у цій галузі, особливо в БПЛА. Близько року тому я почав використовувати глибоке навчання для різних завдань в обробці зображень - виявлення, сегментація, маркування, регресія.

Мені подобаються змагання з комп’ютерного зору, тому я також брав участь у:

Мене звуть Артьом Санакоєв. Я отримав ступінь магістра з прикладної математики та інформатики в Білоруському державному університеті, Мінськ, Білорусь. Після закінчення університету я розпочав ступінь доктора філософії. в галузі комп'ютерного бачення в Гейдельберзькому університеті, Німеччина.

Мої основні наукові інтереси лежать на стику комп’ютерного бачення та глибокого навчання, зокрема, безконтрольного навчання та метричного навчання. У мене є публікації на конференціях Computer Vision/Deep Learning, таких як NIPS та CVPR.

Для мене Kaggle - це місце, де можна вдосконалити свої прикладні навички та трохи розважитись. Поза Carvana я брав участь у кількох інших змаганнях з комп’ютерного зору:

Метою цього конкурсу було створення моделі двійкової сегментації зображень автомобілів з високою роздільною здатністю.

  • Кожне зображення має роздільну здатність 1918x1280.
  • Кожен автомобіль представлений у 16 ​​різних фіксованих орієнтаціях:

  • Комплект поїздів: 5088 зображень.
  • Тестовий набір: 1200 для загального користування, 3664 для приватного, 95200 були додані для запобігання ручному маркуванню.

Загалом, якість даних про змагання була дуже високою, і ми вважаємо, що цей набір даних може потенційно використовуватись як чудовий орієнтир у спільноті комп'ютерного зору.

Різниця в балах між нашим результатом (0,997332) та результатом другого місця (0,997331) становила лише 0,00001, що можна інтерпретувати як середнє покращення на 2,5 пікселя на 2 500 000 пікселів зображення. Чесно кажучи, нам тут просто пощастило. Коли ми готували рішення для організаторів, ми інвестували додатковий час і вдосконалили наше рішення до 0.997343 на приватному LB.

Щоб зрозуміти обмеження наших моделей, ми провели візуальний огляд прогнозів. Щодо набору поїздів ми розглянули випадки з найнижчими оцінками.

Більшість виявлених помилок були пов’язані з непослідовним маркуванням, де найпоширенішою проблемою були отвори в колесах. У деяких автомобілях вони були в масках, а в деяких - ні.

У нас немає оцінки перевірки для набору тестів, але ми виявили проблемні зображення, підрахувавши кількість пікселів, де надійність прогнозування мережі була низькою. Щоб врахувати різний розмір автомобілів на зображеннях, ми розділили це число на площу фону. Наша метрика "ненадійності" була розрахована як кількість пікселів з оцінками в інтервалі [0,3, 0,8], поділена на кількість пікселів з оцінками в інтервалі [0, 0,3) + (0,8, 0,9). Звичайно, інші підходи на основі теорії інформації може бути більш надійною, але ця евристика працювала досить добре.

Потім ми ранжирували зображення за оцінкою "невпевненість" і візуально перевіряли найкращі прогнози. Ми з’ясували, що більшість помилок були пов’язані з неправильним маркуванням людей категорією “білий фургон”. Мережі послідовно давали низькі прогнози щодо таких зображень. Ми вважаємо, що це було пов’язано з низькою присутністю білих фургонів у навчальному наборі та низьким контрастом між фургоном та білим тлом. На зображенні нижче показано сірі області в масці, де достовірність прогнозування була низькою.

Ми не єдині, хто стикався з цією проблемою. Це було обговорено на форумі, а інші учасники застосували евристику після обробки для вирішення цього та подібних випадків.

Було також кілька навчальних масок з великими помилками, як показано нижче. Heng CherKeng розмістив виправлені версії масок на форумі, але їх кількість була відносно невеликою, і ми не використовували їх під час навчання.

Моєю першою спробою було використовувати UNet з тією ж архітектурою, що і Сергій Мушинський. Я використовував це раніше для виявлення функцій супутникових зображень DSTL минулої весни, але мені не вдалося досягти рівня 0,997 (

50-е місце в Громадському ЛБ).

У виклику DSTL UNet з попередньо навченим кодером працював точно так само, як якщо б його ініціалізували випадковим чином. Я також зміг показати хороший результат без попередньо підготовленої ініціалізації в інших випробуваннях, і через це у мене склалося враження, що для UNet попередньо навчена ініціалізація непотрібна і не дає переваг.

Зараз я вважаю, що ініціалізація архітектур типу UNet з попередньо навченими вагами покращує збіжність та продуктивність двійкової сегментації на 8-бітних вхідних зображеннях RGB. Коли я спробував UNet з кодером на базі VGG-11, я легко отримав 0,972 (топ-10 на загальнодоступній таблиці лідерів).

Для збільшення зображень я використовував горизонтальні перевертання, кольорові збільшення та перетворення автомобіля (але не тла) у відтінки сірого.

ВЕРХ ВЛІВО - ОРИГІНАЛ, ВЕРХ ПРАВО - АВТОМОБІЛ В СІНІМ, ВНИЗ РЯД - ЗБІЛЬШЕННЯ В ПРОСТОРІ ВПЛ.

Оригінали зображень мали роздільну здатність (1918, 1280) і були замінені на (1920, 1280), так що кожна сторона ділилася на 32 (мережеві вимоги), а потім використовувалася як вхід.

Завдяки цій архітектурі та розміру зображення я міг помістити лише одне зображення на графічний процесор, тому я не використовував більш глибокі кодери, такі як VGG 16/19. Також мій пакетний розмір був обмежений лише 4 зображеннями.

Одним із можливих рішень було б тренування на посівах та прогнозування на повних зображеннях. Однак у мене склалося враження, що сегментація працює краще, коли об’єкт менше, ніж вхідне зображення. У цьому наборі даних деякі машини займали всю ширину зображення, тому я вирішив не обрізати зображення.

Іншим підходом, який застосовували інші учасники, було зменшення масштабу вхідних зображень, але це може призвести до певних втрат точності. Оскільки бали були настільки близькі один до одного, я не хотів втратити жодного пікселя на цих перетвореннях (згадайте запас 0,000001 між першим та другим місцем на приватному лідері)

Щоб зменшити дисперсію прогнозів, я здійснив мішкування, тренуючи окремі мережі у п’ять складок та складаючи в середньому їх п’ять передбачень.

У своїй моделі я використовував таку функцію втрат:

Він широко використовується в сегментації двійкових зображень, оскільки спрощує порогове значення, пересуваючи передбачення до кінців інтервалу [0, 1].

Я використовував Adam Optimizer. Протягом перших 30 епох я знизив рівень навчання в два рази, коли втрата від перевірки не покращилася протягом двох епох. Потім ще 20 епох я використовував циклічну швидкість навчання, коливаючись між 1е-4 і 1е-6 за розкладом: 1е-6, 1е-5, ​​1е-4, 1е-5, ​​1е-6, з 2 епохами в кожному циклі.

За кілька днів до кінця змагань я спробував псевдо-маркування, і це продемонструвало постійний приріст балів, але у мене не було достатньо часу, щоб повністю використати потенціал цієї техніки у цьому виклику.

Передбачення для кожного згину без подальшої обробки:

Як і всі інші, я почав з добре відомої архітектури UNet і незабаром зрозумів, що на моєму обладнанні мені потрібно або змінити розмір вхідних зображень, або назавжди почекати, поки воно не дізнається нічого хорошого в обробці зображень. Моєю наступною спробою було створити грубу маску та створити урожай лише вздовж кордону, проте навчання все ще було занадто повільним. Потім я почав шукати нові архітектури і знайшов навчальне відео з машинного навчання, де показано, як використовувати LinkNet для сегментації зображень. Я знайшов вихідний документ і спробував його.

LinkNet - це класична архітектура сегментації кодера-декодера із наступними властивостями:

  1. Як кодер він використовує різні рівні полегшених мереж, таких як Resnet 34 або Resnet 18.
  2. Декодер складається з 3 блоків: згортка 1x1 з n // 4 фільтрами, транспонована згортка 3x3 з кроком 2 і n // 4 фільтри, і, нарешті, ще одна згортка 1x1 для відповідності кількості фільтрів із вхідним розміром.
  3. Елементи кодера та декодера з відповідними розмірами карти об'єктів з'єднані за допомогою операції плюс. Я також намагався об'єднати їх у розмір фільтрів і використовувати conv1x1, щоб зменшити кількість фільтрів у наступних шарах - це працює трохи краще.

Основний недолік цієї архітектури пов’язаний з першою потужною функцією, яка починається із в чотири рази меншим розміром зображення, тому вона може бути не такою точною, як можна було очікувати.

Я вибрав Resnet 34 для кодера. Я також спробував Resnet 18, який був недостатньо потужним, і Resnet 50, який мав безліч параметрів і був важчим у навчанні. Кодер був попередньо підготовлений до набору даних Imagenet. Тренування однієї епохи займало всього 9 хвилин, і гідне рішення було створено лише через 2–3 епохи! Ви, безумовно, повинні спробувати LinkNet - він надзвичайно швидкий та ефективно працює з пам'яттю. Я навчив його на повних 1920 * 1280 зображеннях з 1 зображенням/графічним процесором (7,5 Гб) для партії.

Я застосував м’яке збільшення: горизонтальне перевертання, зміщення на 100 пікселів, масштабування 10%, обертання на 5 ° та збільшення HSV. Крім того, я використовував оптимізатор Адама (та RMSProp) із швидкістю навчання 1e-4 протягом перших 12 епох та 1e-5 ще 6 епох. Функція втрат: 1 + до н.е. - кістки. Збільшення часу випробування: горизонтальне перевертання.

Я також виконував мішки, щоб зменшити дисперсію прогнозів. Оскільки мій час навчання був настільки швидким, я міг тренувати кілька мереж і орієнтувати їх прогнози. Нарешті, у мене було 6 різних мереж, з трюками та без них, з 5 складаннями в кожній мережі, тобто я в середньому складав 30 моделей. Це не велике абсолютне покращення, кожна мережа внесла певний внесок, і різниця в балах з другим місцем на приватному лідері була незначною.

Менш поширені трюки:

  1. Замініть знак плюс у LinkNet пропустити з'єднання на concat і conv1x1.
  2. Важкий негативний видобуток: повторіть найгіршу партію з 10 партій.
  3. Попередня обробка адаптивного вирівнювання гістограми з обмеженим контрастом (CLAHE): використовується для додання контрасту чорному дну.
  4. Кінець циклу навчання наприкінці. Точний графік темпів навчання складався з 3 циклів: (2 епоха 1е-4, 2 епоха 1е-5, ​​1 епоха 1е-6). Зазвичай я повинен вибирати по одній контрольній точці за цикл, але через високий час висновку я просто вибрав найкращу контрольну точку з усіх циклів.

Я навчив дві мережі, які були частиною нашого остаточного подання. На відміну від моїх товаришів по команді, які тренували свої моделі на зображеннях із повною роздільною здатністю, я використовував змінені розміри 1024x1024 вхідних зображень і збільшував передбачувані маски до початкової роздільної здатності на етапі виведення.

Перша мережа: UNet з нуля

Я розробив спеціальний UNet на 6 згорткових блоків вгору/вниз. Кожен блок Дауна складався з 2-х згорткових шарів, за якими йшов 2x2-макс. Кожен блок Up мав дволінійний шар збільшення масштабу, за яким слідували 3 згорткові шари.

Мережеві ваги ініціалізувались випадковим чином.

Я використав f (x) = BCE + 1 - DICE як функцію втрат, де BCE - це двійкова втрата поперечної ентропії на піксель, а DICE - оцінка кубика.

При обчисленні втрати BCE кожен піксель маски зважувався відповідно до відстані від кордону автомобіля. Цей фокус був запропонований Хенгом Черкенгом. Пікселі на кордоні мали в 3 рази більшу вагу, ніж глибоко всередині області автомобіля.

Дані були розділені на 7 складок без розшарування. Мережу навчали з нуля протягом 250 епох, використовуючи SGD з імпульсом, помножуючи швидкість навчання на 0,5 кожні 100 епох.

Друга мережа: UNet-VGG-11

В якості другої мережі я взяв UNet з VGG-11 як кодер, схожий на той, який використовував Володимир, але з ширшим декодером.

VGG-11 („VGG-A“) - це 11-шарова згорткова мережа, запроваджена Simonyan & Zisserman. Принадність цієї мережі полягає в тому, що її кодер (VGG-11) був попередньо підготовлений до набору даних Imagenet, що є справді гарною ініціалізацією ваг.

Для перехресних перевірок я використав 7 складок, стратифікованих загальною площею масок для кожного автомобіля у всіх 16 орієнтаціях.

Мережа тренувалася протягом 60 епох із зваженими втратами, як і в першій мережі, з циклічним темпом навчання. Один цикл навчання складає 20 епох: 10 епох з base_lr, 5 епох з base_lr * 0,1 та 5 епох з base_lr * 0,01.

Ефективний розмір партії становив 4. Коли він не поміщався в пам'ять графічного процесора, я накопичував градієнти протягом декількох ітерацій.

Я використовував два типи збільшення:

  • Важкий - випадковий переклад, масштабування, обертання, зміна яскравості, зміна контрасту, зміна насиченості, перетворення в шкалу сірого.
  • Світло - випадковий переклад, масштабування та обертання.

Перша модель була навчена з важкими збільшеннями. Другий тренувався протягом 15 епох з важким збільшенням і протягом 45 епох з легким збільшенням.

Всього я навчив 14 моделей (2 архітектури, по 7 складок). У таблиці нижче наведено оцінку кісток при перехресному підтвердженні та загальнодоступному LB.

Складання моделей із різних складок (рядок «ансамбль» у таблиці) проводили шляхом усереднення 7 прогнозів із 7 складок на тестових зображеннях.

Як бачите, ансамблі обох мереж мають приблизно однакову продуктивність - 0,9972. Але завдяки різній ініціалізації архітектур та ваг, поєднання цих двох моделей вносить вагомий внесок у роботу остаточного ансамблю нашої команди.

Ми використовували просте середнє значення моделей на рівні пікселів як стратегію злиття. Спочатку в середньому ми отримали 6 * 5 = 30 моделей Олександра, а потім усе середнє з ним.

Ми також хотіли знайти викиди та важкі випадки. Для цього ми взяли усереднене передбачення, знайшли пікселі в діапазоні ймовірностей 0,3–0,8 і позначили їх як ненадійні. Потім ми відсортували всі результати з ненадійною піксельною областю і додатково обробили найгірші випадки. Для цих випадків ми відібрали моделі, які працювали найкраще, та скоригували межу ймовірності. Ми також виконували опуклий корпус на ділянках з низькою надійністю. Цей підхід дав гарні маски для випадків, коли наші мережі не працювали.