В предыдущей статье я рассказывал как собираю данные для детектирования текста на изображениях.

Теперь используя собранный набор данных попробуем натренировать одну из самых популярных сетей для сегментации и детектирования объектов YOLOv5.

Для этого будем использовать бесплатный Google Colab.

Подключаем диск из аккаунта Google

from google.colab import drive

drive.mount('/content/drive', force_remount=True)

В корневой папке должен находиться архив с тренировочными данными который можно найти здесь GitHub.

Также скачайте и поместите в корневую папку файлы last.pt, text_segment.yaml, hyp.scratch-low.yaml, labels_yolo.zip

Клонируем из GitHub YOLOv5 и устанавливаем

!git clone https://github.com/ultralytics/yolov5

!pip install -r /content/yolov5/requirements.txt

Я выбрал самую лёгкую и быструю модель yolov5n-seg и изменил файл конфигурации модели yolov5n-seg.yaml что бы уменьшить размер модели и увеличить скорость вывода.

Распаковываем изображения и файлы разметки в папку /content/yolov5/datasets/text_detection

from zipfile import ZipFile

with ZipFile('/content/drive/MyDrive/sd_text_detection_train.zip', 'r') as zipObj:

   zipObj.extractall('/content/yolov5/datasets/text_detection')

with ZipFile('/content/drive/MyDrive/labels_yolo.zip', 'r') as zipObj:

   zipObj.extractall('/content/yolov5/datasets/text_detection/labels')   

Всё готово для тренировки сети, приступаем

%cd /content/yolov5

!python "/content/yolov5/segment/train.py" --img 800 --batch 12 --epochs 1200 --data "/content/drive/MyDrive/text_segment.yaml" \

--hyp "/content/drive/MyDrive/hyp.scratch-low.yaml" --project '/content/drive/MyDrive/text_detect/' --name 'weights' \

--weights "/content/drive/MyDrive/last.pt"

Авторы YOLOv5 рекомендуют тренировать сеть 300 эпох и более, тренировка одной эпохи в бесплатной версии Google Colab занимает примерно 1 час.

На моём домашнем компьютере в Windows 10 тренировка 1 эпохи на видеокарте RTX 2060 с 12 ГБ занимает примерно 6 минут.

Проблема бесплатной версии Google Colab отсутствие многопоточности и SSD диска.

Спустя примерно дофига времени в Google Colab, протестируем нашу модель

!python "segment/predict.py" --imgsz 800 --iou-thres 0.25 --conf-thres 0.5 --hide-labels --hide-conf --line-thickness 2 --device "cpu" --weights "/content/drive/MyDrive/text_detect/weights/weights/last.pt" --source "/content/yolov5/test" 

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

После конвертации в TensorFlow Lite вес модели составляет примерно 5 МБ, скорость вывода на андроид телефоне Redmi Note 10 используя GPU составляет 300 мс.

Комментарии (15)


  1. UtrobinMV
    00.00.0000 00:00
    +1

    В данном случае Yolov5 детектирует только сами прямоугольники с буквами? Она же не распознает сама, что там написано?! Верно?


    1. SmallDonkey Автор
      00.00.0000 00:00

      Текст не распознает, только детекция


      1. UtrobinMV
        00.00.0000 00:00
        +1

        Ждем часть 3!


  1. ZlodeiBaal
    00.00.0000 00:00

    Не проще ли взять https://github.com/open-mmlab/mmocr или https://github.com/PaddlePaddle/PaddleOCR или Easy OCR?
    По таким задачам как чеки там детекторы будут почти идеально работать даже из коробки Возможно вам потом надо будет переобучить только детектор, но часто даже это не надо.

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


    1. SmallDonkey Автор
      00.00.0000 00:00

      Их плюс в том, что там часто детектор и распознавание текста совмещены

      Это не так, вы ошибаетесь


      1. ZlodeiBaal
        00.00.0000 00:00
        +1

        https://github.com/open-mmlab/mmocr/blob/1.x/projects/ABCNet/README.md
        https://github.com/open-mmlab/mmocr/blob/1.x/projects/ABCNet/README_V2.md
        https://github.com/open-mmlab/mmocr/blob/1.x/configs/kie/sdmgr/README.md
        https://github.com/open-mmlab/mmocr/blob/1.x/projects/SPTS/README.md

        Но в целом, я скорее про сети которые можно разделить на детектор-классификатор, но которые стабильны к изгибу текста:
        https://github.com/open-mmlab/mmocr/blob/1.x/configs/textdet/drrg/README.md
        https://github.com/open-mmlab/mmocr/blob/1.x/configs/textdet/fcenet/README.md
        и.т.д.

        А целом, если у вас смысл чеки распознавать, то даже такое есть, но это уже немного не в тему - https://github.com/clovaai/donut


    1. SmallDonkey Автор
      00.00.0000 00:00

      Не имеет значение какую сеть вы возьмете, это решать вам исходя из ваших потребностей, смысл статьи не в этом.


      1. ZlodeiBaal
        00.00.0000 00:00

        Собственно в этом мой вопрос и есть. Зачем вам понадобилось тренировать свою сеть, если есть много предтренированных. Я не вижу какого-то нового домена данных, я не вижу каких-то повышенных требований на точность/скорость. Кажется, что mmocr тут все должен решить.


        1. SmallDonkey Автор
          00.00.0000 00:00

          Можно было взять любую сеть, тот же Easy OCR дообучить, смысл проверить качество датасета, мне кажется порог вхождения с yolo самый низкий, там разберется даже далекий от этого всего человек.


          1. ZlodeiBaal
            00.00.0000 00:00

            Цимес в том, что по большинстве задач mmocr не придется обучать. И порог ниже.


  1. dimnsk
    00.00.0000 00:00
    +1

    А зачем для OCR - Yolo ? Из статьи не понятно извините...
    можно взять уже обученные OCR на своих датасетах и дообучить...

    PS у вас в Colab GPU включен ? не может одна эпоха на GPU так долго учится ...


    1. SmallDonkey Автор
      00.00.0000 00:00

      Да GPU включен был, там Tesla видюха, 11.7 GB жрала пока тренировал.


  1. mairon2300
    00.00.0000 00:00

    А почему именно yolov5 для детекции текста используется, а не тот же DBNet, но облегченный? Проводилось ли какое-то сравнение между ними?


    1. SmallDonkey Автор
      00.00.0000 00:00

      Я не проводил ни какого сравнения между этими сетями.

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


      1. mairon2300
        00.00.0000 00:00
        -1

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