Кроп и minvisibility: обновить рамки на Python

Кроп может оставить объект целиком, срезать его часть или удалить из кадра. Напишите функцию, которая пересчитает рамки в координаты окна и применит заданный порог видимости; изображения читать не требуется.

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

Что останется от разметки после кропа

Задание

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

Реализуйте функцию crop_boxes, которая повторяет это поведение:

  • пересечь каждую рамку с окном кропа;
  • посчитать видимость — площадь пересечения, делённую на исходную площадь рамки;
  • рамки с видимостью строго меньше min_visibility выбросить;
  • остальные вернуть в координатах окна: левый верхний угол окна становится началом отсчёта.

Порядок уцелевших рамок сохраняется. Рамка, не пересёкшаяся с окном, и рамка нулевой площади отбрасываются при любом пороге, включая нулевой.

Пример

boxes = [(50, 50, 150, 150), (120, 120, 180, 180), (0, 0, 40, 40)]
crop_boxes(boxes, (100, 100, 300, 300), 0.2)
# [(0.0, 0.0, 50.0, 50.0), (20.0, 20.0, 80.0, 80.0)]

У первой рамки внутри окна осталась четверть площади — порог 0,2 она проходит и приезжает обрезанной. Вторая попала в окно целиком. Третья не пересекается с окном и отброшена.

Примечание

Рамки и окно заданы кортежами (x_min, y_min, x_max, y_max) в пикселях исходного кадра. Функция возвращает список кортежей того же вида, но в координатах окна.

Координаты сверяются с точностью до сотых. Вызывать функцию вручную не нужно — проверка запускает её сама.

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

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

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

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

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

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