С голямо удоволствие следях „fast.ai MOOC“, за да намокря краката си със задълбочено обучение. Част 1, която се фокусира върху бързото започване с авангардни техники, беше доста необичайна, което ме мотивира да продължа към част 2. Темпото обаче се променя с част 2 и това е по-скоро като сделка тип Area51. За да цитирам Портал 2: „Ние хвърляме науката в стената тук, за да видим какво остава“. Оказва се, че има някои неща, които биха накарали Кейв Джонсън да се гордее, но кривата на обучение е адски стръмна. Сблъсквате се с това с главата напред в Лекция 9, когато става сериозно за откриване на множество обекти в реално време.

Проблемът

Джереми, лекторът на fast.ai, прави честен опит да въведе темата бавно, но краткият код и безбройните отклонения в допирателни теми (като защо кодът е кратък) всъщност не помагат. Открих, че трябва да превъртам толкова много пъти, че всъщност мога да синхронизирам устните с Джеръми, докато той обяснява частта с функцията за загуба. Освен това имам необичайно дебел череп, който не помага, когато се опитвам да разбера трудна тема.

Целта на тази публикация е да мога да обясня на версията на мен, която съществуваше преди 6 дни, какво представлява SSD, на обикновен английски (приемайки известни предварителни познания за Deep Learning). Имайки предвид тази доста интуитивна основа, лекцията трябва да бъде по-лесна за възприемане. Няма да навлизам в тънки технически подробности, това просто ще отвлече вниманието от интуитивното разбиране. Планирам да навляза повече в това в по-късна публикация.

Обяснението по-долу е малко специфично за SSD, но нека бъдем реални, то е толкова високо ниво, че можете да го интерпретирате и за архитектурата YOLO.

Multibox детектор за единичен изстрел

Общата идея на SSD е следната: ще започнем с вече съществуваща конволюционна мрежа, която вече може да „вижда“ (хартията за SSD използва предварително обучен VGG16, Jeremy използва ResNet34). Под „виждам“ имам предвид, че може надеждно да класифицира обекти от реалния свят като коли, самолети, котки, кучета и т.н.

Върху тази „гръбначна“ мрежа ще поставим SSD „глава“, която ще излъчи координатите на ограничаващите кутии и какви класове мрежата смята, че съдържат тези кутии. Той ще направи това въз основа на последователни конволюционни слоеве, изградени върху „основната“ мрежа.

Уау, задръжте телефона, „кутии“?

Идеята всъщност е доста проста. Да приемем, че сте конволюционна мрежа и вече можете да „виждате“. Сега искам да отидете на следващото ниво и да ми кажете координатите на кутиите в картината, които съдържат „обектите“, които разпознавате.

В момента обаче това е малко напрегнато: вие сте обучени да класифицирате изображения, разбира се, но измислянето на координати от нищото е трудна задача, особено ако има множество обекти/кутии.

Няма проблем, ще ви помогна: просто ще ви дам предварително дефиниран списък с кутии (наричаме ги „закотвени кутии“), които можете да използвате. Всичко, което трябва да направите, е да ги преместите малко или може би да ги мащабирате малко, така че да съдържат всичко, което е в близост до тази кутия. О, и ще трябва да ми кажеш какъв е класът на обекта, който имаш в тези кутии.

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

И така, как да разбера дали се справяте добре с изплюването на ограничаващи полета? Това е доста лесен процес, който работи на два етапа. Първият етап е по-често наричан „етап на съвпадение“.

Етап 1

По време на етапа на съпоставяне ще прегледам всички полета, които извеждате, и ще изчисля тяхното припокриване с полетата на основната истина, които имам. Метриката, която ще използвам за това, се нарича индекс на Жакард (известен още като IOU). Ако индексът на Jaccard е по-нисък от 0,5, ще игнорирам тази прогноза напълно. Това има интуитивен смисъл: как мога да степенувам вашите прогнози, ако няма основна истина, с която да ги сравня?

Етап 2

Ако обаче индексът на Jaccard е по-голям от 0,5, това означава, че е имало „съвпадение“ и ще премина към втория етап. Тук ще оценя вашата прогноза на две части:

  • Ще изчисля L1 загубата на координатите, които сте предвидили, и ще ви възнаградя, ако намерите начин да промените (да се чете: backprop) вашия алгоритъм, за да намалите тази загуба (т.е. да направите припокриването по-голямо)
  • Освен това ще разгледам класа, който сте предвидили за тази кутия, и ще ви възнаградя, ако намерите начин да промените алгоритъма си, за да получите правилния клас и бъдете уверени в него (двоична загуба на кръстосана ентропия, това е стандартно нещо, което сте виждали за многокласова класификация в част 1)

Това е наистина.

Повече за Anchor Boxes

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

Въпреки това ще забележите, че Джереми не се придържа към ваниловите кутии за дълго. Когато говори за „Още анкерни кутии!“ около знака 2:05:00, ще забележите, че той започва да ги увеличава, като променя съотношението и размера им. Това е, за да помогне на алгоритъма още повече!

Как е това? Запомнете: алгоритъмът може само малко да промени полетата. Ние му помагаме, като не само го захранваме със стандартни, квадратни, решетъчноклетъчни кутии, но и с техните деформирани варианти! Това по-късно ще се свърже с фактора k, който можете да видите да плава около кода на архитектурата на SSD.

Размери на обекта

Но чакайте, има още! Нека си представим, че имате картина и сме я сегментирали в решетка 4x4. Както беше посочено по-горе, ние ще превърнем тази решетка в 16 анкерни кутии, може би ще направим известно увеличение и ще ги подадем към алгоритъма. Готино.

Но какво ще стане, ако в тази снимка има обект, като велосипедиста по-долу, който заема цяло пространство 2x4? Просто няма начин алгоритъмът да може да „настрои“ само една от малките 16 анкерни кутии, за да пасне на целия колоездач, дори ако му помогнем с увеличаване.

За щастие, както споменахме по-горе, SSD прави навивки. И така, ето какво ще направим в SSD главата:

  • Ще имаме конволюционен слой, който използва решетка 4x4 и ще извежда ограничителни кутии и класове
  • Но също така ще вземем този слой 4x4 и ще го поставим през Conv2D със стъпка 2. Това ни води до мрежа 2x2. Тук отново ще го накараме да изплюе ограничителни кутии и класове
  • Тогава ще го направим отново! Една крачка Conv2D 2 по-късно, завършваме с мрежа 1x1, която отново изхвърля ограничителни кутии и класове

Ако помислите добре, ще се съгласите, че при резолюция 4x4, една от тези 16 кутии просто не може да бъде разтегната достатъчно, за да пасне на велосипедиста 2x4. Не забравяйте, че нашият алгоритъм може да прави само незначителни корекции на котвите, които предлагаме. Въпреки това, може би една от 4-те кутии в слоя 2x2 може да пасне на обекта, ако алгоритъмът го мащабира juuust правилно. И дори ако те са твърде малки, сигурно е, че можем просто да вземем кутията 1x1 (която по дефиниция покрива цялото изображение) и да я мащабираме прилично, за да пасне на велосипедиста.

Ето как можем да използваме множеството конволюционни слоеве на главата на SSD, за да ни дадат ограничителни кутии при различни „резолюции“, така че да можем да откриваме малки обекти, както и големи.

Обобщавайки

Не мога да повярвам колко дълъг се оказа този пост, докато се опитвах да се придържам към обикновен английски. SSD и като цяло откриването на единичен изстрел са адски готини, но е необходимо доста мислене, за да разберете наистина всички движещи се части. Надявам се това да е било полезно. Все още имате въпроси? Разгледайте форума на адрес forums.fast.ai за някои от най-добрите общности за дълбоко обучение, които интернет може да предложи.

Но какво става с нещата с „единичен изстрел“.

„Единичен изстрел“ (или „веднъж“ в името на YOLO) означава, че подавате изображението само веднъж през цялата интегрирана мрежа (едно единствено преминаване напред). Това е различно от предишното състояние на техниката, което обикновено имаше множество етапи, които изрично се специализираха в различни аспекти на решаването на проблема.

Благодаря на Radek за коректурата!