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