mIoU многоклассовой маски: расчёт на Python

На каждом пикселе размечен класс, а для отчёта нужно получить среднюю оценку пересечения по классам. Реализуйте mIoU по готовым спискам и обработайте классы, отсутствующие одновременно в разметке и предсказании, по правилу задачи.

Откройте программу платного курса Computer Vision Engineer, чтобы продолжить практику с данными, моделями и CV-сервисом.

mIoU по многоклассовой маске

Задание

Напишите функцию mean_iou(predicted, truth, classes), которая возвращает mIoU — среднее IoU по классам.

Здесь маска уже не бинарная: в каждом пикселе стоит номер класса от 0 до classes - 1. Ноль — обычно фон, но никакого особого обращения он не требует, это такой же класс, как остальные.

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

Одна тонкость, из-за которой mIoU у разных людей расходится. Класс может не встретиться ни в разметке, ни в предсказании: у него нет ни TP, ни FP, ни FN, и IoU для него не определён. Такие классы в среднее не входят вовсе — иначе список классов, объявленный в наборе «на вырост», занижал бы метрику на кадрах, где этих объектов просто нет. Делить надо на число классов, которые действительно встретились.

Пример

predicted = [[0, 1, 1],
             [2, 2, 1]]
truth = [[0, 0, 1],
         [2, 2, 1]]

mean_iou(predicted, truth, 3)  # 0.7222222222222222
mean_iou(predicted, truth, 4)  # 0.7222222222222222

По классам получается так: у нулевого один пиксель совпал и один пропущен, IoU 0.5; у первого совпало два и один лишний, IoU 0.667; второй совпал целиком, IoU 1.0. Среднее трёх — 0.722. Во втором вызове объявлено четыре класса, но третий не встретился ни разу, поэтому ответ не меняется.

Примечание

Маски приходят готовыми списками списков одного размера, номера классов в них не выходят за границы classes. Хотя бы один класс в паре масок встречается всегда, так что делить на ноль не придётся. Возвращайте число; вызывать функцию самостоятельно не нужно, тесты сделают это сами. Значения сравниваются с точностью до девятого знака, округлять результат не надо.

Что проверяется

Код проверок скрыт, так что вот полный список того, что в них разбирается:

  • формат ответа: возвращается число;
  • оба вызова из примера — три объявленных класса и четыре;
  • объявленный класс не встретился ни в разметке, ни в предсказании: в среднее он не входит;
  • маски совпали полностью и обратный случай — классы перепутаны местами;
  • класс есть только в предсказании и только в разметке;
  • весь кадр занят одним классом;
  • полосы на кадре 100 на 100 со сдвинутой границей.
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи