Метрики CV простым языком
Уроки курсаМетрики CV простым языком
Precision/Recall, PR-кривая, AP и mAP@[.5:.95] без формульной боли
Детектор нашёл 10 объектов, 7 правильно, 3 ложных. Это precision. Из 12 реальных объектов нашёл 7. Это recall. PR-кривая показывает, как меняются precision и recall при разных порогах уверенности. AP — площадь под этой кривой. mAP — среднее AP по всем классам. mAP@[.5:.95] — среднее по порогам IoU от 0.5 до 0.95 (стандарт COCO).
Ключевые идеи
- Precision: из того, что модель назвала объектом, сколько действительно объекты.
- Recall: из всех реальных объектов сколько модель нашла.
- PR-кривая: график precision vs recall при изменении порога уверенности.
- AP: площадь под PR-кривой для одного класса.
- mAP: среднее AP по всем классам. mAP@[.5:.95] — усреднение по порогам IoU.
Precision и Recall
Precision (точность) — доля правильных среди всех предсказаний:
(True Positive) — правильно найденные объекты. (False Positive) — ложные срабатывания (модель нашла объект там, где его нет).
Recall (полнота) — доля найденных среди всех реальных:
(False Negative) — пропущенные объекты (модель не нашла, хотя они есть).
Пример: на изображении 12 машин. Детектор нашёл 10 объектов: 7 машин (TP), 3 столба ошибочно классифицировал как машины (FP). Пропустил 5 машин (FN).
- Precision = 7 / (7 + 3) = 0.7 (70% предсказаний правильные)
- Recall = 7 / (7 + 5) = 0.58 (нашли 58% реальных машин)
PR-кривая
Детектор выдаёт confidence score для каждого bbox (например, 0.95 — уверен, 0.3 — сомневается). Ставим порог: если confidence > 0.5, считаем детекцией. Меняем порог — меняются precision и recall.
Низкий порог (0.3) → много детекций → высокий recall (нашли почти все), низкий precision (куча ложных).
Высокий порог (0.9) → мало детекций → низкий recall (пропустили много), высокий precision (то, что нашли, почти всё правильно).
PR-кривая строится так: перебираем пороги от 0 до 1, для каждого считаем precision и recall, рисуем график.
Пример кода:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve
# y_true: 1 — объект есть, 0 — нет
# y_scores: confidence модели для каждого bbox
y_true = np.array([0, 1, 1, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8, 0.7, 0.9])
precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
plt.plot(recall, precision, marker='.')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR-кривая')
plt.grid()
plt.show()
Чем ближе кривая к правому верхнему углу (recall=1, precision=1), тем лучше модель.
Average Precision (AP)
AP — площадь под PR-кривой. Одно число вместо графика — удобно сравнивать модели.
Вычисляется как сумма прямоугольников:
где — recall на i-м пороге, — precision на i-м пороге.
На практике используют функции из библиотек:
from sklearn.metrics import average_precision_score
ap = average_precision_score(y_true, y_scores)
print(f'AP: {ap:.3f}') # Например, AP: 0.833
AP близко к 1 — отлично, близко к 0 — плохо.
mean Average Precision (mAP)
mAP — среднее AP по всем классам. Если детектор работает с 80 классами (COCO), считаем AP для каждого класса (car, person, dog...), усредняем.
— число классов, — AP для класса .
mAP@0.5 — считаем детекцию правильной, если IoU > 0.5. Легче набрать высокий mAP.
mAP@[.5:.95] — среднее по порогам IoU от 0.5 до 0.95 с шагом 0.05 (всего 10 порогов). Строже: при IoU=0.9 нужна очень точная локализация. Это стандарт COCO.
Пример: mAP@0.5 = 0.75, mAP@[.5:.95] = 0.55. Модель хорошо находит объекты (высокий mAP@0.5), но bbox неточные (ниже на строгих порогах).
Частые проблемы
- Высокий recall, низкий precision: модель находит всё подряд, много ложных срабатываний. Повысьте порог confidence или добавьте hard negative mining.
- Высокий precision, низкий recall: модель осторожничает, пропускает объекты. Понизьте порог или добавьте данных с труднодетектируемыми объектами.
- mAP@0.5 высокий, mAP@[.5:.95] низкий: модель находит объекты, но bbox неточные. Улучшите регрессию координат (например, GIoU loss вместо L1).
- Несбалансированные классы: если класса "dog" в 100 раз меньше, чем "car", mAP для "dog" будет низким. Используйте взвешенное усреднение или focal loss.
Связанные понятия
- F1-score: гармоническое среднее precision и recall. . Одна цифра вместо двух.
- ROC-кривая: график True Positive Rate vs False Positive Rate. Используется в классификации, для детекции PR-кривая информативнее.
- Confusion matrix: таблица TP/FP/TN/FN для всех классов. Помогает найти, какие классы путаются.
Итоги
- Precision: доля правильных среди найденных. Recall: доля найденных среди реальных.
- PR-кривая: график precision vs recall при разных порогах confidence.
- AP: площадь под PR-кривой для одного класса.
- mAP: среднее AP по всем классам. mAP@[.5:.95] — стандарт COCO, усредняет по порогам IoU.
- Высокий mAP@0.5, низкий mAP@[.5:.95] — bbox неточные, нужно улучшить локализацию.
Дальше по курсу
В следующем шаге разберём IoU и Dice для оценки качества масок в сегментации. Узнаем, когда использовать IoU (детекция, instance segmentation), когда Dice (медицинская сегментация с маленькими объектами), и как они связаны с mAP.
