Skip to content

Микросервис, позволяющий распознавать информацию со справок, учитывая в том числе табличное форматирование

Notifications You must be signed in to change notification settings

Darveivoldavara/ocr_for_medical_certificates

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Оптическое распознавание информации в медицинских справках

Данное OCR-решение разработано для распознавания данных с фото медицинских справок для последующей интеграции в систему проекта по поиску доноров крови. Было необходимо успешно получить следующую информацию:

  • Дата донации
  • Факт оплаты донации
  • Класс крови донации

Итог работы

Готовый микросервис для распознавания нужной информации, отлично обрабатывающий большинство фотографий, кроме достаточно "размытых". Работает на основе библиотеки docTR и с применением постобработки с помощью регулярных выражений. Обработка задач на распознавание реализована асинхронно с использованием Celery.

Качество решения в рамках метрики accuracy по отдельным ячейкам составляет 0.91.

Качество классификаций по формам справок и по их ориентациям составляет 0.93 для метрики F-1.

Описания работы и тестирования, в том числе с интерактивными графиками, можно увидеть в Jupiter-тетрадках на nbviewer:

OCR

Классификация типа справки

Классификация ориентации изображения


Загрузка сервиса (Docker)

Найти docker-контейнеры для микросервиса можно здесь.

Скачать:

docker pull darveivoldavara/ocr_for_medical_certificates:web

docker pull darveivoldavara/ocr_for_medical_certificates:worker

Запустить:

Compose-файл для самостоятельной сборки.


Клонирование репозитория

Если потребуется самостоятельно собрать / запустить образы (с помощью docker-compose build / docker-compose up), то при клонировании репозитория необходимо использовать Git LFS для корректной загрузки моделей. Сначала установить:

Инструкции по установке

Далее однократно настроить Git LFS для своей учетной записи: git lfs install

После чего можно клонировать репозиторий, как обычно:

git clone https://github.com/Darveivoldavara/ocr_for_medical_certificates.git


Handlers (ручки запросов)

  • Для отправки изображения в очередь (post-запрос) — /upload — подгружает фотографию в сервис и возвращает task_id для использования в get-запросе
    • Пример отправки в сервис вашего конкретного изображения, находящегося по пути path_to_your_image.jpg

      curl -X GET -F "file=@path_to_your_image.jpg" http://localhost:8000/

  • Для получения результата распознавания (get-запрос) — /result/{task_id} — возвращает результат в формате JSON

Обновления проекта

Дата Значение accuracy Изменение
04.07.2023 0.86 изначальный показатель
08.07.2023 0.872 заполнение пропусков наиболее частыми соответствующими значениями
10.07.2023 0.879 подбор наилучших моделей детекции и распознавания текста
13.07.2023 0.904 адаптация скрипта к результатам работы новых моделей
16.07.2023 0.91 финальный дебаг скрипта
17.08.2023 0.91 реализована асинхронная работа сервиса
04.09.2023 0.91 добавлена частичная классификация справок на входе
08.11.2023 0.91 оптимизирована файловая структура и сборка контейнера; дебаг обработки некоторых изображений
21.12.2023 0.91 внедрена обработка повёрнутых изображений

Не сработало

Другие изначально рассмотренные библиотеки для распознавания текста и таблиц, такие как Tesseract, EasyOCR и Paddle OCR давали ощутимо более низкое качество, чем использование для этих целей предобученных нейронных сетей, представленных в docTR. Также были протестированы различные методы по предобработке входящих изображений для улучшения их чёткости, и как следствие, повышения качества распознавания символов. Но все рассмотренные способы в итоге давали максимум визуальное улучшение и повышение чёткости, резкости фото, но многие символы в целом видоизменялись на некорректные, и итоговое качество их распознавания только падало по сравнию с решением без какой-либо предобработки вообще. Протестированы были следующие методы:

  • Библиотека cv2 (методы для adaptiveThreshold() с различными настройками: ADAPTIVE_THRESH_MEAN_C и ADAPTIVE_THRESH_GAUSSIAN_C) для усиления границ элементов изображения
  • Библиотека PIL (фильтр SHARPEN для ImageFilter) для повышения резкости фото
  • Решения, использующие нейронные сети для апскейла и/или улучшения изображения:
    • API Waifu2x
    • Проект Real-ESRGAN (дефолтная модель RealESRGAN_x4plus с различными настройками)

Не успели

  • Поробовать интегрировать в используемый метод библиотеки docTR какие-то другие модели для детекции и распознавания, помимо уже встроенных (например, с HuggingFace)
  • Отсмотреть возможные улучшения качества работы скрипта на абсолютно всех тестовых примерах (включая обработанные с сильно высоким показателем accuracy)
  • Протестировать иные методы для предобработки изображений