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 со сдвинутой границей.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
