- Saved searches
- Use saved searches to filter your results more quickly
- License
- intbusoft/iANRCRPython
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- (2) Анализ проблемы
- (3) Основная идея / архитектура
- (4) Подробные шаги
- (5) Анализ ограничений
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
License
intbusoft/iANRCRPython
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Распознавание номеров жд вагонов. Использует TensorFlow 2 и может работать, как на GPU, так и на CPU. Использует Yolov5 в качестве модели распознавания.
Требуется установка OpenCV и Tensorflow
pip install -r requirements.txt
pip install opencv-python pip install tensorflow
Для инициализации нужно подключить iANRCRSettings:
Там определен путь до модели:
iANRCRDetectModelPath = "model/model01.pb"
Но вы можете перенести модель в другое место и задать путь самостоятельно:
import iANRCRSettings iANRCRSettings.iANRCRDetectModelPath = "/home/model01.pb"
Настройки библиотеки хранятся там же в iANRCRConfig и их можно не менять:
config = iANRCRSettings.iANRCRConfig()
- detect_conf_thresh — пороговое значение детектора символов;
- detect_max_output_size — максимальное количество детектируемых символов;
- detect_iou_threshold — пороговое значение IoU
- detect_width — размер входного изображения по ширине (должен соответствовать модели);
- detect_height — размер входного изображения по высоте (должен соответствовать модели);
- types_of_object_detection — количество типов детектированных символов (10 — количество цифр);
- max_distance_between_charactersW — максимальное расстояние между символами по горизонтали при объединении в номер, измеряется в высотах символов;
- max_distance_between_charactersH — максимальное расстояние между символами по вертикали при объединении в номер, измеряется в высотах символов;
- min_symbols_in_number — минимальное количество символов в номере;
- correct_number — нужно ли проверять номер по корректирующему символу (РЖД);
- memory_number_frames — количество кадров с номерами в памяти (при потоковом распознавании);
- memory_number_repeat — сколько кадров в памяти должны быть с одним номером при потоковом возвращении.
Загрузка настроек и инициализация класса распознавания:
Распознавание отдельных изображений
Показано в примере imageSample.py. Передавать на распознавание можно сразу несколько изображений:
image1 = cv2.imread("imagetest1.jpg") image2 = cv2.imread("imagetest2.jpg")
ia.draw_symbols([image1,image2],["imagetest1_out.jpg","imagetest2_out.jpg"])
В том же примере представлен тест производительности — функция SpeedTest()
Также есть пример работы в гугл Colab: iANRCRPython.ipynb
Полные возможности распознавания показаны в примере videoSample.py. Основные особенности примера:
- path — путь до видеофайла;
- divideW — параметр изменения изображения перед передачей на распознавание, 1 — не меняется, 2 — разрезается пополам по горизонтали и передается первая половина;
- draw_number — функция, которая рисует и текущий номер, и номер из памяти;
- get_numbers() — функция получения распознанных номеров текущего кадра из класса iANRCR;
- get_numbers_memory() — функция получения распознанных номеров с учетом памяти. Лучше использовать именно этот вариант, т.к. он надежнее.
Тип теста | Распознавание 1 кадра (sec) |
---|---|
CPU i7-6700 4GHz Windows | 0.3 |
GPU RTX 2080 Super Windows | 0.05 |
GPU Tesla P100 Linux | 0.037 |
GPU RTX 3090 Linux | 0.023 |
GNU General Public License v3.0
Использование под другой лицензией
Со всеми вопросами на сайт intbusoft.com
За отдельную плату мы можем дообучить и/или предоставить другую модель для распознавания символов. Также при необходимости можем перевести модель на движок TensorRT для конкретного устройства
(2) Анализ проблемы
Этот проект возник в результате классной работы автора.
Для некоторых данных изображений поезда с серийными номерами, как мы можем использовать компьютерное зрение и методы обработки изображений, чтобы реализовать автоматическое позиционирование текста серийного номера и распознавание текстовых символов?
(3) Основная идея / архитектура
Входное изображение -> Обработка оттенков серого -> Обработка пороговых значений -> Морфологическая обработка (операция закрытия, операция открытия -> Обнаружение края Canny -> операция открытия закрытой операции) -> символы вырезания гистограммы проекции -> Соответствие шаблону -> последовательность вывода текста
В этой работе метод морфологической обработки используется для приблизительного определения позиции символа, а результат получается путем комбинирования с сопоставлением с шаблоном.
1. После предварительной обработки изображения, серии операций открытия и закрытия и точного обнаружения краев только локальные функции текстуры становятся богатыми и соединяются в прямоугольные блоки в исходном изображении, а окружающий пустой текст может быть эффективно сохранен.
2. Используйте метод проецирования для сегментации каждого двоичного символа.
3. Измерьте евклидово расстояние между этими символами и соответствующим шаблоном в библиотеке character_template.
4. Выведите текст с наилучшим соответствием результата в исходное изображение.
(4) Подробные шаги
4.1 Предварительная обработка изображений
Сначала мы выполняем обработку оттенков серого на изображении RGB, которое необходимо ввести, превращая его в одноканальное изображение, уменьшая объем вычислений, как показано на рисунке ниже.
Затем выполняется пороговая обработка, чтобы преобразовать изображение в градациях серого в двоичное изображение, чтобы еще больше сократить объем вычислений, как показано на рисунке ниже.
4.2 Морфологическая обработка
Поскольку в двоичном изображении есть тонкие линии и небольшие черные области, нам нужно выбрать соответствующее ядро свертки для закрытой операции, чтобы устранить небольшие черные области в изображении, как показано на следующем рисунке.
Нам также необходимо выбрать подходящее ядро свертки для изображения и продолжить обработку операции открытия на изображении, чтобы устранить белые дыры, образовавшиеся после операции закрытия, и белые тонкие линии в оригинале. двоичное изображение. Как показано ниже.
Для восстановленного изображения мы используем оператор canny для определения информации о его краях, как показано на рисунке ниже.
Снова выполните операции закрытия и открытия изображения, как показано на рисунке ниже.
После вышеупомянутых морфологических операций мы можем обнаружить, что во входном изображении поезда только локальные элементы текстуры являются богатыми и соединены в прямоугольные блоки, а окружающий пустой текст может быть эффективно сохранен.
4.3 Сегментация проекционной гистограммы
Чтобы облегчить последующие операции сопоставления шаблонов, мы изменим цвет полученного изображения, как показано на рисунке ниже.
Мы используем метод проецирования, чтобы проецировать черные пиксели изображения на ось y, чтобы получить гистограмму проекции. Длина гистограммы указывает количество черных пикселей в строке. Как показано ниже.
Затем мы вырезаем в соответствии со строкой с наибольшим накопленным значением пикселя и считаем, что эта строка содержит наибольшую семантическую информацию во всем изображении, то есть строку, в которой находится целевая область символа находится, и запишите начальное значение координаты y.
Аналогичным образом мы используем метод проекции, чтобы проецировать черные пиксели изображения на ось x, чтобы получить гистограмму проекции. Высота гистограммы указывает количество черных пикселей в строке. Как показано ниже.
Запишите начальную позицию черного пикселя на гистограмме проекции, и можно получить начальное значение координаты x области символа.
Объедините начальное значение координаты y для области символа, полученной ранее, и область символа может быть отмечена прямоугольной рамкой на исходном исходном изображении RGB. Как показано ниже.
Гистограмма проекции по оси X частичных фрагментов текстовой области вырезается по впадине значения пикселя, чтобы получить двоичное изображение каждого символа. Как показано ниже.
4.4 Сопоставление шаблонов
Учитывая, что серийный номер, указанный в задаче, состоит только из четырех букв «R», «W», «Y» и «Z» и десяти цифр от 0 до 9, мы составили шаблонный набор данных для сопоставления. Размер шаблона письма 2025 пикселей, число 1625 пикселей. Как показано ниже
будет сопоставлять все изображения вырезанных символов со всеми изображениями в наборе данных шаблона по кругу. Сначала отрегулируйте его до того же размера, что и шаблонное изображение, затем измерьте евклидово расстояние между двумя изображениями в соответствии с соответствующими пикселями и накопите евклидово расстояние между каждыми двумя пикселями, чтобы пройти по всей матрице изображения. Мы рассматриваем шаблон с наименьшей суммой как соответствующий шаблон. Результат сопоставления показан на рисунке ниже.
Наконец, мы печатаем текстовые символы, соответствующие шаблону, которому соответствует каждый символ на входном исходном изображении RGB, чтобы реализовать процесс распознавания символов, как показано на рисунке ниже.
(5) Анализ ограничений
В настоящее время эта работа позволяет получить хорошее распознавание только изображения «carriage3» в папке «1 Carriage number».
Прежде всего, в этом методе задействовано слишком много параметров, таких как параметры пороговой обработки, параметры порога гистерезиса оператора Кэнни, параметры ядра свертки для операций открытия и закрытия и так далее.
Поскольку трудно найти набор общих параметров в нескольких изображениях в разных средах, этот метод плохо переносится;
Кроме того, этот метод также не учитывает проблему перспективы изображения и может обеспечить лучший эффект распознавания только для противоположного изображения поезда.
Для решения вышеуказанных проблем мы можем рассмотреть возможность установки адаптивного порога для настройки параметров самостоятельно или использовать метод скользящей полосы, чтобы пользователи могли выбирать оптимальные параметры шаг за шагом и в интерактивном режиме;
На этапе грубого позиционирования текстовой последовательности мы также можем использовать более надежный оператор градиента текстовой функции для замены морфологического метода;
Кроме того, чтобы решить проблему распознавания с разных точек зрения, в этой работе также необходимо ввести коррекцию перспективы, горизонтальную коррекцию, аффинное преобразование и другие методы.
Из-за ограниченного времени и личных возможностей, хотя вышеупомянутые идеи были опробованы, но не увенчались успехом, необходимы дополнительные исследования.