Проект для тестирования алгоритма распознавания времени на аналоговых часах по фотографии
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 содержат вспомогательные функции. Их можно не трогать, если это не нужно.