Событие по серии кадров: задача на Python

Одиночное срабатывание детектора может оказаться шумом. Соберите события из серии покадровых решений с порогом подтверждения и правилами закрытия. Номера кадров идут с пропусками, поэтому окно нужно считать по наблюдениям журнала.

Программа курса «Computer Vision Engineer: от детекции и Doc-AI до продакшна».

Подтверждение события по серии кадров

Задание

Журнал покадровых решений снят заранее: на каждый обработанный кадр в нём записано, сработал детектор или нет. Объявлять событие по одному срабатыванию нельзя — оно неотличимо от ошибки, — поэтому событие открывается и закрывается по серии.

Реализуйте функцию confirm_events(decisions, k, n). Аргументы:

  • decisions — список отметок (frame, flag) в порядке возрастания номера кадра: frame — номер кадра, flag — сработал ли детектор. Номера идут с пропусками, потому что обрабатывался не каждый кадр;
  • k и n — глубина подтверждения: k отметок из n подряд идущих.

Окно считается по отметкам журнала, а не по номерам кадров: n — это последние n отметок, сколько бы кадров между ними ни пропустили. Пока отметок меньше n, окном считается всё, что уже прочитано.

Пока событие не идёт, в окне считаются срабатывания. Как только их набралось k, событие открывается, и его началом становится номер кадра текущей отметки.

Пока событие идёт, в окне считаются отметки без срабатывания. Как только их набралось k, событие закрывается, и его концом становится номер последнего кадра со срабатыванием, попавшего в это событие.

Окно очищается при каждой смене состояния: после открытия события и после его закрытия отметки копятся заново. Если к концу журнала событие осталось открытым, закройте его по тому же правилу — номером последнего кадра со срабатыванием.

Вернуть список пар (начало, конец) в порядке появления событий. Событий может не оказаться вовсе — тогда список пустой.

Пример

decisions = [
    (0, False), (5, True), (10, True), (15, False),
    (20, True), (25, False), (30, False), (35, False),
]
confirm_events(decisions, 2, 3)
# [(10, 20)]

На кадре 10 в окне из трёх последних отметок набралось два срабатывания — событие открыто. Дальше на кадре 25 в окне набралось две отметки без срабатывания, и событие закрыто кадром 20: это последний кадр, на котором детектор сработал.

Примечание

Вход уже разобран и приходит аргументом: номера кадров — целые числа, строго возрастающие от отметки к отметке, flag — True или False. Про k и n известно, что 1 <= k <= n. Менять входной список нельзя. Вызывать функцию вручную не нужно, проверка запускает её сама.

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

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

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

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

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

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