Последние полгода я работал над проектом OCR в Стокард . В этом сообщении в блоге я хочу поделиться с вами некоторыми своими результатами и идеями!

Цель моего исследования

С помощью Stocard вы можете оцифровать все свои физические карты лояльности и носить их с собой в своем смартфоне. Это означает, что мрачная эра ношения миллиарда пластиковых карт в вашем кошельке наконец-то подошла к концу. :-)

Если не считать шуток, одна из основных целей Stocard - сделать приложение максимально удобным для пользователя. Многие карты имеют штрих-код, и эти карты довольно легко оцифровать с помощью считывателя штрих-кода. Но есть также карты, на которых нет штрих-кода, и до сих пор пользователям приходилось вводить номер.

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

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

Я обучил классификаторы Сверточной нейронной сети (CNN) и сравнил результаты с системой распознавания текста Tesseract 4. Какой классификатор правильно решит большинство изображений?

Набор данных

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

  • Обучающий набор состоит из 30685 изображений цифр с карт лояльности, которые были дополнены вариантами, созданными с помощью вычислений. Классификаторы обучались с этими изображениями. Этот набор сбалансирован, что означает одинаковое количество изображений для каждой цифры каждой карты лояльности.
  • Тестовый набор содержит 1246 новых изображений, которые классификаторы никогда раньше не видели, и использовался в конце фазы обучения для оценки результата и сравнения различных подходов. Этот набор не сбалансирован, что означает, что каждый тип карты и каждая цифра появляются примерно так часто, как мы ожидаем в реальных данных.

Оценка

Позвольте мне вкратце объяснить общие метрики оценки для классификаторов. Если вы уже знаете, что означают отзыв, точность и оценка F1, пропустите этот раздел. Если вы новичок в этом, эта страница Википедии имеет более подробное описание.

Отзыв показывает, какой процент изображений определенного класса был правильно отнесен к этому классу. Следовательно, количество образцов, которые были правильно классифицированы («истинно положительные»), делятся на количество истинно положительных результатов плюс количество изображений этого класса, неправильно классифицированных как принадлежащие к другому классу («ложно отрицательные»).

Точность показывает, какой процент изображений, отнесенных к определенному классу, на самом деле является изображениями этого класса. Следовательно, истинные положительные результаты делятся на количество истинных положительных результатов плюс количество изображений других классов, неправильно классифицированных как принадлежащие к этому классу («ложные срабатывания»).

Для сравнения классификаторов удобно иметь только одну метрику вместо двух. Часто это делается с помощью оценки F1. Этот показатель рассчитывается как среднее гармоническое значение отзыва и точности.

Подходы и результаты

Далее я рассмотрю протестированные мной подходы, а также различные варианты и улучшения, которые я пробовал. Я укажу, что на самом деле улучшило результаты, что не повлияло на меня, и, наконец, покажу вам, какой лучший классификатор и расположение я смог найти.

Надеюсь, вам понравится путешествие!

Режимы тессеракта

Первой идеей, которую я преследовал, было использование Tesseract 4. По состоянию на октябрь 2017 года эта версия все еще находилась в стадии бета-разработки, но вы уже могли проверить репозиторий github и собрать его самостоятельно. Приятно то, что это первая версия с новой сетью LSTM.

Это означает, что в Tesseract появился новый алгоритм классификации, и у вас есть возможность выбирать между исходным режимом (движок в Tesseract 3), режимом LSTM и комбинация старого и нового режима.

Итак, как сравнить три режима?

Если вы посмотрите на оценку F1, вы увидите, что исходный режим превосходит новый режим LSTM. Это неожиданно, поскольку результаты, опубликованные разработчиками Tesseract, показывают, что LSTM-режим лучше исходного режима. Есть ли способ объяснить эти результаты?

Да, есть. Причина этого результата в том, что режим LSTM нельзя настроить для использования ограниченного алфавита результатов. Это серьезный недостаток режима LSTM для этого набора данных, поскольку он состоит только из цифр. Многие ложные предсказания - это предсказания, в которых цифра классифицируется как буква, например «0» как «а». Это объясняет низкую ценность отзыва. Если мы посмотрим на значение точности, мы обнаружим, что можем доверять режиму LSTM, когда он действительно идентифицирует цифру. Тогда мы можем быть уверены, что то, что Tesseract называет «0», на самом деле является «0».

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

Преобразование цвета

Второе, что я тестировал, - это преобразование цветного изображения в двоичное черно-белое изображение перед запуском Tesseract. Исходный режим Тессеракт был создан для печатных текстовых документов и, как известно, иногда работает лучше, если изображение предварительно преобразовано. Поэтому я протестировал Алгоритм бинаризации Оцу с помощью Tesseract.

Тесты показывают, что оценка F1 действительно увеличивается при использовании бинаризации Оцу. Как видим, это верно и для нового режима LSTM.

CNN

Мой второй подход заключался в обучении CNN классификации цифр. Я использовал сетевую архитектуру, вдохновленную знаменитой архитектурой LeNet.

Сеть принимает цветные изображения RGB в качестве входных данных. Эти изображения должны иметь ширину 15 пикселей и высоту 30 пикселей.

Для тренировки сетей я использовал Caffe framework. Caffe изначально был разработан для создания CNN и предлагает C ++ API. Кроме того, можно загружать сети Caffe с библиотекой OpenCV. Поэтому мне это показалось лучшим фреймворком для последующей интеграции в наше приложение для iOS.

Во время моего проекта был опубликован Caffe2. Он был специально разработан для поддержки интеграции приложений и может загружать сети, созданные с помощью Caffe. Для меня это было слишком поздно, но это определенно то, что нужно учитывать в будущих разработках.

Но пока продолжим с выводами, которые я сделал!

Единый CNN или CNN на карту

Обучающий набор состоит из изображений цифр с 14 различных типов карточек. Первая идея, которая у меня возникла, заключалась в том, чтобы обучить одну CNN, используя все данные обучения. Это удобно, так как мы можем использовать единую сеть для всех типов карт.

Однако пользователь выбирает тип своей карты в пользовательском интерфейсе Stocard до открытия сканера, поэтому мы уже знаем тип карты, когда открывается сканер OCR. Мне было интересно, можно ли улучшить оценку F1, если у каждого типа карты будет собственный CNN. Поэтому я обучил CNN каждому типу карт. Комбинированный классификатор затем всегда выбирает правильный CNN для входного изображения в зависимости от типа карты, которая передается вместе с ним.

Оказалось, что CNN для каждого типа карт действительно дает лучшие результаты. С этого момента я всегда тренировал CNN для каждого типа карт, и следующие тесты используют эту модель в качестве базовой.

Вес

Я попытался повысить производительность, используя больше карт функций в сверточных слоях. Я перешел от слоя c1 = 20, слоя c2 = 50 карт объектов до c1 = 120, c2 = 150 карт объектов, используя размер шага в 20 дополнительных карт за один тестовый прогон. На самом деле это не улучшило счет F1, но значительно увеличило время тренировки. Поэтому я посчитал это неудачным.

Количество образцов для обучения

Следующее, что я хотел знать, это сколько изображений мне нужно на цифру для одного типа карточки клиента. График показывает, что около 1020 изображений наклон начинает замедляться. Поэтому я считаю 1020 изображений минимальным количеством изображений на цифру, которое следует использовать при обучении CNN.

Количество исходных изображений, использованных для увеличения

Поскольку общее количество изображений влияет на результат, мне было интересно, как количество исходных изображений, используемых для увеличения, влияет на результаты. Можно ли использовать только одно изображение и создать 519 искусственных копий или лучше использовать 10 исходных изображений и создать 51 искусственную копию каждого?

Ответ неудивителен: чем больше исходных данных, тем лучше. Расширение не является подходящим ярлыком для сбора исходных данных.

Стратегии расширения

Я проверил, какие стратегии увеличения дали лучший результат в F1. Это означает, что я перепробовал все комбинации. Сначала я попробовал отдельные стратегии, затем две стратегии в паре, затем три вместе и, наконец, все стратегии вместе.

В результате получилось 15 CNN, каждая из которых была обучена на немного разных данных. Результаты показывают, что яркость и смещение имеют наибольшее влияние на результаты.

Ансамбль из нескольких CNN

А теперь давай сойдем с ума! Что произойдет, если я не просто тренирую CNN специально для каждого провайдера, но тренирую несколько CNN для каждого провайдера и позволяю им принимать решение большинством голосов?

Я подумал, что вполне возможно, что оценка F1 улучшится, если я использую несколько иначе обученные CNN и позволю им проголосовать. Я использовал 15 сетей, которые тренировал для каждого типа карт, при оценке стратегий увеличения, и объединил их в ансамбль. Каждый из 15 классификаторов предсказывает класс для входного изображения, а затем большинством голосов мы принимаем решение по результатам всех классификаторов.

Ансамбль из нескольких CNN немного лучше, чем один CNN, и дает лучший результат, который я измерил в целом. Последняя система достигает отзыва 0,906 по отдельным цифрам.

Резюме

В заключение, вот что я узнал во время этого проекта:

  • Реализация Tesseract LSTM является многообещающей, но в настоящее время отсутствует простой способ ограничить алфавит результатов.
  • Индивидуально обученный CNN для каждого поставщика карт превосходит универсальный подход
  • Ансамблевое обучение с несколькими CNN для каждого поставщика карт дает еще лучшие результаты
  • Полезно увеличение, особенно яркость и вариации смещения
  • Чем больше обучающих данных, тем лучше результаты, качество данных важнее количества.

Outlook

Хотя результаты ясно показывают, что CNN полезны для классификации цифр, еще многое предстоит сделать. Цифровой классификатор должен быть интегрирован в общий конвейер распознавания номеров карт. Этот конвейер должен решать такие проблемы, как поиск области номера клиента внутри изображения карты и сегментирование отдельных цифр. Эти сегментированные цифры затем можно передать классификатору цифр, описанному в этой статье.

После распознавания номера также целесообразно реализовать этап постобработки, который проверяет правильность номера карты.

Как видите, еще есть возможности для работы в будущем. Если вам понравился этот пост, я рекомендую заглянуть на страницу вакансий Stocard. Кто знает, может быть, вы будете следующим, кто опубликует в блоге сообщение о вашей работе в Stocard!

Спасибо за чтение :-)