Съдържание

  • Преглед
  • Какво е откриване на обект
  • Семейството на R-CNN накратко
  • Вътрешни части на YOLO
  • Пресичане над съюз (IOU)
  • Немаксимално потискане
  • Изчисляване на загубите
  • средна средна точност
  • Внедряване

Референтен код

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

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

Преглед

YOLO означава „You Look Only Once“. Това е най-модерната техника за откриване на обекти, която е описана за първи път в основополагащия 2015 paper от Joseph Redmon et al. YOLO идва с много версии като YOLO v1, YOLO v2, YOLO v3 и т.н. YOLO v5 е най-новата версия към момента на писане на този блог, но тук ще се съсредоточим върху YOLO v1.

Има много алгоритми и техники за откриване на обекти, като фамилия R-CNN, хистограма на ориентирани градиенти (HOG), детектор за единичен изстрел (SSD) и много други, но YOLO се превърна в най-популярната техника за откриване на обекти сред тях. Двете основни причини за това са

  • Прогнозата в модела YOLO е почти в реално време.
  • Пълният тръбопровод за откриване на обект (от изображение като вход до краен изход) включва един единствен модел.

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

Какво е откриване на обект

За да разберем ясно откриването на обекти, трябва да разберем какво е локализация и какво е класификация.

Локализация :

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

Класификация:

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

Откриване на обект

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

Откриването на обекти не е лесна задача, тъй като трябва да идентифицира:

  • Колко обекта има
  • На кое място са поставени тези обекти
  • Какъв е размерът на всеки от обектите
  • Какви са класовете

Семейството на R-CNN накратко

Винаги е добре да знам как се е развил даден алгоритъм във връзка с конкретна задача и намирам за лесно да си спомням нови алгоритми, когато знам пред какви проблеми е изправен съществуващият алгоритъм и как новите алгоритми решават тези проблеми. С този подход ще говоря накратко за съществуващите алгоритми като техниката на плъзгащ се прозорец и семейството R-CNN преди YOLO.

Техника на плъзгащи се прозорци

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

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

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

R-CNN

R-CNN означава Регионално базирана конволюционна невронна мрежа. Подобрението на R-CNN спрямо техниката на плъзгащ се прозорец е, че вместо десетки хиляди региони, той намали тези числа до 2000 региона на изображение, което е с различен размер и форма.

R-CNN използва техника за селективно търсене, за да намери тези региони, която се основава на проста идея, че всеки обект в изображението ще бъде под формата на различни мащаби, цветове, текстури и заграждение. В R-CNN тези региони се наричат ​​регион на интерес (ROI), който допълнително се преоформя като вход към ConvNet.

Проблеми:

  • R-CNN включва множество модели и тези модели работят независимо. Той използва ConvNet за характеристика, SVM за класификация и друг модел на регресия за прогнозиране на свързваща кутия.
  • Той генерира 2000 региона за всяко изображение и използва ConvNet 2000 пъти, за да получи характеристиките за всеки регион. Тази задача ще стане по-сложна, когато броят на изображенията е голям.
  • Обучението на такъв модел е много трудно, тъй като всеки от моделите работи отделно.

Бърз R-CNN

R-CNN използва ConvNet 2000 пъти за всяко изображение, което отнема изключително много време. Бързият R-CNN, както се нарича, предполага намалено време, необходимо за прогнозиране чрез следната модификация:

  • R-CNN генерира регион на интерес (ROI) от оригиналното изображение, след което го изпраща на ConvNet за представяне, където Fast R-CNN променя последователността от процеси, тъй като първо изпраща изображението на ConvNet и след това генерира ROI, използвайки метод за регионално предложение на функция карти. Ето как Fast R-CNN спести време, тъй като ConvNet се използва само веднъж за представяне на едно изображение.
  • Fast R-CNN използва слой за обединяване на ROI, който генерира карти с функции с фиксиран размер за всяка ROI, което означава, че независимо от размера и формата на региона на интерес, обединяването на ROI ще изведе карта на характеристиките със същия размер за всяка ROI.
  • Fast R-CNN не използва различни модели за задачи за класификация (предсказване на клас) и регресия (ограничаваща кутия), тъй като слоят за обединяване на RIO генерира карти с функции с фиксиран размер, които могат да бъдат подредени заедно и изпратени до напълно свързана мрежа.
  • В последния слой използва softmax активиране за класове и линейно активиране за кутии.

Проблеми:

Дори Fast RCNN има определени проблемни области. Той също така използва селективно търсене като метод за предлагане за намиране на регионите на интерес, което е бавен и отнемащ време процес. Отнема около 2 секунди на изображение за откриване на обекти, което е много по-добре в сравнение с RCNN. Но когато вземем предвид големи набори от данни в реалния живот, тогава дори Fast R-CNN вече не изглежда толкова бърз.

По-бърз R-CNN

Faster RCNN е модифицираната версия на Fast RCNN. Основната разлика между тях е, че Fast RCNN използва селективно търсене за генериране на интересни региони, докато Faster RCNN използва „Region Proposal Network“, известен още като RPN. RPN приема картите на характеристиките на изображението като вход и генерира набор от предложения за обекти, всяко с резултат за обектност като изход.

Стъпките по-долу обикновено се следват при по-бърз RCNN подход:

  • Взимаме изображение като вход и го предаваме на ConvNet, който връща картата на характеристиките за това изображение.
  • Мрежите с предложения за региони се прилагат върху тези карти на характеристиките. Това връща предложенията за обекти заедно с оценката им за обектност.
  • Към тези предложения се прилага слой за обединяване на ROI, за да се сведат всички предложения до еднакъв размер.
  • Накрая, предложенията се предават на напълно свързан слой, който има слой softmax и слой с линейна регресия в горната си част, за класифициране и извеждане на ограничителните полета за обекти.

Проблем:

  • Алгоритъмът изисква много преминавания през едно изображение, за да извлече всички обекти.
  • Тъй като има различни системи, работещи една след друга, ефективността на системите по-напред зависи от това как са работили предишните системи

Читателят може да посети R-CNN Family, за да научи повече за тези алгоритми.

Вътрешни части на YOLO

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

Отсега нататък този блог ще следва модела на въпроса и отговора, който според мен е най-лесният начин за обяснение.

Откъде да започна?

Разбирането на алгоритъма YOLO започва с разбирането на неговата моделна архитектура.

Моделът YOLO приема rgb изображение с размер (448 448). Архитектурата на модела изисква основно разбиране на конволюционните невронни мрежи. Докато изграждаме тази архитектура, ние просто трябва да поддържаме последователността на слоя Conv и слоя за максимално обединяване, а останалата част от междинния слой са ясни.

Най-важната част от тази архитектура е да разберете нейния изход.

Как да интерпретираме изхода на модела?

Изходният размер на горния модел е (7,7,30) за едно rgb изображение с размер (448,448). За да интерпретирате изхода на модела, представете си, че изображението е разделено на 7 на 7 (общо 49) мрежа с еднакъв размер, която също се нарича клетка и всяка клетка е представена от 30-измерен вектор.

Тъй като всички параметри на модела могат да се тренират, ние ще принудим параметъра на модела да научи тези 30 параметъра за една клетка от изображение, докато тренираме. В действителната хартия изображението е разделено на мрежа 7 на 7, но тук само за обяснение ще го разделя на мрежа 3 на 3.

Какви са тези 30 параметъра?

Първите 20 параметъра са изходни данни от активиране на softmax, което представлява вероятността обект да принадлежи към клас i(i в 1 до 20) за всяка клетка. Тази архитектура на YOLO използва набор от данни PascalVOC, който има 20 различни класа обекти, поради което изходът му присвоява първите 20 параметъра за 20 различни класа. Ако обучите своя модел на друг персонализиран набор от данни, изходът трябва да се промени съответно.

За данни за обучение Pc, който е 21-вият и 25-ият изходен параметър, ще бъде двоично число 0 или 1. 0 не представлява обект, а 1 представлява наличието на обект в клетката. x и y представляват координатите x и y на централната точка на обекта, където w и h представляват височина и ширина на обекта. Не забравяйте, че всички x,y,w и h са стойности по отношение на конкретна клетка. Ще разберем защо имаме два чифта pc, x, y, w и h по-късно в този блог.

Сега нека разберем изхода с много прост пример, където ще разделим изображението на мрежа 3 на 3 и ще имаме само два различни възможни класа dog = 1 и cat = 2. Така че размерът на изхода ще бъде

(решетка,решетка,брой класове + (5 * брой ограничаващи кутии)) → (3,3, 2+5 * 2) → (3,3,12)

Първата клетка има малка част от ляво куче, но не съдържа нейната средна точка (синя точка), така че изходът съответства на тази клетка ще бъде

[ * , * , 0 , * , * , * , * , 0 , * , * , * , * ] където 0 не представлява никакъв обект и '*' е за не ме интересува означава, че тези стойности ще бъдат игнорирани, докато тренирате модела .

Сега нека се опитаме да изчислим изхода за тази клетка

Тази клетка съдържа средната точка на обекта, който е куче, така че c1 = 1 (куче), c2 = 0 (котка) и pc1 = 1, защото има обект. Не забравяйте, че x, y , w и h тези четири параметъра се изчисляват по отношение на клетка, а не по отношение на изображение, така че x , y ще да бъде плаваща стойност между 0 и 1, но w и h може да са по-големи от 1 в случай, че самият обект е по-голям от клетката.

Така че в горната клетка x = 0,9, защото средната точка е почти в края на оста x и y = 0,55, защото средната точка е малко под центъра на оста y .

ширината w ще бъде някъде около 0,5, защото ширината на обекта е половината от ширината на клетката, а височината h ще бъде 1,5, защото височината на обекта ще бъде един и половина пъти височина на клетката. така че крайният изход, съответстващ на тази клетка, ще бъде [1, 0, 1, 0.9, 0.55, 0.5, 1.5, 0, *, *, *, *] и полето ще изглежда нещо подобно

По подобен начин можем да кодираме изхода за всяка от клетките.

Какво е анкерна кутия и защо две анкерни кутии в тази архитектура?

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

Помислете за ситуация, при която средата на два обекта лежи в една и съща клетка.

Средната точка на автомобила и човека е в средната клетка на изображението и се нуждаем от две анкерни кутии, за да представим и двата обекта.

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

Обърнете внимание, че в нашия действителен модел ние разделяме изображението на мрежа 7 на 7 и всяка мрежа може да представлява два обекта, така че теоретично можем да представим 7 * 7 * 2 = 98 обекта на изображение.

Пресичане над съюз (IOU)

Как да измерим коректността на предвидената кутия?

Нека разгледаме тази прогноза

Ако получите прогноза като тази, тогава как ще измерите правилността на тази прогноза? IOU е мярката за коректност на прогнозираната кутия. Както подсказва името му, това е съотношението между площта на пресичане и площта на обединение. За перфектно съвпадение е равно на 1 и 0, когато няма пресечна точка между действителното и предвиденото поле. Ние избираме праг за добра прогноза, който обикновено е 0,7, но може да бъде променен въз основа на изискване.

Немаксимално потискане

какво ще стане, ако предвидим няколко кутии за един обект?

Ако читателят е разбрал всички концепции до момента, тогава трябва да си е представил, че практическите изображения имат най-вече два или три обекта, но ние имаме капацитет за представяне от 98 обекта на изображение. Не мислите ли, че ще получите много прогнози за един обект? Отговорът е разбира се, че ще го направите. и тук идва Non Max Suppression за премахване на нежелани прогнози.

Да предположим, че имаме три прогнози и не забравяйте, че прогнозираме кутии с резултати за обектност, които са Pc. Non Max Suppression премахва нежеланите прогнози чрез:

  • Първо избира полето с най-висок резултат за обектност.
  • След това изчислете IOU между полето с най-висок резултат за обектност и други полета.
  • Ако IOU е по-голяма от някаква прагова стойност като 0,5, тогава тя премахва други полета

Идеята е проста, високата IOU предполага, че и двете кутии предсказват един и същ обект, но ние не искаме множество кутии, така че те трябва да бъдат премахнати. В горния пример ще изберем кутията с 0,9 оценка за обектност и ще изчислим нейната IOU с други кутии.

Да приемем, че IOU между полета с резултат за обектност = 0,9 и 0,6 е IOU = 0,51, което е по-голямо от прага 0,5, така че ще премахне полето с резултат 0,6.

ще повторим същото с кутия с оценка за обектност 0,3

IOU е 0,6, което е по-голямо от прага 0,5, сега това също ще бъде премахнато. Накрая ни остава най-добрата възможна прогноза.

Изчисляване на загубите

Нещата ще станат по-ясни, когато разберем изчисляването на загубите, докато обучаваме модела.

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

изчисляване на загубите по x и y координати

xi, yi са действителни, а xi_hat, yi_hat са предвидените x и y координати на средната точка на обекта по отношение на i-та клетка на изображението. Загубата е загуба на грешка на квадрат, която е свързана с функцията за идентичност. Функцията за идентичност може да приеме само две стойности 0 и 1 и е 1 само когато j'th anchor box на i'th клетка представлява обект в данните за обучение, в противен случай е 0 lambda_coord е хиперпараметър, който е 0,5 в нашия случай.

За да интерпретираме горната функция на загубата, нека просто разгледаме фиктивен пример със S = 9 (решетка 3 на 3) и B = 2 (брой анкерни кутии на клетка).

над стойността на функцията за загуба ще бъде 0 за всички клетки с изключение на клетки 3 и 4. Да предположим, че нашата първа котва представлява вертикална, а втората котва представлява хоризонтална кутия, тогава ще разгледаме координатите x и y на средната точка на обекта за първата котва на прогнозата, защото формата на лявото куче е вертикално ориентирана.

Накрая загубата по-горе ще бъде изчислена върху координатите x и y за i = 3 (трета клетка) с B = 0 (първа опорна кутия) и i = 4 (четвърта клетка) с B = 0 (първа опорна кутия).

Изчисляване на загубите по ширина и височина

загубите, изчислени по ширина и височина, са същите като това, което сме изчислили за координатите x и y, с изключение на това, че тук при изчисляването на загубата на ширина и височина, вместо да вземем действителната му стойност, ние вземаме стойността на корен квадратен.

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

Изчисляване на загубата по оценка за обектност (с обект)

Ci във функцията за загуба е Pc_i в нашия случай, така че не го бъркайте с нотация.

загубата на оценка за обектност се изчислява за тези закотвени кутии, съответстващи на тези клетки, които представляват обект. Тази загуба ще бъде изчислена само когато резултатът за обектност Ci = 1 и когато Ci = 0, тогава функцията за идентичност също е 0.

Изчисляване на загубата по оценка за обектност (без обект)

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

Докато изпълнявахме Non Max Suppression, ние предположихме, че високият резултат за обектност означава по-точна кутия. Функцията за над загуба принуждава всички прогнозирани резултати за обектност, които нямат никакъв обект, да бъдат 0, което допълнително намалява тежестта върху Non Max Suppression. lambda_noobj е хиперпараметър, който е = 5 в нашия случай.

Изчисляване на загубите на вероятностите за клас

pi(c) във функцията за загуба е ci в нашето представяне.

Горната загуба се изчислява на базата на изхода от активирането на softmax, което представлява вероятността предвидените обекти да принадлежат към класове. Обикновено в задачите за класификация избираме кръстосана загуба на ентропия, но тук се избира квадратна загуба на грешка. Обърнете внимание, че при загубата на кръстосана ентропия ние се занимаваме само с прогнозираната вероятност за клас, към който трябва да принадлежи, и просто игнорираме прогнозираната вероятност за други класове, но тук при загубата на квадратна грешка искаме и двете, прогнозираната вероятност за желания клас да бъде 1 и прогнозираната вероятност за друг клас да бъде 0.

средна средна точност

mAP е идеалният показател за производителност на модела за задачи за откриване на обекти. В този раздел ще разберем mAP с малки примери.

Нека разгледаме набор от тестове с три изображения image1 image2 и image3.

тук ще изчислим средната точност за клас „КУЧЕ“. Първо ще изчислим общия брой кучета, като вземем предвид всички тестови изображения, които са четири в нашия пример, две за изображение1 и 1, 1 за изображение2 и изображение3. Зелените полета са действителни полета, където червеното поле (идва с оценка за обектност) е предвидено поле за клас „КУЧЕ“. В горните изображения можем да видим, че някои от прогнозите са добри, но някои са изключително лоши. Как ще изчислим ефективността на модела за такава прогноза?

За да изчислим mAP, трябва да имаме представа за прецизност и припомняне. Предполагам, че читателят вече знае точността и припомнянето.

Първо ще изчислим истински положителни (TP) и фалшиви положителни (FP) за всички прогнози на тестови изображения.

Предсказана кутия се присвоява като TP, ако IOU между предвидена кутия и действителна кутия › 0,5 в противен случай FP.

Сега ще сортираме таблицата въз основа на резултата за доверие (резултат за обектност)

Сега ще изчислим точността и ще извикаме постепенно.

С прости думи

прецизност = (брой правилни прогнози / общ брой прогнози) на този клас

извикване = (брой правилни прогнози / общ брой действителни етикети) на този клас

Сега ще начертаем крива между прецизността и ще си припомним, че току-що изчислихме и площта под PR кривата е средна прецизност за клас DOG.

Производителността на крайния модел mAP е средната стойност на AP за всички класове.

Изпълнение:

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

  • Набор от данни PascalVOC (брой класове = 20) се използва за обучение на модела.
  • Архитектурата на модела е същата като модела, обяснен в хартия.

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

Отне ми около 20 часа, за да обуча модела за 200 епохи само със 100 примера. По принцип исках да пренастроя модела върху малката извадка от набор от данни, само за да видя прогнозата. Обучих модела от нулата, но препоръчвам на читателя да тренира върху предварително обучен модел като vgg16, начална мрежа и т.н., за да намали времето за обучение.

Ето тренировъчните дневници за последните 10 епохи:

Постига се финална тренировъчназагуба = 8.568и mAP = 0.992.

Отказ от отговорност: Не написах всички кодове от нулата, а ги взех назаем от тук.

Препратки

Контакт

Поща: [email protected]

Github: https://github.com/Nitesh0406/YOLOv1.git

Linkedin: www.linkedin.com/in/nitesh-kumar-550819169