Коефіцієнт Жаккара
Коефіцієнт Жаккара (англ. Jaccard index) — метрика оцінки міри схожості скінченних множин, запропонована Полем Жаккаром у 1901 році. Він широко використовується в задачах аналізу даних, машинного навчання, обробки природної мови та комп’ютерного зору для порівняння об’єктів, представлених у вигляді множин або бінарних ознак.
\[J\left(A,B\right)\ =\frac{\left|A\ \cap B\right|}{\left|A\ \cup B\right|}=\frac{\left|A\ \cap B\right|}{\left|A\left|+\ \right|B\right|\ -\ \left|A\ \cap B\right|},\ де\]
\[A,\ B\ ⊆\ X,\ \ X\ -\ деяка\ універсальна\ множина;\]
\[\left|A\ \cap B\right|\ -\ потужність\ перетину;\ x\ \in\ A\ \wedge\ x\ \in B\]
\[\left|A\ \cup B\right|\ -\ потужність\ об'єднання;\ x\ \in\ A\ \vee\ x\ \in B\ \]
Властивості метрики:
\[0\le J\left(A,B\right)\ \le1\ -діапазон\ значень;\]
\[J\left(A,B\right)\ =\ 0\ -множини\ не\ мають\ спільних\ елементів;\]
\[J\left(A,B\right)\ =1\ -\ множини\ ідентичні;\]
Приклад розрахунку метрики для тензорів першого та другого порядку з використанням бібліотеки scikit-learn:
In [1]: import numpy as np
In [2]: from sklearn.metrics import jaccard_score
In [3]: x = np.array([0,0,0,1,1,1])
In [4]: x_hat = np.array([0,0,1,1,1,0])
In [5]: jaccard_score(x, x)
Out[5]: 1.0
In [6]: jaccard_score(x, x ^ 1)
Out[6]: 0.0
In [7]: jaccard_score(x, x_hat)
Out[7]: 0.5
In [8]: x = [
...: [1, 0, 1],
...: [0, 1, 1]
...: ]
In [8]:
In [8]: x_pred = [
...: [1, 1, 1],
...: [0, 1, 0]
...: ]
In [9]: jaccard_score(x, x_pred, average='samples')
Out[9]: 0.5833333333333333Коефіцієнт Жаккара відрізняється від метрики точності (accuracy), оскільки не враховує істинно негативні (true negative) екземпляри та визначається лише через істинно позитивні, хибно позитивні та хибно негативні значення. У випадку багатокласових задач (категорійні дані тощо) коефіцієнт Жаккара обчислюється окремо для кожного класу за схемою «один проти всіх», після чого виконується усереднення отриманих значень. Наприклад, для макроусереднення:
\[J\left(A,B\right)_{\mathrm{macro}}=\frac{1}{K}\sum_{k=1}^KJ(A_k,B_k)\ =\frac{1}{K}\sum_{k=1}^K\frac{TP_k}{TP_k+FP_k+FN_k},\ де\]
\[K\ -кількість\ класів.\]
Відстань Жаккара
Відстань Жаккара — це метрика оцінки міри несхожості двох скінченних множин.
\[d_J\left(A,B\right)\ =1\ -\ J\left(A,B\right)\ =\ \frac{\left|A\ \cup B\right|-\left|A\ \cap B\right|}{\left|A\ \cup B\right|}\]
На відміну від методу jaccard_score із бібліотеки scikit-learn, метод jaccard із бібліотеки scipy реалізує за замовчуванням саме відстань Жаккара:
In [1]: from scipy.spatial.distance import jaccard
In [2]: x = np.array([0,0,0,1,1,1])
In [3]: x_hat = np.array([0,0,1,1,1,1])
In [4]: jaccard(x, x_hat)
Out[4]: 0.25IoU
IoU (від англ. intersection over union) — перетин над об’єднанням є окремим випадком коефіцієнта Жаккара, де міра задається площею (або об’ємом) геометричних об’єктів. Часто використовується в задачах комп’ютерного зору, зокрема для оцінювання якості моделей виявлення та сегментації об’єктів. Так, наприклад, IoU дозволяє кількісно оцінити ступінь перекриття геометричних меж між еталонною розміткою та передбаченням меж моделі.
\[IoU\left(A,B\right)\ =\ J\left(A,B\right)\ =\frac{μ\left(\left|A\ \cap B\right|\right)}{μ\left(\left|A\ \cup B\right|\right)},\ де:\]
\[μ\ -абстрактна\ міра;\]
Так, наприклад, μ для зображень — це площа, для 3D — об’єм тощо.
В задачах виявлення об’єктів IoU зазвичай рахується не по детальній геометричній масці яка точно повторює обриси об’єкта, а по т.зв. bounding box. Натомість в задачах сегментації об’єктів — так, а саме по межах полігонів. Для наочності розрахуємо IoU для цих двох задач для еталонної анотації та умовно (штучно зсунуто на 30 px вздовж осі X) прогнозованої моделлю.

In [1]: from shapely.geometry import Polygon
In [2]: import numpy as np
In [3]: bbox_coords = np.array([
...: [260., 184.],
...: [852., 184.],
...: [852., 773.],
...: [260., 773.]
...: ])
In [4]: coords = np.array([
...: [266., 577.],
...: [276., 489.],
...: [306., 423.],
...: [361., 354.],
...: [408., 318.],
...: [450., 272.],
...: [497., 247.],
...: [476., 194.],
...: [513., 188.],
...: [640., 202.],
...: [723., 246.],
...: [757., 300.],
...: [782., 341.],
...: [847., 393.],
...: [847., 402.],
...: [727., 386.],
...: [710., 411.],
...: [730., 472.],
...: [716., 539.],
...: [601., 710.],
...: [488., 769.]
...: ])
In [5]: x_offset = 30
In [6]: offset_bbox_coords = bbox_coords.copy()
In [7]: offset_bbox_coords[:, 0] += x_offset
In [8]: offset_coords = coords.copy()
In [9]: offset_coords[:, 0] += x_offset
In [10]: def polygon_iou(poly1, poly2):
...: p1 = Polygon(poly1)
...: p2 = Polygon(poly2)
...:
...: intersection = p1.intersection(p2).area
...: union = p1.union(p2).area
...:
...: return intersection / union
...:
In [11]: polygon_iou(coords, offset_coords)
Out[11]: 0.8297755610115658
In [12]: polygon_iou(bbox_coords, offset_bbox_coords)
Out[12]: 0.9035369774919614Важливо зазначити, що реальні моделі зазвичай не працюють із полігонами напряму, оскільки ті є геометричним представленням регіону інтересу. Натомість у задачах сегментації анотовані дані у вигляді полігонів проходять процес растеризації, під час якого вони перетворюються на бінарні маски (binary masks).
Растеризація полігону — це перетворення полігону на маску пікселів, у якій кожен піксель позначає, чи належить він до внутрішньої області полігону.
Приклад бінарної маски:
0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 1 → піксель всередині полігону 0 → піксель поза межами полігону
Таким чином, для бінарних масок у задачах обробки зображень метрика IoU еквівалентна коефіцієнту Жаккара.
При всій математичній елегантності та наочності IoU, однак, рідко застосовують безпосередньо як функцію втрат (loss function) під час навчання. Причиною цьому є декілька її властивостей:
- У випадках, коли передбачення моделі не перетинається з еталонною анотацією, значення IoU дорівнює нулю. За таких умов градієнт є неінформативним, а сама модель не має чіткого сигналу, в якому напрямку потрібно змінювати параметри (сходження).
- IoU є функцією з різкими переходами, що виникають через використання операцій на кшталт мінімуму та максимуму при обчисленні площі перетину. Така поведінка викликає нестабільність процесу оптимізації.
- IoU має високу чутливість до невеликих просторових зсувів. Навіть незначне зміщення передбачення може спричинити суттєве зменшення значення метрики, що робить процес навчання менш стабільним.
З огляду на ці обмеження, на практиці застосовують більш придатні для оптимізації функції втрат, такі як Dice loss, Soft IoU, GIoU чи DIoU. Водночас сама метрика IoU залишається стандартом для оцінювання якості моделей після завершення навчання.
