Мотивация

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

Тъй като отдаваме толкова голямо значение на нашия анализ, специалистът по данни в мен се чудеше: „Ами ако можем да използваме задълбочено обучение, за да автоматизираме част от нашето генериране на статистика?“ По-специално, интересна метрика, която трябва да опитаме и изградим, е метрика „подготвеност за ангажиране“, която разглеждаме, като основно казва колко сме добри в това да насочим мерника си към правилното място, когато се появи враг, което увеличава максимално шансовете ни да спечелим това участие . Въз основа на комуникациите на екипа, ако комуникираме добре, по-често трябва да сме готови и да се прицелим в правилното местоположение, когато се появи враг.

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

Проектна линия

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

Да се ​​заемем с работата

Преди няколко месеца попаднах на публикация в блог от Dat Tran за това как да изградя детектор за миещи мечки („тук“). Както в публикацията за детектора на миещи мечки, продължих и създадох набор от данни от около 1200 изображения. Създадох своя набор от данни, като направих екранни снимки от около 9 часа записи на scrims на моя екип. Уверих се, че включвам доста голямо разнообразие от изображения, слаба светлина, задна светлина и разстояния до въпросния оператор, така че моделът да бъде изложен на изображения с най-добро и най-лошо качество, които мога да му хвърля. Използването на тези записи по този начин ми помага да се уверя, че разпределението на моите набори от данни за обучение съвпада с всички крайни изображения/видео, върху които бих пуснал моделите. Следващият колаж показва примери за изображения от моите записи в играта.

След като наборът от данни беше създаден, използвах labelImg, за да създам ограничителните полета, които ще се използват за прогнози. LabelImg е много приятен интерфейс, който ви позволява да генерирате XML във формат PASCAL VOC, които са необходими за изпълнение на моделите.

Със създадения и етикетиран набор от данни следващата стъпка беше да се намери най-добрият начин за ускоряване на модел за откриване на обекти. Използвам Keras с бекенд на Tensorflow за по-голямата част от работата си и бях благодарен да открия, че Ngoc Anh Huynh вече е създал хранилище на модели за откриване на обекти за keras и ги е направил доста лесни за използване и изпълнявам. Намирането на това хранилище ми спести значително време.

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

Опитвайки се да внедря модела Full YOLO в моя набор от данни Rainbow Six Siege, единственият проблем, с който се сблъсках, беше как най-добре да „загрея“ модела към новия набор от данни. Настройката по подразбиране беше да се изпълнява в продължение на 3 епохи над набора от данни беше периодът на загряване, докато моделът се настройва, но аз го пуснах за по-дълго, 10 епохи с ранно спиране, приключващи изпълненията поради липса на подобрение. Това изглежда е хиперпараметър, с който можете просто да си играете, за да коригирате.

След тренировката за загряване пуснах пълния конвейер и моделът достигна между 60–70% средно извикване, което е около базовата линия, спомената в някои от проблемите в хранилището. Моделът, изведен на този етап, е много функционален и съм много доволен от него. Като странична бележка провеждах обучение с Nvidia 1070 и 32 GB RAM за обучение/тестване.

Разпознаване на лица… Тази част се оказа доста трудна за изграждане от нулата. Причината е, че повечето проблеми с разпознаването на лица се фокусират върху фронтални изгледи с относително затъмнени лица. В Rainbow Six Siege е обичайно да виждате оператори от всички 360 градуса, както и отгоре и отдолу. Това в комбинация с вариациите в осветлението, разстоянието и факта, че всички носят каски, маски, очила, бронежилетки, прави проблема доста труден.

Обикновено първата стъпка беше да опитам да генерирам съответен набор от данни... за това използвах модела за откриване на обекти, за да изрежа оператори, които прецених, че мога да подавам в друга невронна мрежа за класификация. Това беше много шумен подход, защото го пуснах на 3-часов запис и той генерира близо 95K изображения, много от които бяха повтарящи се изрязвания на оператор, който основно прави видеоклипове със стоп-моушън. Прегледах на ръка тези 95K изображения и генерирах няколко хиляди набора от данни за изображения от различните оператори. След като наборът от данни беше създаден, използвах предварително обучена мрежа InceptionV3, за да извлека вграждания на снимките на главата, които генерирах, и подадох тези вграждания чрез множество различни модели. Никой от които не се представи особено добре... така че се върнах на изходна позиция...

В този мрачен час се върнах към един от блоговете, които бях чел, когато започнах да се гмуркам по-дълбоко в невронните мрежи, поредицата „Машинното обучение е забавно“ от Адам Гейтги, по-специално винаги ми харесваше публикацията за „разпознаване на лица“. Препрочитайки го, бях изненадан да видя актуализация в края и осъзнах, че съм извадил късмет в друго потенциално решение. Адам беше достатъчно любезен да изгради библиотека, наречена face_recognition. API е много чист и лесен за използване и успях да го приложа с известен успех, най-вече като го комбинирах с детектора на обекти за идентифициране на предни изображения на определени оператори.

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

Изводи и последни мисли

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

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

Благодаря на общността за изграждането на толкова много страхотни проекти. Това прави приятно и лесно по същество да се изгради пълен тръбопровод за разпознаване на лица.

github repo тук, току-що модифицирах споменатото по-рано repo за откриване на keras.

Освен това научих, че прилагането на наука за данни във видеоигрите е много забавно! Ще правя още публикации през следващите месеци.