Утечка между train и validation: найти копии по имени

У аугментированных копий одного снимка разные имена файлов, поэтому простая проверка одинаковых имён не замечает пересечение выборок. Напишите функцию поиска файлов val и test, связанных с обучающими снимками; правила извлечения идентификатора источника заданы в условии.

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

Кадры валидации, которые модель уже видела

Задание

Экспорт Roboflow раскладывает аугментированные копии одного снимка отдельными файлами, и при делении на сплиты копии разъезжаются по разным папкам. Проверка на пересечение имён такого не находит: имена у копий разные. Найдём эти файлы по происхождению.

Напишите функцию leaked_files(records), которая принимает список пар (имя файла, сплит) и возвращает имена файлов из сплитов val и test, у которых копия того же исходного снимка есть в train.

Имя файла устроено так: <набор>_<снимок>_jpg.rf.<хеш>.jpg. Имя набора — всё до первого знака _, и внутри самого имени этот знак не встречается. Идентификатор снимка — всё между этим первым _ и _jpg.rf.; здесь знак встречаться может. Само имя набора при сравнении не учитывается: два набора одной серии нумеруют снимки одинаково, поэтому файлы с совпавшим идентификатором — копии одного снимка, из какого бы набора они ни пришли.

Сплит — одна из строк train, val, test. Файлы из train в ответ не попадают никогда, даже если у них есть копии в других сплитах. Результат отсортируйте по имени файла по возрастанию; пустому входу соответствует пустой список.

Пример

records = [
    ("shelfA_test2020_7_jpg.rf.aaa.jpg", "train"),
    ("shelfB_test2020_7_jpg.rf.bbb.jpg", "val"),
    ("shelfA_test2020_9_jpg.rf.ccc.jpg", "val"),
    ("shelfA_test2020_9_jpg.rf.ddd.jpg", "test"),
]

leaked_files(records)  # ['shelfB_test2020_7_jpg.rf.bbb.jpg']

Снимок test2020_7 попал и в обучение, и в валидацию — пусть и под разными именами наборов, — поэтому файл из val в ответе. Снимок test2020_9 размножен между val и test, но в обучении его нет: делить эти два сплита между собой тоже плохо, однако утечкой в обучение это не является, и в ответ такие файлы не идут.

Примечание

Все имена во входе соответствуют описанному формату, разбирать что-то ещё не нужно. Одно и то же имя файла во входе дважды не встречается. Вызывать функцию и печатать что-либо не требуется, это сделают тесты.

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

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

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

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

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

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