На хабре уже есть множество статей, посвященных распознаванию образов методами обучения машин, таких как нейронные сети, машины опорных векторов, случайные деревья. Все они требуют значительного количества примеров для обучения и настройки параметров. Создание обучающей и тестовой баз изображений адекватного объема для них — весьма нетривиальная задача. Причем речь идет не о технических трудностях сбора и хранения миллиона изображений, а об извечной ситуации, когда на первом этапе разработки системы у вас есть полторы картинки. Кроме того, следует понимать, что состав обучающей базы может влиять на качество получающейся системы распознавания больше, чем все остальные факторы. Несмотря на это, в большинстве статей этот немаловажный этап разработки полностью опущен.

Если вам интересно узнать про все это — добро пожаловать под кат.

Перед созданием базы примеров изображений и обучением нейронной сети необходимо конкретизировать техническую задачу. Понятно, что распознавание рукописного текста, эмоций человеческого лица или определение местоположения по фотографии — совершенно различные задачи. Также ясно, что на архитектуру используемой нейронной сети повлияет выбор платформы: в “облаке”, на ПК, на мобильном устройстве — доступные вычислительные ресурсы различаются на порядки.

Дальше становится интереснее. Распознавание изображений, полученных с фотокамер высокого разрешения, или размытых изображений с веб камеры без автофокуса потребуют совершенно различных данных для обучения, тестирования и валидации. Об этом нам намекают “теоремы об отсутствии бесплатных данных”. Именно поэтому свободно распространяемые обучающие базы изображений (например, [1, 2, 3]), отлично подходят для академических исследований, но почти всегда неприменимы в реальных задачах вследствие своей «обобщенности».

Чем точнее обучающая выборка аппроксимирует генеральную совокупность изображений, которые будут поступать на вход вашей системе, тем выше будет предельно достижимое качество результата. Получается, что правильно составленная обучающая выборка — это и есть предельно конкретизированное техническое задание! Например, если мы хотим распознавать печатные символы на фотографии, сделанной мобильным устройством, то база примеров должна содержать фотографии документов из разных источников с различным освещением, сделанные с разных моделей телефонов и камер. Все это усложняет сбор необходимого числа примеров для обучения распознавателя.

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

Создание обучающих примеров из естественных изображений.

Примеры для обучения из естественных изображений создаются на основе реальных данных. Их создание состоит из следующих этапов:
  1. Сбор графических данных (фотографирование интересующих объектов, снятие видеопотока с камеры, выделение части изображения на интернет странице).
  2. Фильтрация — проверка изображений на ряд требований: достаточный уровень освещенности объектов на них, наличие необходимого объекта и т. д.
  3. Подготовка инструментария для разметки (написание собственного или оптимизация готового).
  4. Разметка (выделение четырехугольников, необходимых знакомест, интересующих областей изображения).
  5. Присвоение каждому изображению метки (буква или название объекта на изображении).

Эти операции требуют значительных затрат рабочего времени, и, соответственно, подобный способ создания обучающий базы весьма дорог. К тому же собирать данные необходимо в различных условиях — освещение, модели телефонов, камер, с которых происходит съемка, различные источники документов (типографии), и т. д.
Все это усложняет сбор необходимого числа примеров для обучения распознавателя. С другой стороны, по результатам обучения системы на таких данных можно судить об её эффективности в реальных условиях.

Создание обучающих примеров из искусственных изображений.

Другой подход к созданию обучающих данных — их искусственная генерация. Можно взять несколько шаблонов / «идеальных» примеров (например, наборов шрифтов) и с помощью различных искажений создать необходимое число примеров для обучения. Можно использовать следующие искажения:
  1. Геометрические (афинные, проективные, ...).
  2. Яркостные/цветовые.
  3. Замена фона.
  4. Искажения, характерные для решаемой задачи: блики, шумы, размытие и т. д.

Примеры искажений изображений для задачи распознавания символов:
Сдвиги:

Повороты:

Дополнительные линии на изображениях:

Блики:

Дефокус:

Сжатия и растяжения вдоль осей:


Генерировать искажения можно с помощью библиотек для работы с изображениями [1, 2, 3] или специальных программ, которые позволяют создавать целые искусственные документы или объекты.

Такой подход не требует большого количества человеческих ресурсов и сравнительно дешев, поскольку не требует разметки и сбора данных — весь процесс создания базы изображений определяется выбором алгоритма и параметров.
Главным минусом подобного метода является слабая связь качества работы системы на сгенерированных данных с качеством работы в реальных условиях. Кроме того, метод требует больших вычислительных мощностей для создания необходимого числа примеров. Выбор искажений, используемых при создания базы для конкретной задачи, также составляет определенную сложность.
Ниже приведен пример создания полностью искусственной базы.

Первоначальный набор изображений символов шрифта:


Примеры фонов:








Примеры изображений без искажений:


Добавление небольших искажений:


Создание искусственных обучающих примеров, сгенерированных на основе естественных изображений.

Логичным продолжением предыдущего метода является генерация искусственных примеров с использованием реальных данных вместо шаблонов и первоначальных «идеальных» примеров. Добавляя искажения, можно добиться существенного улучшения работы системы распознавания. Для того чтобы понять, какие именно искажения следует применять, часть реальных данных стоит использовать для валидации. По ним можно оценивать наиболее часто встречающиеся типы ошибок и добавлять изображения с соответствующими искажениями в обучающую базу.

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

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

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

Попробуем создать нейронную сеть на изображениях символов MRZ. Машинно-читаемой зоной (MRZ — Machine-Readable Zone) называют часть документа, удостоверяющего личность, выполненную согласно международным рекомендациям, закрепленным в документе Doc 9303 — Machine Readable Travel Documents Международной Организации Гражданской Авиации. Подробнее про проблемы распознавания MRZ можно прочитать в другой нашей статье.

Пример MRZ:


MRZ содержит 88 символов. Будем использовать 2 характеристики качества работы системы:
  • процент ошибочно распознанных символов.
  • процент полностью правильно распознанных зон (MRZ считается полностью правильно распознанной, если все символы в ней распознаны правильно).

В дальнейшем нейронную сеть предполагается использовать на мобильных устройствах, где вычислительные мощности ограничены, поэтому используемые сетки будут иметь относительно небольшое число слоев и весов.
Для экспериментов было собрано 800'000 примеров символов, которые были разбиты на 3 группы: 200'000 примеров на обучение, 300'000 примеров на валидацию и 300'000 примеров на тестирование. Подобное разбиение неестественно, поскольку большая часть примеров “пропадает впустую” (валидация и тестирование), но позволяет наилучшим образом показать преимущества и недостатки различных методов.
Для тестовой выборки распределение примеров различных классов близко к реальному и выглядит следующим образом:
Название класса (символ): число примеров
0: 22416 1: 17602 2: 13746 3: 8115 4: 8587 5: 9383 6: 8697 7: 8082 8: 9734 9: 8847
<: 110438 A: 12022 B: 1834 C: 3891 D: 2952 E: 7349 F: 3282 G: 2169 H: 3309 I: 6737
J: 934 K: 2702 L: 4989 M: 6244 N: 7897 O: 4515 P: 4944 Q: 109 R: 7717 S: 5499 T: 3730
U: 4224 V: 3117 W: 744 X: 331 Y: 1834 Z: 1246

При обучении только на естественных примерах средняя посимвольная величина ошибки по 25 экспериментам составила 0,25%, т.е. общее число неправильно распознанных символов составило 750 изображений из 300000. Для практического применения подобное качество неприемлемо, поскольку число правильно распознанных зон в таком случае составляет 80%.

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


Можно выделить следующие типы ошибок:
  • Ошибки на нецентрированных изображениях.
  • Ошибки на повернутых изображениях.
  • Ошибки на изображениях с линиями.
  • Ошибки на изображениях с бликами.
  • Ошибки в сложных случаях.

Таблица наиболее частых ошибок:
(формат Оригинальный символ, число ошибок, с какими символами сеть чаще всего путает данный символ и сколько раз)
Оригинальный символ: ’0’, число ошибок: 437
’O’: 419, ’U’: 5, ’J’: 4, ’2’: 2, ’1’: 1
Оригинальный символ: ’<’, число ошибок: 71
’2’: 29, ’K’: 6, ’P’: 6, ’4’: 4, ’6’: 4
Оригинальный символ: ’8’, число ошибок: 35
’B’: 10, ’6’: 10, ’D’: 4, ’E’: 2, ’M’: 2
Оригинальный символ: ’O’, число ошибок: 20
’0’: 19, ’Q’: 1
Оригинальный символ: ’4’, число ошибок: 19
’6’: 5, ’N’: 3, ’?’: 2, ’A’: 1, ’D’: 1
Оригинальный символ: ’6’, число ошибок: 18
’G’: 4, ’S’: 4, ’D’: 3, ’O’: 2, ’4’: 2
Оригинальный символ: ’1’, число ошибок: 17
’T’: 6, ’Y’: 5, ’7’: 2, ’3’: 1, ’6’: 1
Оригинальный символ: ’L’, число ошибок: 14
’I’: 9, ’4’: 4, ’C’: 1
Оригинальный символ: ’M’, число ошибок: 14
’H’: 7, ’P’: 5, ’3’: 1, ’N’: 1
Оригинальный символ: ’E’, число ошибок: 14
’C’: 5, ’I’: 3, ’B’: 2, ’F’: 2, ’A’: 1

Будем постепенно добавлять различные виды искажений, соответствующие наиболее распространенным типам ошибок, в обучающую выборку. Число добавленных «искаженных» изображений необходимо варьировать и подбирать, основываясь на обратном отклике валидационной выборки.

Действуем по следующей схеме:

Например, для данной задачи было сделано следующее:
  1. Добавление искажения типа “сдвиг”, соответствующего ошибке на “нецентрированных” изображения.
  2. Проведение серии экспериментов: обучение нескольких нейронных сетей.
  3. Оценка качества на тестовой выборке. Качество распознавания MRZ увеличилось на 9%.
  4. Анализ наиболее частых ошибок распознавания на валидационной выборке.
  5. Добавление изображений с дополнительными линиями в обучающую базу.
  6. Снова проведение серии экспериментов.
  7. Тестирование. Качество распознавания MRZ на тестовой выборке возросло на 3.5%.

Подобные “итерации” можно проводить многократно — до достижения необходимого качества или до тех пор, пока качество не перестает расти.
Таким способом, было получено качество распознавания в 94,5% правильно распознанных зон. Используя постобработку (марковские модели, конечные автоматы, N-граммные и словарные методы и т.д.), можно получить дальнейшее увеличения качества.

При использовании обучения только на искусственных данных в рассматриваемой задаче удалось достичь только качества в 81,72% правильно распознанных зон, при этом основная проблема — сложность подбора параметров искажений.
Тип данных для обучения Процент правильно распознанных MRZ Посимвольная ошибка
Естественные изображения 80,78% 0,253%
Естественные изображения + изображения со сдвигами 89,68% 0.13%
+изображения с дополнительными линиями 93,19% 0.1%
+повернутые изображения 95,50% 0.055%
Искусственные изображения 78,53% 0.29%

Заключение.

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

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


  1. SKolotienko
    13.08.2015 16:02

    А насколько отличались размеры полученных обучающих выборок и насколько медленнее происходило обучение в зависимости от аугментации?


  1. SmartEngines
    13.08.2015 17:20

    Размер обучающей выборки возрастает на 20% при добавлении всех типов искажений, время обучения в среднем возрастает на 30%.


  1. ServPonomarev
    14.08.2015 07:32

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


    1. SmartEngines
      14.08.2015 17:35

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


  1. ternaus
    16.08.2015 08:48

    1. Мне всегда нравилось в качестве одного из преобразований использовать отражение, для симметричных объектов. Типа цифры 8 или 0.
    2. Как показывает эксперимент, радувать обучающую выборку саму по себе неправильно. В том смысле, что вычиcлительных мощностей сразу требуется много, а вот профит маленький. C тем же результатом можно заниматься аугументацией данных прямо во время тренировки модели. И точность повышается и помогает боросться с переобучаемостью, и по времени то же самое. (На одной итерации подаётся изображение, а на следующей это изображение уже повёрнуто, отражено или растянуто.) Примеры:
    3. Аугементация данных — это, безусловно, важно. Но распознавание изображений, это одна из областей, где алгоритмы, сами по себе, уже круты неимоверно. Вы бы не могли бы проверить, ваш подход, на Digit recognizer. Тут надо распознать цифры с широко известного в узких кругах data set MNIST. Прямо их коробки, простенькая cNN мне выдала точность 99%. Достаточно много статей про различные подходу к этим данным, и модель, котора обладает максимальной точностью, что-то в районе 98.8%. Это я к тому, что во многих задачах Нейронные сети со сложной архитекторой замечательно справляются и без дополнительных ухищрений.
    4. Меня всегда интересовало, как можно делать аугументирвоание исходных данных, на задачах, которые к изображениям не относятся, пусть будут данные, которые предостваляет страхования компания, чтобы предсказать, кого надо страховать, а кого невыгодно(набор численных и категорийных данных). Не подскажите ссылку на книжку/ссылку/статью?


    1. ternaus
      16.08.2015 08:53

      Маленькая поправка. «модель, котора обладает максимальной точностью, что-то в районе 98.8%.» следует читать как "… 99.8%"


    1. mrgloom
      16.08.2015 18:33

      Есть нечто похожее когда люди работают с unbalanced dataset'ами, один из вариантов как с ними бороться это oversampling
      www.slideshare.net/dalpozz/racing-for-unbalanced-methods-selection
      алгоритм SMOTE генерирует синтетические примеры.


    1. SmartEngines
      18.08.2015 18:42

      1. Вы правы.
      2. Нам не ясно, что значит «неправильно», и какой эксперимент это показывает. Вычислительные мощности, очевидно, не зависят от порядка применения операций (далее вы сами, противореча себе, написали "… и по времени то же самое"). Размер профита в нашем случае опубликован, статья ровно об этом. Какая цифра вам показалась слишком маленькой? Заранее сделать аугментацию, как мы предлагаем, это (-) потратить много места на диске, (+) получить возможность архивирования удачного варианта раздутия, (+) возможность передать выборку согласно договору, не раскрывая алгоритмов ее создания. Но наша статья — не об этом, а о «профите» от собственно аугментации, вне зависимости от того, на каком этапе она производится.
      3. Насколько нам подсказали наши эксперты, большинство победителей (если не все из них) последних лет на MNIST-e использовали раздутие обучающей выборки. Что бы нового мы могли сообщить об этом? В данной публикации мы не предлагаем никакого распознающего алгоритма, мы сосредоточены на выборке. И аугментация, конечно же, известный подход. Нашей целью было показать, насколько хорошо или плохо он работает. При этом раздутие на рукописных символах, очевидно, иное, чем на печатных. Для ниста обычно используются деформации сглаженным случайным полем смещений.
      4. Нам тоже интересно, но, к сожалению, мы не являемся специалистами в этой области.


      1. ternaus
        19.08.2015 22:53

        Нам не ясно, что значит «неправильно», и какой эксперимент это показывает. Вычислительные мощности, очевидно, не зависят от порядка применения операций (далее вы сами, противореча себе, написали "… и по времени то же самое"). Размер профита в нашем случае опубликован, статья ровно об этом. Какая цифра вам показалась слишком маленькой?


        Прошу прощения, я неточно выразился. Имелось в виду вот что:

        Пусть мы хотим увеличить точность нашей модели. И у нас есть исходные данные размера X. Мы хотим увеличить размер данных, добавив правильного шума. И тут, как я понимаю, есть два подхода:
        1. Давайте слегка повернём каждую цифру. Скажем, градусов на 1-10 по и против часовой стрелки. Итого, теперь у нас не X, а X * 21. А давайте теперь каждую из полученных цифр сдвинем влево, вправо, вверх, вниз, пикселей на 1-5. И рамер наших данных сразу X * 21(повороты) * 21(трансляция). Точность нейронной сети, да и любого алгоритма натренированных на этих данных выше, чем натренированных на исходных X. Но в силу того, что размер увеличился более, чем в 400 раз, то и время тренировки существенно увеличится. А ведь можно ещё эти цифры порастягивать, поотражать. Поворачивать на большие или на нецелые углы. Посдвигать не на 5, а на большее число пикселей. Добавить отражений. Поиграть с контрастом. И т.д. В общем мощность множества группы преобразований, а месте с ней и размер обучающих данных очень быстро растёт./li>
          Но можно сделать так: на каждой тренировочной итерации для нейронной сети для каждой(или для случайно выбранной) цифры мы будем применять случайное преобразование из этой группы преобразований, описанных в первом пункте. То есть, с одной стороны наша обучающая выборка не раздувается в миллион раз, её размер остаётся прежним, но на каждой обучающей итерации мы добавляем шум, который увеличивает точность нейронной сети, а заодно слегка помогает от переобучаения. Да, время тренировки также увеличивается, всилу того, что эти преобразования надо осуществлять в реальном времени, но это занимает не так много времени.


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


        1. SmartEngines
          20.08.2015 13:38

          Если Вы посмотрите наш предыдущий комментарий, то увидите, что в примере, мы увеличиваем выборку всего на 20% при добавлении всех типов искажений. 400 — кратного увеличения выборки никто применять не призывает. Отличие нашего метода от описанного Вами второго подхода лишь в том, что мы осуществляем предварительную аугментацию данных. Это позволяет оптимизировать проведение несколько одновременных экспериментов по обучению сетей и эффективно использовать аппаратные ресурсы. К тому же мы не разу не говорили о применении случайных преобразований при создании данных. Применение случайных искажений, а в особенности их комбинаций, сильно усложняет задачу обучения нейронной сети и далеко не всегда приводит к уменьшению ошибки на тестовой выборке.


  1. mrgloom
    16.08.2015 18:29

    Пример обучения на искусственно сгенерированных данных:
    graphics.cs.msu.ru/ru/research/projects/imagerecognition/trafficsign
    Пример data augumentation на mnist (mnist8m (infinite MNIST dataset)):
    leon.bottou.org/papers/loosli-canu-bottou-2006

    Кстати какие есть готовые тулзы для разметки данных?