Panoptic і SAM

Тема 31 лишила нас із двома моделями на одне зображення: одна знає про фон, друга — про предмети. Panoptic зшиває їх в одну відповідь і питає з неї одним числом. SAM іде далі й міняє саме питання: не «сегментуй усе, що знаєш», а «сегментуй те, на що я показав».

Уяви фотографію вулиці. Небо, дорога, тротуар — це те, що не рахують: питання «скільки на фото неба?» не має відповіді в штуках. Машини, люди, дорожні знаки — навпаки, рахують: три машини, дві людини. До цієї теми ми вміли робити або одне, або друге. Семантична мережа з теми 29 добре фарбує небо й дорогу, але не рахує машин. Модель із теми 31 рахує машини, але небо їй нецікаве зовсім.

Щоб описати одну фотографію повністю, доводиться запустити дві різні моделі й якось зшити їхні відповіді. Ця тема про те, чому зшити їх важче, ніж здається, і що з цього виросло. А в другій половині — про модель, яка взагалі відмовилась називати предмети, і саме тому виявилась корисною скрізь.

РозривДві моделі на одне зображення

Почнімо з чесного експерименту. Наскрізний приклад тут той самий, що в трьох попередніх темах блоку: полотно 64×64, на ньому кілька простих фігур — кола, квадрати, трикутники — на рівному фоні. Фігури можуть торкатись і затуляти одна одну, класів у них три, а фон вважається четвертим класом. Сцени взято з теми 28; вони штучні саме тому, що тут потрібна відома до пікселя істина — інакше не було б із чим порівнювати.

На цих сценах навчаємо дві мережі — семантичну з теми 29 (фарбує кожен піксель у клас) і instance з теми 31 (віддає список масок окремих предметів) — і кладемо їхні відповіді одна на одну. Обидві мережі робочі, жодного шкідництва.

Тепер питаємо кожен піксель, що він про себе почув. Виявляється, є три способи зіпсуватись, і жоден із них не є помилкою якоїсь однієї моделі.

Замір ішов на 70 перевірних сценах, і кожну з двох мереж навчено по три рази з різних початкових ваг — щоб число не залежало від одного вдалого запуску. Рахувати частку зіпсованих від усього полотна безглуздо: фону там більшість, а фон обидві моделі й так називають фоном. Тому знаменник інший — усі пікселі, які хоч одна з двох моделей назвала предметом. Серед них зіпсованих (спірних, перекритих або порожніх) виходить 54.5 % — більше за половину.

Ті самі три числа, віднесені до всього полотна 64×64, дають 4.84 % спірних, 3.77 % перекритих і 2.62 % дірок — разом 11.23 % кожного кадру. Друга форма менша й виглядає нестрашно, і саме тому першу варто тримати поруч: вона каже, яка частка відповідей про предмети зіпсована, а не яка частка картинки.

Чому це не лікується правилом «беремо впевненішого». Упевненість семантичної моделі — це ймовірність класу в пікселі. Упевненість instance-моделі — оцінка предмета цілком. Це числа з різних мереж, навчених різними втратами; вони не в одній шкалі й порівнювати їх нема підстав. Будь-яке правило зшивання доводиться вигадати, і воно не випливає із жодної з двох задач.

Дві моделі, один піксель

Обидві моделі трохи неточні: повзунки задають, на скільки пікселів кожна з них «розпливається». Права панель показує, що з цього виходить.

спірних—
перекритих—
дірок—
зіпсовано—
Постав обидва повзунки на нуль — і проблема зникне. Дві ідеальні моделі зшиваються без жодного конфлікту, і саме тому на папері задача виглядає розвʼязаною. Досить одного пікселя похибки в кожної — і карта праворуч засвічується. Рожеве — спірні пікселі, жовтогаряче — перекриті двома масками, бірюзове — дірки. На двох справжніх навчених моделях, на 70 перевірних сценах, зіпсовано 54.5 % пікселів предметів — це те саме число, що в тексті вище.

ПоділРечі й матерія

Перш ніж зшивати, варто спитати, звідки взявся сам поділ. Чому небо фарбує одна модель, а машини знаходить інша?

Відповідь незручна: поділ придумали ми. У світі немає межі між «речами» і «матерією» — є два різні способи ставити питання.

КатегоріяАнглійськоюПитання, на яке відповідаєПриклади
речіthingsскільки їх і де кожнамашина, людина, чашка, книжка
матеріяstuffде воно є, а де немаєнебо, дорога, вода, стіна

Ознака, за якою розводять ці категорії, — чи має сенс рахувати штуки. Небо на фото одне, і питання «скільки шматків неба?» безглузде. Машин може бути пʼять, і питання «скільки?» — головне, заради чого знімок узагалі дивляться.

Але межа тече. Трава на газоні — матерія: ніхто не рахує травинки. Трава в горщику — річ: горщиків три. Дерева в лісі — матерія, дерево на подвірʼї — річ. Цеглини стіни — матерія, поки не ремонтуєш стіну. У наборі COCO-Stuff «кущі» — матерія, у наборі для садівництва вони були б речами.

Найчесніше формулювання таке: категорія залежить не від предмета, а від задачі. І коли одна модель уміє тільки речі, а друга тільки матерію, ти успадковуєш цей штучний поділ у своїй архітектурі — навіть якщо для твоєї задачі він не має сенсу.

У наших сценах поділ такий: фон — матерія, три фігури — речі. Полотно 64×64, фону багато: на рідких сценах теми 29 він займає 89.34 % пікселів у навчальній частині й 90.01 % у перевірній. Фігури дрібні, і ця пропорція навмисне копіює справжні знімки, де матерія займає більшість пікселів, а речі — більшість уваги.

ПостановкаКожен піксель дістає рівно одну пару

Panoptic segmentation ставить вимогу, яку легко сформулювати й важко виконати:

кожен піксель дістає рівно одну пару (клас, номер предмета)

Розберімо її по словах.

кожен

Дірок немає. Піксель без відповіді — це помилка, а не «нічого не знайдено». Саме тут ламається instance-модель: у неї між масками порожньо, і ця порожнеча не має ані класу, ані номера.

рівно одну

Перекриттів немає. Дві маски не можуть претендувати на один піксель. Саме тут ламається спосіб «зверху вниз»: маски предметів у Mask R-CNN (тема 31) перетинаються завжди, бо кожна рахується у своїй рамці незалежно від сусідів.

клас і номер

Номер потрібен лише для речей. Для матерії він завжди нульовий: усі пікселі неба — один сегмент, і питання «яке саме небо» не існує.

Звідси випливає термін, на якому тримається вся метрика. Сегмент — це звʼязна відповідь моделі: для речі — маска одного предмета, для матерії — усі пікселі цього класу на зображенні разом. Якщо на знімку три машини й небо, сегментів чотири: три речі й одна матерія.

Зверни увагу, чого тут немає. У постановці немає слова «модель». Panoptic — це формат відповіді, а не архітектура. Зшити дві моделі в цей формат можна; питання лише в тому, скільки на цьому втрачається — і саме на це питання відповідає метрика.

МетрикаPQ і її множники

Метрика зветься PQ, panoptic quality. Вона рахується на сегментах і складається з двох частин, які варто розуміти окремо.

Крок перший — зіставлення. Прогнозований сегмент і істинний сегмент одного класу утворюють пару, якщо їхній IoU більший за 0.5.

Нагадування: що таке IoU. IoU (intersection over union) — міра збігу двох масок: площа, яку вони накривають обидві, поділена на площу, яку вони накривають разом. Приклад руками: істинна маска — 100 пікселів, прогноз — 120, спільних у них 90. Тоді разом вони накривають 100 + 120 − 90 = 130, і IoU = 90 / 130 = 0.6923. Одиниця означає точний збіг, нуль — маски не торкаються. Докладно ця міра розібрана в темі 23.

Поріг саме такий не з естетики. Уяви, що два прогнозовані сегменти обидва накрили той самий істинний більш ніж наполовину. Тоді разом вони покривають більше за його повну площу — отже, десь мусять накрити один і той самий піксель удвох. Але в panoptic-відповіді сегменти не перетинаються за постановкою, тож такого бути не може. Висновок: при порозі понад половину пара, якщо вона є, єдина. Пари утворюються однозначно, і жодного правила вибору вигадувати не треба.

Крок другий — два числа. Позначмо: TP — скільки пар утворилось, FP — скільки прогнозованих сегментів лишилось без пари, FN — скільки істинних лишилось без пари.

RQ = TP / (TP + ½·FP + ½·FN)

Це звичайний F1, тільки не по пікселях, а по сегментах: скільки сегментів модель узагалі знайшла. F1 — це компроміс між двома бідами: «знайшов зайве» (FP) і «проґавив потрібне» (FN). Половинки перед ними й роблять цей компроміс рівним: кожна з двох бід коштує пів помилки, і жодну не можна перекрити іншою. Порахуймо руками: істинних сегментів 5, модель знайшла 4 правильно, одне вигадала й одне проґавила. Тоді RQ = 4 / (4 + 0.5 + 0.5) = 4 / 5 = 0.8000.

SQ = (сума IoU по всіх парах) / TP

Це середня якість маски серед тих сегментів, які таки знайшлись: наскільки точно. І остаточно:

PQ = SQ × RQ

Метрика рахується окремо в кожному класі, а потім усереднюється по класах. Ось чому розклад на множники важливіший за саме PQ: RQ і SQ відповідають на два різні питання, і однакове PQ може означати протилежні речі.

Одна пастка, через яку легко вирішити, що курс помилився. Рівність PQ = SQ × RQ справджується всередині класу. Щойно ми усереднили по чотирьох класах, вона перестає справджуватись: середнє добутків — не добуток середніх. Порахуй на двох числах: класи з парами (SQ 1.0, RQ 0.5) і (SQ 0.5, RQ 1.0) дають PQ 0.5 і 0.5, тобто середнє PQ = 0.50; а добуток середніх — 0.75 × 0.75 = 0.5625. Тому в таблицях нижче стовпчик PQ не дорівнює добутку сусідніх стовпчиків, і це не помилка друку. Інтерактив 2 нижче навмисне рахує одне зображення без усереднення — там добуток сходиться точно, і саме там формулу видно.

PQ по кроках

Кнопка «крок» веде через увесь розрахунок: сегменти → зіставлення → TP, FP, FN → RQ → SQ і PQ. Повзунок зсуває прогноз і міняє числа.

крок: сегменти
TP / FP / FN—
RQ—
SQ—
PQ—
SQ падає плавно, RQ — стрибком. Зсунь прогноз на піксель-два: IoU кожної пари сповзає вниз, і разом із ним SQ. Але щойно IoU переходить 0.5, пара зникає цілком — і RQ провалюється сходинкою. Дві помилки різної природи, і добуток без множників їх не розрізняє.

Найкорисніше, що можна винести з цього розділу, — уміння читати PQ назад. Однакове число буває в моделі, яка знайшла мало сегментів, зате точних, і в моделі, яка знайшла всі, але грубо.

Однакове PQ, різні SQ і RQ

Вісім однакових предметів. Повзунок каже, скільки з них модель знайшла; точність масок підбирається під нього так, щоб PQ майже не мінялось — від 0.6076 до 0.6510 на всьому ході.

SQ—
RQ—
PQ—
знайдено—
Одне число, дві поведінки. На лівому краю повзунка модель знаходить чотири предмети з восьми, зате майже до пікселя: SQ 0.9195, RQ 0.6667. На правому — знаходить усі вісім, але маски грубі: SQ 0.6510, RQ 1.0000. PQ при цьому не зрушило (0.6130 проти 0.6510), а користь різна: у задачі підрахунку виграє друга модель, у задачі вимірювання площі — перша. Тому PQ завжди цитують разом із множниками.

Чому одне числоЧому не досить mIoU + mask AP

Резонне заперечення: у нас уже є дві метрики. mIoU з теми 29 міряє пікселі, mask AP з теми 31 міряє предмети. Хіба їхня пара не описує все?

Ні, і причина проста: у кожної з них є сліпа пляма, і сліпі плями не перетинаються. Щоб побачити ці плями, потрібні моделі з наперед відомим дефектом. Тому беремо еталонну розмітку й псуємо її шістьма різними способами — тоді кожен рядок таблиці нижче має відому причину:

модельPQmIoUmask AP
ідеальна1.00001.00001.0000
зливає дотичні0.88081.00000.7922
ріже предмет навпіл0.52921.00000.6961
зсув на 2 px0.58400.70830.7722
дзьобає фон0.98040.77931.0000
губить кожен третій0.77070.64190.5660

Дивись на два підсвічені рядки.

«Зливає дотичні» — модель, у якої всі пікселі правильні до одного. Вона просто не розділяє предмети, що торкаються: дві кулі на столі дають одну маску. mIoU тут дорівнює 1.0000 — рівно одиниці, бо жодної помилки класу не зроблено. PQ падає до 0.8808. А сусідній рядок «ріже предмет навпіл» — та сама помилка, тільки в інший бік — має ту саму одиницю mIoU й PQ уже 0.5292.

«Дзьобає фон» — навпаки. Усі предмети знайдені ідеально, а зіпсовано лише фон: частина його пікселів дістала клас без жодного предмета. mask AP цього не помічає взагалі — 1.0000, — бо фон у нього не входить за побудовою.

Отже пара має сліпу пляму з кожного боку. І жодне усереднення двох чисел її не закриває: на моделі «зливає дотичні» «ідеально» каже mIoU, а на моделі «дзьобає фон» те саме каже mask AP.

Якщо впорядкувати ці шість моделей за кожною з трьох метрик, порядки виходять різні. Найрізкіше розходження — на моделі «ріже предмет навпіл»: за mIoU вона третя з шести, за PQ — остання. Метрика, що дивиться лише на пікселі, не бачить різниці між «один предмет» і «два його шматки», бо клас пікселя від цього не міняється. PQ бачить: сегментів стало вдвічі більше, ніж є, і половина з них ні з чим не зіставилась.

Дві сліпі плями, які не перекривають одна одну

Перемикач обирає, що саме зіпсовано в моделі. Ліворуч істина, праворуч — те, що модель віддала. Стовпчики — ті самі три числа з таблиці вище.

що зіпсовано
PQ—
mIoU—
mask AP—
Двічі метрика каже «ідеально» там, де модель зламана. На «зливає дотичні» одиницю показує mIoU: жоден піксель не змінив класу, змінилась лише кількість предметів. На «дзьобає фон» одиницю показує mask AP: усі предмети на місці, зіпсовано тільки те, чого mask AP не бачить за побудовою. PQ не обманюється в жодному з двох випадків — тому пара метрик і не заміняє його.

Дві половиниРечі окремо, матерія окремо

PQ прийнято розкладати ще й на дві половини: PQ_th — середнє по класах речей, PQ_st — по класах матерії. На перший погляд це просто зручна деталізація. Насправді тут причаїлась пастка.

На наших сценах речей три класи, матерії один. Ось PQ у кожному з чотирьох, на тих самих 70 перевірних сценах:

класPQSQRQTPFN
фон (матерія)0.95450.95451.0000700
коло0.66390.81780.81186915
квадрат0.57300.81790.70066213
трикутник0.56080.71660.78266314

Подивись на RQ фону: 1.0000. Це не тому, що модель добра, а тому, що сегмент матерії знайти майже неможливо не зуміти. Він один на зображення й займає більшість пікселів; щоб не влучити в нього з IoU більшим за 0.5, треба помилитись катастрофічно. Тому RQ матерії прилипає до одиниці, і PQ_st фактично дорівнює її SQ.

Звідси головна осторога. Середнє «(PQ речей + PQ матерії) / 2» лестить моделі: половину оцінки дає категорія, у якій майже неможливо помилитись у розпізнаванні. У нас це 0.5992 проти 0.9545 — середнє по категоріях 0.7768, а справжнє PQ (середнє по класах) 0.6880. Порівнюй моделі по повному PQ або дивись на дві половини окремо, але ніколи не на їхнє середнє.

Речі проти матерії

Ліворуч — істина, праворуч — прогноз. Один повзунок губить предмети, другий псує фон. Стовпчики показують, що з цього бачить кожна половина метрики.

PQ речей—
PQ матерії—
PQ по класах—
середнє двох—
Два повзунки псують різне, а дві половини метрики реагують по-різному. Утрата предметів валить PQ речей і не чіпає матерію взагалі. Псування фону робить навпаки. Постав «утрачено предметів» на нуль, а «зіпсовано фону» на 24 % — і побачиш дзеркальний випадок: речі 1.0000, матерія 0.7917. А «середнє двох» щоразу лягає між ними й ховає гіршу половину — саме тому його не варто цитувати як оцінку моделі.

Своя головаСвоя panoptic-голова

Тепер найцікавіше. Ми бачили, що зшивання двох моделей вимагає вигаданого правила. Перевіримо три такі правила:

правило злиттяPQSQRQрозкид
речі поверх усього0.60150.80030.73620.0885
де семантика згодна0.61850.80320.75100.1707
поріг площі 20 px0.61070.80020.74900.0898

І ось перший чесний результат розділу: різниця між правилами — +0.0170 і +0.0092 за PQ при розкиді по зернах до 0.1707. Тобто жодне правило не виграє: усі три лежать усередині розкиду. Це не поразка ідеї, а вказівка, де насправді втрачається якість — не в правилі злиття, а в самих моделях, які ми зшиваємо.

Але правило лишається вигаданим. Альтернатива — одна модель, яка одразу віддає panoptic-карту. Найпростіша конструкція така:

гілка перша

Семантична. Клас кожного пікселя, чотири канали. Вона відповідає за матерію і за те, який саме клас у речі.

гілка друга

Голосування за центр. Два числа на піксель: наскільки треба зсунутись праворуч і вниз, щоб потрапити в центр свого предмета. Додай ці два числа до координат самого пікселя — і дістанеш точку, у яку він «голосує». Пікселі одного предмета голосують в одну точку, різних — у різні, тож на карті голосів зʼявляються згустки: по одному на предмет. Скільки згустків — стільки предметів, а піксель належить тому, у чий згусток він показав. Це рівно та гілка, яку тема 31 міряла окремо.

злиття

Правило тут не вигадане, а вбудоване: кожен піксель належить рівно одному згустку голосів усередині свого класу. Перекриттів не буває за побудовою, дірок теж — бо клас пікселя вже є, і він або матерія, або належить найближчому центру.

Навчена на трьох зернах, така голова дає PQ 0.5058 проти 0.6185 у найкращого зшивання. Різниця -0.1127 при найбільшому розкиді по зернах 0.2309 — тобто вона менша за розкид, і різницею називати її не можна. І це головний результат розділу: одна модель виграє не точністю, а тим, що в неї немає чого налаштовувати. Правило злиття не обирають — воно випливає з того, як влаштований вихід.

Правила злиття

Ліва панель — те, що не зійшлось між двома моделями. Середня — результат обраного правила. Права — істина, з якою ми його порівнюємо.

правило злиття
сегментів—
дірок—
PQ—
SQ—
Правило вирішує більше, ніж здається. На тих самих двох відповідях правила дають різне PQ, і різниця сидить переважно в SQ. Постав похибку instance-моделі на нуль — і перші два правила зійдуться майже точно (1.0000 і 0.9630): сперечатись стає нема про що. Третє не зійдеться з ними ніколи: воно викидає дрібні предмети разом зі сміттям. При нульовій похибці фігури найменші й правило лишає з шести сегментів два; при похибці 3 px маски розпливаються, переростають поріг — і лишається вже пʼять. Тобто поріг площі шкодить тим більше, чим точніша модель. Поріг тут 200 px, а в замірі вище — 20 px: при 20 px на цих шести предметах правило дає побітово той самий результат, що й перше, і керування було б мертвим. Це саме по собі результат: поріг площі стає видимим лише тоді, коли він більший за справжні предмети, тобто коли починає їх губити. Це і є головний аргумент за одну модель замість двох: коли модель одна, правило не доводиться обирати.

Інша постановкаЗміна постановки: сегментація за підказкою

Усе, що ми робили досі — і в цій темі, і в трьох попередніх, — це «сегментуй усе, що знаєш». Модель має список класів, вивчений наперед, і про предмет поза списком сказати їй нічого.

SAM (segment anything model) ставить питання інакше:

не «що тут є?», а «що ось тут?»

Модель приймає зображення й підказку — точку, рамку, грубу маску — і віддає маску предмета, на який ця підказка вказує. Вона нічого не класифікує. На виході немає жодного класу: лише маска.

Це та сама зміна, що CLIP зробив для класифікації в темі 22. Там модель перестала мати фіксований список відповідей і почала відповідати на довільний текстовий запит. Тут модель перестала мати список класів і почала відповідати на довільну просторову підказку. Паралель точна аж до наслідків: обидві моделі стають придатними до предметів, яких не бачили, і обидві перестають самі по собі розвʼязувати прикладну задачу.

Чому це вимагає окремої моделі, а не переробки старої. Сегментатор із теми 29 приймає зображення й видає карту класів. Щоб він відповів на підказку, підказку треба кудись подати — тобто змінити вхід. У SAM це зроблено так: зображення проганяється через важкий енкодер один раз, а підказка йде в легкий декодер, який працює за мілісекунди. Тому на одному знімку можна клацати сотні разів без перерахунку — і це не оптимізація, а частина задуму.

Свій сегментаторСвоя модель за підказкою

Справжній SAM — модель на сотні мільйонів ваг, навчена на мільярді масок; ані навчити її заново, ані чесно переміряти на наших сценах ми не можемо. Тому далі йде власна крихітна мережа за тією самою постановкою: вона не повторює SAM за якістю, зате повторює його механізм — і саме механізм тут і треба побачити. Так само робили тема 22 з CLIP і тема 25 з YOLO.

Конструкція мінімальна. Вхід — два канали: зображення й карта підказки (кружечок радіуса 2 навколо точки). Тіло — той самий U-Net із теми 30: стискаємо картинку до грубих ознак і розтискаємо назад, тягнучи через скіп-зʼєднання дрібні деталі з ранніх шарів. Вихід — одна маска, без жодного класу.

Результат: IoU 0.8319 на трьох зернах. Для порівняння — інший спосіб відповісти на ту саму підказку: сегментувати все, а потім узяти пляму, у яку потрапила точка. Це найчесніший представник підходу «спершу все, потім вибір», і він дає 0.7534.

Різниця +0.0785 береться з одного місця: спосіб «сегментуй усе» не має жодного механізму, щоб відрізнити предмет від сусіда свого класу. Він віддає пляму цілком — те саме злипання, яким починалась тема 31. Модель за підказкою має цей механізм: підказка й є той механізм.

Підказка точкою

Повзунки рухають точку по сцені. Перемикач змінює спосіб відповіді: модель за підказкою чи «сегментуй усе, потім вибери».

спосіб відповіді
IoU з предметом—
розмір маски—
предмет злипся із сусідом—
Тут показано механізм, а не якість. Модель за підказкою віддає саме ту фігуру, на яку ти показав; «сегментуй усе» віддає всю злиплу пляму, бо поняття окремого предмета в неї немає — і IoU падає рівно на частку сусіда. Перенеси точку на фігуру, що стоїть окремо: там обидва способи дають те саме. Справжня навчена модель дає IoU 0.8319, а не одиницю — але механізм у неї той самий.

НеоднозначністьОдна підказка, кілька правильних відповідей

Тепер найцікавіше в усій SAM-частині. Точка не визначає відповідь.

Клацни в стінку кільця. Що ти мав на увазі — стінку чи кільце цілком? Клацни в колесо машини — колесо, машину чи всю вантажівку з причепом? Усі ці відповіді чесні, і жодна не помилкова.

На наших сценах ця неоднозначність теж є, і вона природна. Показавши в коло, яке торкається квадрата, ти міг мати на увазі три різні речі:

  1. саме це коло — окремий предмет;
  2. усі кола цієї злиплої групи — свій клас усередині групи;
  3. усю групу цілком — усе, що злиплось в одну пляму.

Три вкладені відповіді, як «стінка → кільце → вся конструкція». На нашій перевірній вибірці таких підказок 58.1 % — тобто більшість.

Що робить модель, яку змусили дати одну маску? Вона мусить усереднити — і осідає на компромісі, який не збігається з жодною з трьох чесних відповідей. Справжній SAM віддає три маски на кожну підказку саме через це.

Навчається він так: похибка рахується для кожного з трьох виходів окремо, і далі беруть лише найменшу з трьох — саме її, і тільки її, пускають назад по мережі підправляти ваги. Тобто на кожній підказці вчиться тільки той вихід, який цього разу вгадав найкраще; решта двох цього прикладу просто не бачать. Наслідок накопичується: вихід, якому раз пощастило на дрібному предметі, наступного разу знову виявиться найкращим саме на дрібному — і поступово виходи розбирають рівні між собою. Один тяжіє до дрібного, інший до великого, і ніхто нікого не тягне до середнього.

Замір мусить бути чесний. Порівнювати треба ту саму мережу, ті самі дані й той самий бюджет навчання — інакше ми виміряємо кількість епох, а не кількість виходів. І оцінка теж одна для обох: IoU найкращого з виходів. Для моделі з одним виходом «найкращий» означає «єдиний», тож нікому не легшає.

Замір дає: одна маска — 0.5924, три маски — 0.8177, різниця +0.2253. Розкид по трьох зернах: 0.3026 в моделі з одним виходом і 0.0194 у моделі з трьома.

Формально виграш +0.2253 менший за розкид одновиходової моделі (0.3026), і назвати його доведеним у звичному сенсі не можна. Але подивись, чий це розкид: у моделі з трьома виходами він 0.0194, тобто в 16 разів менший. Головний результат тут не середнє, а сама ця пара чисел: три виходи дають стабільне число, один вихід — лотерею.

І ще одна деталь, помітна лише в лічильнику: третій вихід не знадобився жодного разу. Якщо на кожній підказці записувати, який із трьох виходів виявився найкращим, то по всіх трьох зернах виходить те саме — працюють два, третій простоює. Це чесно каже, скільки рівнів насправді є в наших сценах: два, а не три. У справжнього SAM їх теж не завжди три — просто на фотографії реального світу вкладених рівнів більше, ніж на полотні 64×64.

Механізм за цими числами простий. Модель з одним виходом дістає суперечливі градієнти: той самий вхід тягне її то до предмета, то до групи, і куди вона зрештою осяде, вирішує зерно. Три виходи цієї суперечності не мають — кожен рівень дістається своєму виходу, ніхто ні з ким не бореться.

Одна деталь, без якої це не працює. Якщо всі три виходи починають з однаковим зсувом, перемагає завжди один із них: він виявляється трохи кращим на першому ж кроці, тільки він і вчиться, а решта лишаються сирими. Три маски вироджуються в одну. Лікування дешеве — дати виходам різні початкові зсуви, щоб один одразу був схильний казати «мало», а інший «багато». Наш замір саме так і зроблений; без цього одного рядка він показував би протилежне.

Три однаково чесні відповіді

Підказка стоїть у центрі обраного предмета. Друга панель показує три вкладені відповіді, які всі правильні. Перемикач порівнює модель з одним виходом і з трьома.

скільки масок віддає модель
одна маска—
три маски—
IoU з предметом—
IoU з групою—
Компроміс не збігається ні з чим. Модель з одним виходом осідає посередині трьох чесних відповідей: із предметом у неї одне IoU, із групою інше, і жодне не близьке до одиниці. Три виходи розбирають рівні між собою. Перемкни підказку на предмет, що стоїть окремо, — там усі три відповіді збігаються, і виграшу немає взагалі.

Види підказокТочка, рамка, маска, текст

Точка — не єдина підказка. SAM приймає їх кількох видів, і різняться вони тим, скільки неоднозначності лишають по собі.

ПідказкаЩо каже моделіСкільки лишає неоднозначності
точка«десь тут»багато: рівень предмета невідомий
кілька точок«тут так, а тут ні»менше: відʼємні точки відрізають зайве
рамка«ось у цих межах»мало: розмір заданий
груба маска«приблизно ось так»майже немає
текст«ось це слово»залежить від слова

Перші два рядки цієї таблиці ми заміряли: та сама мережа, той самий бюджет, міняється лише те, що намальовано в каналі підказки — кружечок радіуса 2 чи залитий прямокутник рамки.

підказкаусіпредмет сампредмет у групірозкид
точка0.83190.90420.77970.0691
рамка0.89480.96010.84760.0288

Рамка виграє +0.0629 у середньому, і формально це менше за розкид по зернах (0.0691 у точки). Але дивитись треба не на розкид, а на самі зерна: найгірше зерно рамки — 0.8756, найкраще зерно точки — 0.8732. Рамка виграла в кожному з трьох прогонів, і виграла найбільше саме там, де точка лишає неоднозначність: на предметах усередині групи +0.0679 проти +0.0559 на предметах, що стоять окремо.

Про текстову підказку варто сказати окремо, бо навколо неї найбільше плутанини. У самій моделі SAM текстового входу немає — його додають зовні: текст перетворюють на область через CLIP-подібну модель, а вже область подають як підказку. Тобто «сегментація за текстом» — це дві моделі в ланцюжку, і слабка ланка там та, що розуміє текст, а не та, що малює маску.

НаслідкиЩо дав SAM галузі

Головне число SAM — не якість, а масштаб даних. Модель навчали на наборі SA-1B: 11 мільйонів зображень і 1.1 мільярда масок (числа з публікації авторів, ми їх не міряли). Для порівняння: COCO — це близько 200 тисяч зображень і 1.5 мільйона масок предметів.

Як розмітили мільярд масок. Не руками. Процес ішов трьома колами. Спершу розмітники малювали маски вручну, і на цих даних навчили першу модель. Потім модель пропонувала маски, а розмітник лише правив і додавав пропущене — це вдесятеро швидше. На третьому колі модель пропонувала маски сама, суцільною сіткою точок по зображенню, і людина вже майже не втручалась. Кожне коло робило модель кращою, а наступне коло — дешевшим. Це і є та схема, яку тепер називають data engine.

Що з цього вийшло на практиці.

І чесно про межу. SAM не класифікує. Він віддає маску й не каже, що на ній. Тому сам по собі він не розвʼязує жодної прикладної задачі: ані «знайди всі дефекти», ані «порахуй машини», ані «виміряй площу поля». Для будь-якої з них потрібна друга модель, яка назве предмет, — і саме вона лишається твоєю роботою. SAM зняв із задачі найдорожчий шматок, але не задачу.

ПідсумокПідсумок блоку 6 і місток далі

Блок 6 закінчено. Чотири теми — і одна лінія крізь них: питання стає точнішим, і кожне уточнення коштує окремої архітектури.

ТемаПитання до пікселяГоловне число
29якого ти класу?фон 89.34 % на навчальній частині, і модель «усе фон» дає на перевірній точність 0.9001 при mIoU 0.0000
30де точно проходить межа?без скіпів розрив росте вдвічі з кожним рівнем стискання: 0.0191, 0.0523, 0.1117, 0.2535
31якому предмету ти належиш?звʼязні плями відновлюють 1.000 вільних предметів і 0.343 дотичних
32клас і предмет разом, одна відповідьзшивання двох моделей псує 54.5 % пікселів предметів

Що варто забрати з блоку.

І тепер про те, чого ми досі не вміємо. Усе, що робив блок 6, стосується одного нерухомого зображення. Ми питали піксель про клас, про межу, про предмет — але жодного разу не питали, що з ним було секунду тому.

Наступний блок — «Відео, текст і 3D» — додає до картинки час, і разом із ним нові задачі, у яких відповідь на кадрі залежить від сусідніх кадрів: оптичний потік, стеження за предметом, розпізнавання дії. Далі до зображення додається текст, а потім і третій вимір: глибина, форма, сцена як обʼєм. Місток до всього цього вже прокладено — CLIP із теми 22 показав, що зображення й слова можуть жити в одному просторі, а ця тема показала, що модель може відповідати на підказку замість того, щоб знати відповіді наперед.