Dice для бинарных масок: задача на Python

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

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

Dice по паре масок

Задание

Напишите функцию dice(predicted, truth), которая возвращает коэффициент Dice для пары бинарных масок одного размера.

Маска приходит списком списков: строка кадра — вложенный список, пиксель — 1, если он принадлежит объекту, и 0, если фону. Оба списка одной высоты и одной ширины.

Считается Dice по тем же трём числам, что и IoU: пиксель, помеченный единицей в обеих масках, идёт в TP, помеченный только в предсказании — в FP, только в разметке — в FN. Дальше по формуле 2·TP / (2·TP + FP + FN).

Отдельный случай — когда в обеих масках нет ни одной единицы. Формула здесь даёт деление на ноль, а по смыслу маски совпали полностью: модель не нашла объекта, и объекта действительно нет. Такой случай возвращает 1.0.

Пример

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

dice(predicted, truth)  # 0.8571428571428571
dice([[0, 0]], [[0, 0]])  # 1.0

В первом примере совпало три пикселя, один лишний, пропущенных нет: 2·3 / (2·3 + 1 + 0). IoU на этих же масках вышел бы 0.75 — можно проверить себя связью между метриками, которая разбиралась в уроке.

Примечание

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

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

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

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

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

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

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