7.2. Що змінило МН¶
Модуль зображень містить кілька застарілих методів виявлення — find_features() для виявлення облич за каскадом Хаара, find_eye() для фіксованого пошуку зіниці, find_hog() для підсумків напрямів градієнтів, а також шляхи find_keypoints() і find_lbp() для довільних ключових точок. Всі вони досі працюють; всі вони були замінені конвеєром машинного навчання.
7.2.1. Класичний поділ: ручні зведення та навчені рішення¶
Класичний конвеєр технічного зору складався з двох кроків. Перший крок перетворював необроблені пікселі на компактний набір чисел, що відображали вміст зображення — не самі значення пікселів, а коротший опис того, які патерни де з’явилися. Другий крок брав це зведення і приймав рішення: обличчя чи ні, цей об’єкт чи інший, та сама ціль чи інша.
Поділ мав значення, бо два кроки мали різних авторів. Перший крок писала людина. Хтось сідав і вирішував, що різниця яскравості між двома конкретними прямокутниками є хорошим зведенням для ділянки ока, що домінуючий напрямок межі в кожній комірці сітки є хорошим зведенням для силуету стоячої людини, що патерн «яскравіший або темніший» навколо кожного пікселя є хорошим зведенням локальної текстури. Кожен із цих варіантів був написаним вручну алгоритмом — написаним, відлагодженим і опублікованим. Застарілі методи вище — усе це зведення такого роду, що стали стандартними інструментами:
find_features()підсумовує вікно зображення, складаючи яскравість у кількох прямокутниках і порівнюючи суми. Компонування прямокутників обирали, оскільки обличчя людини демонструє надійні контрасти «яскраве проти темного»: брови на тлі щік, очні западини на тлі лоба, ніс на тлі шкіри навколо.find_hog()узагальнює зображення, обходячи сітку малих комірок і записуючи, який напрямок межі домінує в кожній комірці. Сітку обирали, оскільки силует стоячої людини утворює впізнаваний патерн напрямків меж незалежно від одягу чи освітлення.find_lbp()узагальнює околицю кожного пікселя, кодуючи, які з навколишніх пікселів яскравіші, а які темніші. Кодування обирали, оскільки ці патерни «яскравіший / темніший» відображають текстуру поверхні незалежно від загального освітлення.find_keypoints()знаходить кутові точки в зображенні та описує область навколо кожного кута так, щоб опис залишався незмінним при повороті кута. Схему «кут і поворот» обирали, оскільки ті самі кути знову з’являються при погляді на сцену під іншим кутом.
Після того як зведення було написано вручну, невеликий крок навчання поверх нього міг комбінувати числа для прийняття рішення. Алгоритм виявлення облич прикріпив крок навчання до зведення різниці прямокутників, навчаючи його на помічених зображеннях облич та не-облич розпізнавати, які комбінації різниць сигналізують про обличчя. Зведення напрямків меж подавалося на крок навчання, натренований на помічених зображеннях людей та не-людей. Дескриптори куток подавалися на крок зіставлення, що навчався, яку вагу надавати кожному куту. Кожен із цих других кроків є алгоритмом навчання — невеликим за сучасними мірками, але алгоритмом навчання.
Важливим був поділ внеску. Людина вносила зведення. Машина навчалася комбінуванню. Додавання нової цілі означало написання нового зведення.
7.2.2. Що змінили нейронні мережі¶
Нейронна мережа усуває цей поділ. Перші шари мережі виконують роботу зведення, яку раніше виконували написані вручну алгоритми — виявлення меж, кутів, орієнтованих ліній, текстур, саме те, на виявлення чого були налаштовані наведені вище застарілі методи, — але вони не пишуться вручну. Вони навчаються з тих самих тренувальних даних, з яких навчається крок прийняття рішення, в єдиному тренувальному проході, що одночасно коригує обидві половини мережі. Більш глибокі шари виконують комбінування, яке раніше виконував невеликий крок навчання поверх написаних вручну зведень, також навчене, в тому самому проході.
Зміна в тому, хто що проектує, є повною:
Людина проектує вхід — захоплені кадри певного розміру та формату.
Людина проектує вихід — компонування результуючого тензора (одна оцінка на клас для класифікації, список прямокутників для виявлення, сітка ключових точок для орієнтирів).
Людина надає помічені тренувальні дані — достатньо прикладів цілі та достатньо прикладів не-цілей, щоб тренувальний процес мав з чого вчитися.
Усе між входом і виходом генерується тренувальним процесом. Окремого кроку написання зведення немає. Ранні шари «зупиняються» на виявниках меж та текстур не тому, що хтось їх так написав, а тому, що виявлення меж і текстур — це те, що дозволяє прогнозам мережі відповідати міткам. Більш глибокі шари «зупиняються» на виявниках форм та об’єктів із тієї самої причини. Обидві половини навчаються разом, що дозволяє зведенням, які видає кожен шар, бути саме тими зведеннями, яких потребує наступний шар — не загальними, на які мав погоджуватися написаний вручну конвеєр.
7.2.3. Взаємодія з модулем image¶
Конвеєри нейронних мереж досі захоплюють зображення через ті самі API датчика, відображають результати через ті самі примітиви draw_rectangle() та draw_circle(), і охоплюють роботу через ті самі ROI (x, y, w, h). Типовий конвеєр захоплює кадр, за потреби знаходить грубу ціль за допомогою класичного детектора, наприклад find_blobs(), і передає його обмежувальний прямокутник як ROI для інференсу, запускає інференс і анотує повернуті виявлення назад у вихідний кадр. Класичні примітиви — це підґрунтя; мережа — новий крок посередині.