Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

44 Commits

Folders and files

Repository files navigation

Описание

Проект для тестирования алгоритма распознавания времени на аналоговых часах по фотографии

Установка зависимостей

python3 -m pip install '.'

Запуск

Из консоли:

python3 -m test_clock_detection

Из среды разработки запускать файл test_clock_detection/__main__.py

Структура

Вход

В папке files/Изображения находятся фото часов, которые подаются в программу тестирования.

Имена входных фото должны быть в формате "ЧЧ:ММ:СС.мс.bmp". Пример: 02:01:56.432.bmp

Выход

Программа сохраняет выходные файлы в папки files/Результаты/По шагам и files/Результаты/Окончательные.

Статистику по успешным обнаружениям выводится в stdout.

Папка "По шагам"

В папку По шагам сохраняются фото в промежуточных состояниях работы алгоритма. Например, если алгоритм 3 раза фильтрует изображение, а потом находит контуры стрелок, то в папку По шагам можно сохранить 4 фотографии: 3 на разных стадиях фильтрации и одну с обведенными контурами.

На каждую входную фото, в папке По шагам создается отдельная папка с промежуточными результатами. Имя папки совпадает с именем входного фото.

Папка "Окончательные"

В папке Окончательные сохраняются фото после всех обработок алгоритма. Это удобно для быстрого сравнения результата работы алгоритмы на разных входных фото.

Имена фото в папке Окончательные имеют формат success-delta-detected_time-real_time, где

success - 1, если время успешно детектировано, иначе 1 delta - разница между реальным временем на часах, и детектированным detected_time - детектированное время real_time - реальное время

Параметр success намеренно расположен в начале имени. При таком формате, все фото с неудачными определениями времени будут находиться в начале папки с окончательными результатами.

Статистика успешных обнаружений

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

Статистика выводится в виде таблицы:

Размер выборки: 10

| Погрешность   | Уложилось в погрешность   |   Количество ошибок |
|---------------|---------------------------|---------------------|
| 0.1 c.        |  60 %                     |                   4 |
| 0.2 c.        |  80 %                     |                   2 |
| 0.3 c.        |  90 %                     |                   1 |
| 0.4 c.        | 0.0 %                     |                   0 |
| 0.5 c.        | 0.0 %                     |                   0 |
| 0.6 c.        | 0.0 %                     |                   0 |
| 0.7 c.        | 0.0 %                     |                   0 |
| 0.8 c.        | 0.0 %                     |                   0 |
| 0.9 c.        | 0.0 %                     |                   0 |
| 1 c.          | 0.0 %                     |                   0 |

В данном случае по таблице видно, что из 10 фото, обнаруженное время отличается

  • более чем на 0.1 секунду в 4 случаях
  • более чем на 0.2 секунду в 2 случаях
  • более чем на 0.3 секунду в 1 случаях
  • все остальные случаи входят в погрешность 0.4 секунды

Как использовать скрипт

В скрипте уже написано все для запуска тестов.

В папке files/Изображения есть примеры входных фотографий с правильными именами. Скрипт уже работает из коробки для демонстрации работы, сохраняет результаты и выводит статистику.

Исходный код находится в папке test_clock_detection. Туда можно добавлять свои файлы, можно модифицировать существующие.

Входные изображения

Входные изображения можно скачать отсюда.

В архиве находятся 5 ГБ размеченных фотографий. Их нужно распаковать в папку files/Изображения.

Файлы проекта

  • __main__.py - точка входа в программу, скорее всего править будет не нужно

  • data_types - кастомные типы данных (классы). Можно дополнять, но не обязательно. Ключевой класс, который потребуется использовать - ClockTime, он должен возвращаться из функции обнаружения времени

  • detect_time.py - модуль, в котором должна находиться функция обнаружения времени. Функция должна иметь следующую сигнатуру:

    def detect_time(
        root_folder: Path, image_path: Path, debug_mode: None | Debugger = None
    ) -> ClockTime:

    Совпадать должно все, включая имени функции и переменных.

    Аргументы:

    • root_folder - папка корня проекта, может быть полезна для загрузки каких-либо ресурсов, например, шаблонов стрелок. Использовать необязательно

    • image_path - путь к фото с часами из папки Изображения. По этому фото определяется время на часах.

    • debug_mode - класс из модуля **algorithm_debugger.py``. Используется для сохранения промежуточных результатов обработки изображения в папку По шагам. Использовать обязательно. Все промежуточные шаги должны сохраниться

    Возвращаемое значение:

    • Определенное на фото время, тип ClockTime

    В файле уже приведен пример простого алгоритма с использованием аргументов, возвратом значения, сохранением промежуточных результатов.

    Из файла можно удалять все функции, кроме detect_time. Тело detect_time можно полностью заменить на свое.

  • const.py - параметры скрипта тестирования, значения можно изменять, пояснения к параметрам написано в самом модуле.

  • algorithm_debugger.py - модуль для сохранения промежуточных результатов. В модуле находятся классы Debugger, AlgorithmDebugger, DummyDebugger.

    • Debugger - класс-интерфейс для остальных debugger-ов
    • DummyDebugger - затычка для debugger-а, все методы пустые. Используется когда нужно замерить время работы алгоритма, чтобы сохранение промежуточных результатов не добавляло дополнительные временные затраты.
    • AlgorithmDebugger - основной класс debugger-а. Содержит реализации всех методов для сохранения промежуточных результатов.

    Методы классов обычно принимают картинку и некоторые дополнительные элементы, которые нужно добавить на картинку.

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

    Метод нужно добавлять во все 3 класса, по образу и подобию.

  • Модули draw_image.py, results_analysis.py и utils.py содержат вспомогательные функции. Их можно не трогать, если это не нужно.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages