Computer Vision Engineer: от детекции и Doc-AI до продакшнаВведение и быстрый стартМетрики CV простым языком

Метрики 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 неточные (ниже на строгих порогах).

Частые проблемы

  1. Высокий recall, низкий precision: модель находит всё подряд, много ложных срабатываний. Повысьте порог confidence или добавьте hard negative mining.
  2. Высокий precision, низкий recall: модель осторожничает, пропускает объекты. Понизьте порог или добавьте данных с труднодетектируемыми объектами.
  3. mAP@0.5 высокий, mAP@[.5:.95] низкий: модель находит объекты, но bbox неточные. Улучшите регрессию координат (например, GIoU loss вместо L1).
  4. Несбалансированные классы: если класса "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.