ПРИЗНАВАНЕ НА ЛИЦЕ: Как да се справим с хора, които не са били част от данните за обучение

Има много статии за FaceNet, но почти не се обсъждат проблемите, с които се сблъскваме при разработването на действителен продукт, използвайки него. Демонстрирано е постигане на висока точност като над 99%. Тази точност крие факта, че тестовете се основават на изображения на същите хора, които са били използвани за обучение на модела. В сценарии от реалния живот това никога не е така. Моделът се опитва да предвиди всяко непознато лице като един от класовете в данните за тренировките, дори и тези, които не принадлежат към никой. Този проблем възниква, когато възнамеряваме да разпознаем няколко души и да игнорираме останалите.

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

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

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

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

Целта на триплетната загуба е да се гарантира, че:

  • Два примера с един и същ етикет имат вградените си части близо в пространството за вграждане
  • Два примера с различни етикети имат своите вграждения далеч.

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

  1. Помислете за двама много подобни изглеждащи хора А, човек, който трябва да разпознаем, и Б, човек, който да не бъде разпознат.
  2. Тъй като в нашия набор от хора имаме A, които трябва да бъдат разпознати от нашата система, а B не трябва да бъде разпознат, ние можем да имаме A в един клас, а B може да бъде във всеки друг клас.
  3. За горния сценарий загубата на триплет ще се различава между А и Б, което ще доведе до усвояване на по-добри характеристики за А (не говорим за Б, тъй като за нас това няма значение).
  4. Тъй като B е в друг клас, ако B действително влезе в камерата, той няма да бъде разпознат като A, както би станало, ако B не беше в нашия набор от данни.

Следващото притеснение би било къде да поставите този образ на B? Тъй като не можем да имаме нов клас за всеки B, който имаме за всеки A, можем да направим нов клас, който съдържа само лица, които не е необходимо да бъдат разпознавани. Така че, ние имаме изключителен клас, който съдържа само B за всички As. Това все още не решава проблема ни. Как да създадем B, човек, който изглежда подобно, за всеки A?

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

РЕЗУЛТАТИ:

Използвайки горния подход, точността се увеличи от 96% на 99%, използвайки един и същ набор от данни (10 класа с по 10 изображения на всеки), с изключение на този нов клас от различни хора (559 изображения), освен че можеше да разграничи хората, които са не трябва да бъде признато. Действителната точност на всеки модел на ML зависи от данните, на които е бил обучен, следователно реалните стойности могат да се различават за всеки набор от данни.

Кодът за това може да намерите на https://github.com/Chhitij07/face-recognition. Кодът все още трябва да бъде почистен, за да подобри производителността, но за момента той все още работи. стъпки:

  1. Създайте папка за всеки клас в папка с изображения, включително клас за набора от изображения от търсене в Google. Ако искате да заснемете изображения за нов клас, това може да стане, като стартирате add_training_data.py
  2. Зависимостите за кода могат да бъдат намерени във файла request.txt.
  3. Изпълнете следната команда:
python face_train.py

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

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

python face_recognize.py

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

Обратната връзка ще бъде оценена.

Работя във Winkl и изграждам няколко готини неща. Чувствайте се свободни да се свържете с мен :)