Руководство по использованию метрики mAP (средняя средняя точность) для оценки производительности модели обнаружения объектов.

Самые продвинутые планы развития науки о данных, которые вы когда-либо видели! Поставляется с тысячами бесплатных учебных ресурсов и интеграцией ChatGPT! https://aigents.co/learn/roadmaps/intro

В этом руководстве вы узнаете, как использовать показатель mAP (средняя средняя точность) для оценки производительности модели обнаружения объектов. Я подробно расскажу, что такое mAP, как его рассчитать, и приведу пример того, как я использую его в своей реализации YOLOv3.

Средняя средняя точность (mAP) или иногда просто называемая AP. Это популярный показатель, используемый для измерения производительности моделей, выполняющих задачи поиска документов/информации и обнаружения объектов. Поэтому, если вы время от времени читаете новые статьи по обнаружению объектов, вы всегда можете увидеть, что авторы сравнивают mAP предлагаемых ими методов с наиболее популярными.

Существует несколько алгоритмов обнаружения объектов глубокого обучения, таких как RCNN: Fast RCNN, Faster RCNN, YOLO, Mask RCNN и т. д. Все эти модели решают две важные проблемы: классификация и локализация:

  • Классификация. Определите, присутствует ли объект на изображении, и класс объекта;
  • Локализация: предскажите координаты ограничивающей рамки вокруг объекта, когда объект присутствует на изображении. Здесь мы сравниваем координаты наземной истины и предсказанных ограничивающих рамок.

При измерении mAP нам необходимо оценить эффективность как классификации, так и локализации, используя ограничивающие рамки на изображении.

Для обнаружения объектов мы используем концепцию Intersection over Union (IoU). IoU измеряет перекрытие между двумя границами. Мы используем это, чтобы оценить, насколько наша предсказанная граница перекрывается с основной истиной (фактическая граница объекта):

  • Красный — ограничивающая рамка наземной истины;
  • Зеленый — прогнозируемый ограничивающий прямоугольник.

Проще говоря, IoU говорит нам, насколько хорошо предсказание и ограничивающая рамка истинности перекрываются. Вы увидите, что в коде мы можем установить пороговое значение для IoU, чтобы определить, действительно ли обнаружение объекта или нет.

Для COCO AP – это среднее значение по нескольким IoU (минимальное значение IoU, при котором считается положительным совпадение). AP@[.5:.95] соответствует средней точке доступа для IoU от 0,5 до 0,95 с размером шага 0,05. Для соревнования COCO AP представляет собой среднее значение по 9 уровням IoU в 80 категориях (AP@[0,50:05:0,95]: от 0,5 до 0,95 с шагом 0,05). Ниже приведены некоторые другие показатели, собранные для набора данных COCO:

И, поскольку моя серия руководств связана с детектором объектов YOLOv3, вот результаты AP из статьи автора:

На рисунке выше AP@0,75 означает точку доступа с IoU=0,75.

mAP (средняя средняя точность) — это среднее значение AP. В некоторых контекстах мы вычисляем AP для каждого класса и усредняем их. Но в некотором контексте они означают одно и то же. Например, в контексте COCO нет разницы между AP и mAP. Вот прямая цитата из COCO:

AP - это усредненные общие категории. Традиционно это называется «средняя средняя точность» (mAP). Мы не делаем различий между AP и mAP (а также AR и mAR) и предполагаем, что разница очевидна из контекста.

Хорошо, давайте вернемся к началу, где нам нужно рассчитать mAP. Во-первых, нам нужно установить пороговое значение для IoU, чтобы определить, действительно ли обнаружение объекта или нет. Допустим, мы установили IoU на 0,5, в этом случае:

  • Если IoU ≥0,5, классифицируйте обнаружение объекта как True Positive (TP);
  • Если Iou ‹0,5, это неправильное обнаружение и классифицируется как Ложное срабатывание (FP);
  • Когда на изображении присутствует основная правда, а модель не может обнаружить объект, мы классифицируем это как Ложноотрицательный (FN);
  • Истинно отрицательный (TN): TN – это любая часть изображения, в которой мы не предсказали наличие объекта. Эта метрика бесполезна для обнаружения объектов. Поэтому мы игнорируем TN.

Если мы установим пороговое значение IoU равным 0,5, мы рассчитаем mAP50. Если IoU=0,75, то рассчитываем mAP75. Иногда мы можем видеть их как mAP@0,5 или mAP@0,75, но это одно и то же.

Мы используем Precision и Recall в качестве показателей для оценки производительности. Точность и полнота рассчитываются с использованием истинных положительных результатов (TP), ложных положительных результатов (FP) и ложных отрицательных результатов (FN):

Чтобы получить mAP, мы должны рассчитать точность и полноту для всех объектов, представленных на изображениях.

Также необходимо учитывать показатель достоверности для каждого объекта, обнаруженного моделью на изображении. Рассмотрите все предсказанные ограничивающие рамки с оценкой достоверности выше определенного порога. Ограничивающие рамки выше порогового значения считаются положительными, а все ожидаемые ограничивающие рамки ниже порогового значения считаются вредными. Таким образом, чем выше порог достоверности, тем ниже будет mAP, но мы будем более уверены в точности.

Итак, как рассчитать общий AP? Это довольно просто. Для каждого запроса мы можем рассчитать соответствующий AP. Пользователь может задавать сколько угодно вопросов к своей помеченной базе данных. mAP — это просто среднее значение всех запросов, сделанных при использовании.

Чтобы увидеть, как мы получаем AP, вы можете проверить функцию voc_ap в моем репозитории GitHub. Когда у нас есть списки Precision(pre) и Recall(rec), мы используем следующую формулу:

Мы должны запустить эту функцию выше для всех классов, которые мы используем.

Чтобы рассчитать общую AP для набора данных COCO, мы должны зациклить функцию оценки для IoU[.50:.95] 9 раз. Вот формула из Википедии:

Здесь N будет девятью, а АР будет суммой АР50, АР55, …, АР95. Это может занять некоторое время, чтобы вычислить эти результаты, но именно так нам нужно рассчитать mAP.

Практическая реализация mAP YOLOv3

Во-первых, вы должны перейти к моей реализации YOLOv3 TensorFlow 2 на GitHub. Есть файл с именем evaluate_mAP.py. Полная оценка выполняется в этом скрипте.

При написании этого сценария оценки я сосредоточился на наборе данных COCO, чтобы убедиться, что он будет работать с ним. Итак, в этом руководстве я объясню, как запустить этот код для оценки модели YOLOv3 в наборе данных COCO.

Во-первых, вы должны загрузить набор данных проверки COCO по следующей ссылке: http://images.cocodataset.org/zips/val2017.zip. Также, если по какой-то причине вы хотите обучить модель на наборе данных COCO, вы можете скачать и обучить набор данных: http://images.cocodataset.org/zips/train2017.zip. Но это уже 20 ГБ, и переобучение модели на наборе данных COCO займет много времени.

В TensorFlow-2.x-YOLOv3/model_data/coco/ is 3 файла, файлы coco.names, train2017.txt и val2017.txt. Здесь я уже размещал файлы аннотаций, чтобы не нужно было ломать голову, где взять эти файлы. Затем вы должны разархивировать файл набора данных и поместить папку val2017 в тот же каталог. Это должно выглядеть следующим образом: TensorFlow-2.x-YOLOv3/model_data/coco/val2017/images...

Хорошо, теперь мы должны изменить несколько строк в нашем yolov3/configs.py:

  • Вы должны связать TRAIN_CLASSES с 'model_data/coco/coco.names';
  • Если вы хотите тренироваться на наборе данных COCO, измените TRAIN_ANNOT_PATH на 'model_data/coco/train2017.txt';
  • Чтобы проверить модель в наборе данных COCO, измените TEST_ANNOT_PATH на 'model_data/coco/val2017.txt';
  • Чтобы изменить input_size модели, измените YOLO_INPUT_SIZE и TEST_INPUT_SIZE на нужные вам, например, на 512.

Теперь у нас есть все настройки для оценки. Теперь я объясню процесс оценки в нескольких предложениях. Весь процесс оценки можно разделить на три части:

  • В первой части сценарий создает папку mAP в локальном каталоге, в которой он устанавливает еще одну наземную папку. Здесь он создает файл .json для каждой ограничивающей рамки изображения;
  • Во второй части большая часть выполняется нашей моделью YOLOv3, и она выполняет прогнозы для каждого изображения. Так же, как и в первых частях, он создает файл .json для каждого класса, который у нас есть, и соответствующим образом размещает ограничивающую рамку обнаружения;
  • В третьей части мы уже обнаружили и заземлили ограничивающие рамки. Мы рассчитываем AP для каждого класса с помощью функции voc_ap. Когда у нас есть AP каждого класса, мы усредняем его и получаем mAP.

Вот вывод скрипта evaluate_mAP.py, когда мы вызываем его с параметрами score_threshold=0.05 и iou_threshold=0.50:

Заключение

Я сделал это руководство, потому что полезно знать, как рассчитать mAP вашей модели. Вы можете использовать эту метрику, чтобы проверить, насколько точна ваша специально обученная модель с набором данных проверки.

Вы можете проверить, как меняется mAP, когда вы добавляете больше изображений в свой набор данных, изменяете порог или параметры IoU. Это в основном используется, когда вы хотите выжать как можно больше из своей пользовательской модели.

Я думал внедрить mAP в процесс обучения, чтобы отслеживать его на Tensorboard. Тем не менее, я не смог найти эффективного способа сделать это, поэтому, если кто-то найдет способ сделать это эффективно, я приму запросы на включение на моем GitHub, увидимся в следующей части руководства!

Вот и все для этой обучающей части. Спасибо за чтение.

Первоначально опубликовано на https://pylessons.com/YOLOv3-TF2-mAP

Больше контента на plainenglish.io