close

Вход

Забыли?

вход по аккаунту

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

код для вставки
АННОТАЦИЯ
ВКР 104 с., 32 рис., 3 табл., 24 источника.
СЕГМЕНТАЦИЯ,
ОПТИЧЕСКОЕ
РАСПОЗНАВАНИЕ
СИМВОЛОВ,
ПЕРСЕПТРОН, РЕКУРРЕНТНАЯ НЕЙРОННАЯ СЕТЬ, ОБУЧЕНИЕ, ANDROID
STUDIO.
Выпускная квалификационная работа посвящена разработке системы
распознаванию печатных символов в растровом изображении.
Выпускная квалификационная работа состоит из введения, четырех глав,
заключения, списка литературы и приложения А.
В первой главе проводится обзор предметной, описываются современные и
распространенные приложения по оптическому распознаванию символов, методы
распознавания символов и механизм обработки изображений.
Во второй главе исследуются проектирование системы, выбирается
рекуррентная нейронная сеть для распознавания символов, строются алгоритмы
работы и диаграммы состояний, классов, деятельности, вариантов использования
системы.
В третьей главе описывается реализация системы, выбирается среда
разработки Android Studio и возможности настройки мобильного приложения.
В четвертой главе проводятся результаты работы мобильного приложения в
различное время суток и с разными мобильными устройствами.
В заключении сделаны основные выводы по выпускной квалификационной
работе.
4
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1
ОБЗОР ПРЕДМЕТНОЙ ОБЛАСТИ
8
1.1
Оптическое распознавание символов
8
1.2
Обзор приложений по оптическому распознаванию символов
8
1.2.1
Abbyy FineReader
9
1.2.2
CuneiForm
9
1.2.3
OCRopus
10
1.2.4
Tesseract
11
1.2.5
Выявленные недостатки приложений
11
1.3
Основные трудности распознавания символов
Обработка изображения
1.3.1
12
13
1.3.2
Основы фильтрации изображений
15
1.3.3
Сегментация
18
1.3.4
Метод обнаружения линий
21
1.3.5
Распознавание поврежденных символов
22
1.3.6
Статический и адаптивный классификатор символов
23
1.4
Методы распознавания символов
24
1.4.1
Структурные методы
25
1.4.2
Шаблонные методы
26
1.4.3
Признаковые методы
27
1.4.4
Нейросетевые методы
28
1.5
2
6
Выводы к первой главе
ПРОЕКТИРОВАНИЕ СИСТЕМЫ
2.1
Рекуррентная нейронная сеть
2.1.1
Персептрон
28
29
29
35
5
3
4
2.1.1.1 Классификация перцептронов
37
2.1.1.2 Обучение перцептронов
38
2.1.1.3 Обучение с пощрением
39
2.1.1.4 Обучение без поощрения
40
2.1.1.5 Метод обратного распространения ошибки
40
2.2
Диаграмма вариантов использования системы
41
2.3
Диаграмма деятельности системы
44
2.4
Диаграмма классов системы
47
2.5
Диаграмма компонентов системы
50
2.6
Логика диалога с пользователем
52
2.7
Алгоритм работы системы распознавания символов
54
2.8
Алгоритм сегментации символов
55
2.9
Выводы по второй главе
56
РЕАЛИЗАЦИЯ СИСТЕМЫ
58
3.1
Создание проекта в Android Studio
58
3.2
Интерфейс мобильного приложения
61
3.3
Настройки мобильного приложения
66
3.4
Выводы по третьей главе
71
ПРАКТИЧЕСКИЕ РЕЗУЛЬТАТЫ РАБОТЫ ПРИЛОЖЕНИЯ
72
ЗАКЛЮЧЕНИЕ
78
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
79
Приложение А
81
УДОСТОВЕРЯЮЩИЙ ЛИСТ
102
ИНФОРМАЦИОННО-ПОИСКОВАЯ ХАРАКТЕРИСТИКА
103
6
ВВЕДЕНИЕ
В настоящее время компьютеризация в нашем обществе растет очень быстро
и играет очень важную роль в повседневной деятельности человека. С помощью
компьютерных технологий в настоящее время предпринимаются попытки
автоматизировать широкий спектр процессов, которые в недавнем прошлом были
поставлены на умственные способности человека, поскольку информационные
технологии используются повсеместно, поэтому программисты во всем мире
разрабатывают новые и совершенствуют уже зарекомендовавшие себя на практике
алгоритмы автоматизации рутинных процессов
Одной из актуальных проблем на данный момент является неэффективная
работа
различных
государственных
организаций,
таких
как
городские
поликлиники, различные бухгалтерские организации, поскольку все делается
вручную. Каждая форма заполняется собственноручно, и если нужно ввести какуюлибо информацию в базу данных, эта задача выполняется самим оператором.
Автоматизация процесса передачи информации из бумажных документов в
электронную форму теперь актуальна практически во всех государственных и
коммерческих организациях. Кроме того, решение этой проблемы является
важным аспектом безопасности и контроля, поскольку малейшая ошибка при вводе
данных может быть дорогостоящей. Избежать этого можно, используя
программное обеспечение, позволяющее автоматизировать данный процесс. Он
может использоваться в различных областях работы, связанных с обработкой
документов. Современные информационные разработки позволяют значительно
облегчить доступ к необходимым информационным ресурсам из любой точки мира
при условии наличия их электронной версии.
В настоящее время существует довольно много оптических систем
распознавания символов, но, к сожалению, не все из них являются действительно
высококачественными продуктами. Таким образом, программы OCR «низкого
уровня» переводят текст на бумаге в набор символов, а затем предлагают
самостоятельно разобраться с тем, что получилось. Системы, которые имеют
7
высокую скорость и точность распознавания, обычно очень дороги, что делает их
практически недоступными для реализации и практического использования в
массовом масштабе.
Объектом исследования в этом случае являются алгоритмы распознавания
символов, а предметом исследования является система оптического распознавания
символов из изображений.
Цель работы: разработка системы распознавания печатных символов в
растровом изображении за счет комбинирования методов предварительной
обработки с использованием библиотеки компьютерного зрения OpenCV.
Для достижения цели в ходе итоговой квалификационной работы были
поставлены следующие задачи:
1. Изучение и анализ существующих методов распознавания печатных
символов и программных решений на основе этих методов для выявления их
недостатков.
2. Рассмотреть
существующие
программные
средства
для
создания
оптической системы распознавания символов.
3. Сравните в ходе экспериментов различные «движки» для распознавания
символов с изображений.
4. Реализовать рабочий прототип приложения.
8
1 ОБЗОР ПРЕДМЕТНОЙ ОБЛАСТИ
1.1 Оптическое распознавание символов
Оптическое
механический
распознавание
или
электронный
символов
(OCR)
перевод
представляет
изображений
собой
рукописного,
машинописного или печатного текста в последовательность кодов, используемых
для представления в текстовом редакторе. Оптическое распознавание имеет
широкие границы применения: для преобразования книг и документов в
электронный формат, для автоматизации учетных систем в бизнесе или для
публикации текста на веб-странице. Над преобразованием в электронную форму с
помощью
оптического
распознавания
текстом
можно
делать
несколько
манипуляций: редактировать, искать слова или фразы, хранить их в более
компактной форме, демонстрировать или распечатывать материал, не теряя
качества, анализировать информацию, а также применять к тексту электронный
перевод, форматирование или преобразование в речь с использованием
соответствующего программного обеспечения. Оптическое распознавание текста это прогрессирующая и активно исследуемая проблема, неразрывно связанная с
распознаванием изображений, речи и компьютерного зрения.
Первые системы распознавания оптического текста требовали постоянной
калибровки для работы с каждым конкретным шрифтом в ранних версиях для
распознавания было необходимо изображение каждого символа. Программа могла
одновременно работать только с одним шрифтом. В последнее время широко
используются «интеллектуальные» системы, которые с высокой степенью
точности способны распознавать большинство известных шрифтов. Следующим
этапом стало появление систем, способных не только распознавать текст с
достаточной точностью, но и восстанавливать исходное форматирование, включая
столбцы, таблицы и другие простые графические компоненты.
1.2 Обзор приложений по оптическому распознаванию символов
На данный момент есть готовые программные решения для оптического
9
распознавания символов.
В этом разделе будет рассмотрено решение безусловного лидера в этой
области ИТ-технологий ABBYY: Abbyy FineReader, а также некоторые небольшие
приложения для преобразования печатных символов в электронную версию,
основанных на собственных “движках” распознавания.
1.2.1 Abbyy FineReader
FineReader - это коммерческий продукт для оптического распознавания
символов, разработанный российской компанией ABBYY и является бесспорным
лидером в области оптического распознавания символов. Основой FineReader
является запатентованная технология оптического распознавания символов
ABBYY OCR, лицензированная такими мировыми гигантами, как Fujitsu,
Panasonic, Xerox и Samsung. Программа позволяет переводить изображения
печатных документов в различные электронные редактируемые форматы. Начиная
с 12 версии, он поддерживает распознавание текста на 190 языках, имеет
встроенную орфографию для 48 из них, способен сохранять исходное
форматирование документа, имеет большой набор функций для предварительной
обработки изображений, позволяет настраивать различные параметры. Но главным
его преимуществом является почти безупречная точность распознавания. Согласно
некоторой информации, после тщательного обучения система может распознать
рукописный текст, но его нужно будет обучать почерком каждого конкретного
пользователя. На данный момент программа насчитывает более 20 миллионов
пользователей по всему миру.
Выявленные плюсы приложения:
− легкость освоения и простота работы;
− чтение текстов со сложным графическим оформлением;
− поддержка многих языков и мультифункциональность.
1.2.2 CuneiForm
CuneiForm - система оптического распознавания текста, разработанная
10
российской компании CognitiveTechnologies. Первоначально программа CuneiForm
была разработана как коммерческий продукт и поставляется с некоторыми
моделями сканера. Однако после нескольких лет перерыва в развитии, 12 декабря
2007 года было объявлено об открытии исходного кода программы, которое
состоялось 2 апреля 2008 года. На данный момент CuneiForm позиционируется как
независимый от шрифта систему для преобразования электронных копий
бумажных документов и графических файлов в редактируемый вид, с
возможностью сохранения структуры и шрифтов исходного документа в
автоматическом или полуавтоматическом режиме. Система включает в себя две
программы для однократной и пакетной обработки электронных документов.
Выявленные плюсы приложения:
− бесплатная версия программы;
− текст корректируется для точности с помощью словарей;
− расшифровывает любые изображения, даже некачественные;
− сохраняет структуру документа, даже его форматирование.
1.2.3 OCRopus
CRopus - это оптическая система распознавания символов, первоначально
направленная на преобразование большого количества документов в электронную
форму на основе собственного ядра распознавания, начиная с версии 0.4. Этот
программный пакет для распознавания текста, разрабатываемый на принципах
OpenSource и распространяемый по лицензии ApacheLicense 2.0. Программа
позволяет подключать дополнительные модули для анализа компоновки
содержимого,
предварительного
улучшения
изображения.
Согласно
идее
разработчиков, с помощью OCRopus можно будет последовательно создавать
текстовое содержимое на графических файлах и переводить его в текстовый
формат для дальнейшего редактирования. Помимо печатного текста программа
сможет распознавать и писать рукописные материалы. Начиная с альфа-релиза,
OCRopus
использует
код
языка
моделирования
из
другого
проекта,
поддерживаемого Google - OpenFST. OCRopus в настоящее время доступен только
11
для GNU / Linux. В настоящее время OCRopus использует только интерфейс
командной строки, принимает инструкции для ввода изображений с текстом и
выводит данные в формате hOCR (открытый формат на основе HTML), TXT.
Выявленные плюсы приложения:
− разделение входного изображения на текст и графику;
− высокая точность распознавания.
1.2.4 Tesseract
Tesseract - система с собственным “движком” распознавания, является
свободно распространяемой программой распознавания текста, разработанной
компанией Hewlett-Packard с середины 1980-х до середины 1990-х годов, а затем
была приостановлена на 10 лет. В августе 2006 года компания Google купила ее и
открыла исходный код под лицензией Apache 2.0, чтобы продолжить работу над
перспективным проектом. В настоящий момент программа работает с UTF-8,
языковая поддержка (в том числе русская версия 3.0) реализуется путем установки
и настройки дополнительных модулей. Использует интерфейс командной строки.
Начиная с версии 3.04, выпущенной в 2015 году.
Выявленные плюсы приложения:
− работает с более чем 100 языками;
− высокая точность распознавания.
1.2.5 Выявленные недостатки приложений
После рассмотрения четырех наиболее примечательных приложений по
распознаванию символов, были сделаны следующие выводы:
1. Многие из приложений обладают не вполне интуитивно понятным
интерфейсом и слишком большим числом функций, что иногда может оказаться
недостатком.
2. Приложения не способны работать в фоновом режиме, кроме FineReader
(добавлено в последней версии 12).
3. Не у всех имеется возможность предварительной обработки изображения
12
с целью улучшения качества.
4. Отсутствие графического интерфейса пользователя у некоторых решений.
5. Ни одна из программ не демонстрирует 100% результата и идеального
сохранения форматирования.
1.3 Основные трудности распознавания символов
Существуют различные проблемы, связанные с распознаванием символов.
Наиболее значимыми являются следующие:
1. Различные языки, символы и способы их отображения. Многие языки
имеют похожие буквы: «N» и «I», «R» и «I» и т. д. На каждом языке есть символы,
которые имеют сходные функции друг с другом и номера. Например, на русском
языке: «M», «H», «I» и «O» и «0» и т. д.
2. Искажение изображений символов. Причины могут быть разными. Из
минимальных проблем, связанных с исходным изображением, заканчивая
дефектом самого источника.
3. В случае обработки персональных данных проблемы могут быть вызваны
системами защиты источника изображения. В случае с паспортами это невидимые
символы.
4. Разнообразные изменения размера и масштаба символов. Каждый
отдельный символ может быть написан с использованием разных шрифтов, как
стандартных (Times, Orator, Arial), так и различных шрифтов, используемых,
например, в пределах одной страны, для оформления тех же документов.
Искажения цифровых изображений текстовых символов могут быть вызваны
следующими причинами:
1. Шум печати, в частности, “непропечатывания” (разрывами слитных черт
символов), «склеивание» соседних символов, пятен и ложных точек на фоне
символов и т. д.
2. Смещением символов или частей символов относительно их ожидаемого
положения в строке.
3. Изменение наклона символов.
13
4. Искажение формы символа за счет оцифровки изображения с помощью
«грубым» сканированием.
5. Эффекты освещения (тени, блики и т. Д.) При съемке с камерой.
Многие системы распознавания показывают наилучшие результаты при
обработке черного текста на светлом фоне. В случае текстовых документов - это не
критично. Но если использовать такую систему для обработки нестандартных
изображений:
сканирование
паспортов,
водительских
удостоверений,
автомобильных номерных знаков, тогда мы столкнемся с невозможностью
получить правильные данные без предварительной обработки изображений.
Многие из описанных выше проблем можно устранить на этапе
предварительной обработки (1, 2, 3).
Система оптического распознавания символов (OCR) должна: выбирать
текстовые области на цифровом изображении, выбирать в них отдельные строки,
затем выделять символы, распознавать эти символы и быть нечувствительно к
методу компоновки, расстояние между строками и другими параметрами печати.
1.3.1 Обработка изображения
Бинаризация изображения - это процесс преобразования изображения,
состоящего из градации одного цвета (в нашем случае, серого) в двоичное
изображение, т. е. изображение, в котором каждый пиксель может иметь только два
цвета (в нашем случае это черно-белый). В результате этого преобразования цвет
пикселя обычно считается равным нулю или единице, тогда как пиксели с нулевым
значением (в данном случае белые пиксели) называются фоном, а пиксели со
значением одного (черного) являются называемый передним планом. Но бинарное
изображение, полученное в результате такого преобразования, искажается по
сравнению с оригиналом, которое характеризуется появлением разрывов и
размывов на объектах, появлением шумов изображения в однородных областях и
потерей целостности структуры объектов.
Все методы бинаризации делятся на два типа: методы глобальных и
локальных пороговых значений. В глобальных методах обработки пороговая
14
поверхность представляет собой плоскость с постоянным порогом яркости, то есть
пороговое значение рассчитывается из анализа гистограммы всего изображения и
одинаково для всех пикселей исходного изображения. Глобальное пороговое
значение имеет значительный недостаток - если исходное изображение имеет
неоднородное
освещение
области,
которые
не
освещены
полностью
-
классифицируются как передний план. В методах локального порогового значения
пороговое значение изменяется для каждой точки на основе некоторых атрибутов
области, принадлежащей некоторой окрестности данной точки. Недостатком
такого преобразования является низкая скорость работы алгоритмов, связанная с
пересчетом пороговых значений для каждой точки изображения.
Метод
Бернсена
основан
на
идее
сравнения
уровня
яркости
преобразованного пикселя со значениями локальных средних, вычисленных в его
окружении. Пиксели изображения обрабатываются поочередно, сравнивая их
интенсивность со средними значениями яркости в окнах с центрами в точках Pl (l
= 0, 1, .., 7) (рисунок 1).
Рисунок 1 - Преобразование пикселя
Если символ “1” означает элемент объекта, а “0” - элемент фона в
результирующем бинарном изображении, то значение преобразованного пикселя
(m, n) становится равным “1” тогда, когда для всех l = 0, 1, .., 7 выполняется условие
15
 = −(, ) > ,
 =
1
(+1)2

= ∑−≤,≤ f( + ,  + i)
(1)
(2)
где t - определенный параметр,
f ( ,  ) - яркость в точке  с координатами ( ,  ).
1.3.2 Основы фильтрации изображений
Изображения, полученные на выходе оптико-электронных преобразователей,
искажаются помехами. Это усложняет визуальный анализ изображений человекомоператором и их автоматическую компьютерную обработку. При обработке
изображений шум также является некоторыми областями самого изображения.
Например, при анализе объектов на сложном фоне - фон также является помехой.
При цифровой обработке изображений необходимо устранить геометрические
искажения изображений, подавлять шум различной природы, производить
коррекцию диафрагмы, так же затухание помех достигается фильтрацией.
Фильтрация изображения выполняется в пространственной и частотной
областях. При пространственной фильтрации изображений преобразование
выполняется непосредственно над значениями отсчетов изображений. Результатом
фильтрации является оценка полезного сигнала изображения. Изображение
представляет собой двумерную пространственную координатную функцию,
которая изменяется медленнее, чем двумерная функция, описывающая помехи.
Поэтому, оценивая полезный сигнал в каждой точке кадра, рассмотрим
окрестность этой точки (некоторый набор точек, примыкающих к ней), используя
общие характеристики сигнала в этой окрестности. В других случаях признаком
полезного сигнала являются резкие перепады яркости. Однако, как правило,
частота этих различий относительно мала, так что при больших интервалах между
ними сигнал либо постоянный, либо медленно изменяется. И в этом случае
свойства сигнала проявляются при наблюдении его не только в одной точке, но и
при анализе ее окрестности. Заметим, что понятие окрестности весьма условно.
16
Традиционная фильтрация в частотной области требует следующей
последовательности преобразований:
− двумерное дискретное преобразование изображения из пространственной
области в частотную область (например, с помощью дискретного преобразования
Фурье);
− преобразование дискретного спектра сигнала изображения;
− обратное
двумерное
дискретное
преобразование,
позволяющее
восстановить полезный сигнал изображения в пространственной области.
Задача состоит в том, чтобы найти вычислительную процедуру, которая
обеспечит наилучшие результаты. В этой задаче принято в целом полагаться на
использование вероятностных моделей изображения и помех, а также на
применение критериев статистической оптимальности.
На практике цифровое изображение широко используется для маскировки
маски. Его линейная версия является одним из вариантов двумерной фильтрации с
фильтром с конечной импульсной характеристикой (КИХ). В качестве маски
используется набор весов, определенный во всех точках окрестности S, обычно
симметрично окружающих текущую точку кадра.
Общим видом окрестности, часто используемым на практике, является
квадрат 3x3 с текущим элементом в центре. Применяйте разные маски, один из
эвристических вариантов - однородная маска, все девять весовых коэффициентов
которой равны 1/9. Этот выбор коэффициентов соответствует условию
поддержания средней яркости, в результате чего выходной сигнал вписывается в
диапазон входного сигнала.
Нелинейная пространственная фильтрация. В результате использования
линейных сглаживающих фильтров шум подавляется, но в то же время границы
между областями с разной амплитудой сигнала размыты. Для уменьшения
«размытости» границ были разработаны различные нелинейные фильтры. Как
линейные КИХ-фильтры, нелинейные фильтры работают в скользящем окне. Но
при линейной фильтрации рассчитывается линейная комбинация выборок сигнала,
17
а для нелинейной фильтрации нелинейные преобразования образцов сигналов
выполняются в окрестности элементов, определяемых фильтрующей маской.
Медиана фильтра (МФ) (предложенная Тьюки в 1974 г.) заменяет элемент
центральной маски средой упорядоченного образца, сформированного из всех
амплитуд выборок, покрытых фильтрующей маской.
При применении МФ каждая точка кадра обрабатывается последовательно, что
приводит к последовательности оценок. При медианной фильтрации используется
скользящее двумерное окно. В принципе, для каждого образца выполняется
независимая оценка медианы в окне. Для ускорения оценки целесообразно
использовать алгоритмические вычисления на каждом шаге. Размер окна
устанавливается нечетным и равным m x n. Пример окна или маски, изображен на
рисунке 2.
Рисунок 2 - Пример маска 3x3
Для простоты дальнейшего рассмотрения мы ограничимся примером
фильтра с квадратной маской размером nxn для n = 3. Скользящий фильтр
сканирует образцы изображений слева направо и сверху вниз, а входная
двухмерная последовательность также представляется в виде последовательного
числа выборок x(n) слева направо и сверху вниз. Из этой последовательности в
каждой текущей точке маску фильтра выделяет массив w(n) в качестве вектора Wэлемента, который в этом случае содержит все элементы из окна 3x3,
центрированные вокруг x(n), и сам центральный элемент, если это предусмотрено
типом маски:
() = [1(), 2(), … , ()],
(3)
18
В этом случае значения xi соответствует отображению слева-направо и
сверху-вниз окна(маска) 3х3 в одномерный вектор, как показано на уравнении (4).
Элементы данного вектора, как и для одномерного медианного фильтра,
также могут быть упорядочены в ряд по возрастанию или убыванию своих
значений:
() = [1(), 2(), … , ()],
(4)
Определено значение медианы y(n) = med(r(n)), и центральный отсчет маски
заменен значением медианы. Если по типу маски центральный отсчет не входит в
число ряда (4), то медианное значение находится в виде среднего значения двух
центральных отсчетов ряда (2).
Эти выражения не объясняют метод нахождения выходного сигнала вблизи
конечных и пограничных точек в конечных последовательностях и изображений.
Одним из простых методов является поиск медианы только тех точек в
изображении, которые попадают в апертуру. Поэтому для точек, близких к
границам, медианы будут определяться на основе меньшего количества точек.
1.3.3 Сегментация
При рассмотрении проблемы оптического распознавания символов (OCR)
возникает проблема сегментации символов или выбора отдельных слов на
изображении. В большинстве текстовых шрифтов, символы расположены близко
друг к другу, а межсимвольные интервалы не так выражены, как в случае
межстрочных или межсловных интервалов на рисунке 3. Поэтому алгоритм
сегментации символов более сложный и не столь очевидный.
Рисунок 3 - Изображение слова без сегментации
19
Входом для алгоритма сегментации символов служит изображение, какоголибо слова, которое получается из изображения текстовой строки после
применения к нему алгоритма сегментации слов.
Алгоритм сегментации символов основывается на том, что средняя яркость в
межсимвольных интервалах, по крайней мере, ниже средней яркости в
изображениях символов. Его (алгоритма сегментации) общая схема состоит из двух
основных частей.
1. Находим все индексы столбцов, соответствующие локальным минимумам
средней яркости столбцов ci.
2. Выявляем и удаляем из этого списка индексов ложные границы символов.
Далее следует
удаление ложных межсимвольных границ, которые
проводятся в несколько этапов:
1. Локальный минимум яркости в столбце номер i является "кандидатом" на
принадлежность к межсимвольному интервалу, если значение средней яркости ci в
этом столбце меньше определённой границы яркости cb и при этом значение
средней яркости в столбцах, отстоящих от данного локального минимума на два
пикселя слева или справа больше границы яркости. Границу яркости можно
определить через среднюю яркость картинки.
1

c  =   × × ∑=1  (),
(5)

где - 0 < k  < 1 - коэффициент, n - ширина изображения слова в точках;
cb - границы яркости
Первое условие межсимвольных границы можно записать в следующем виде.
( <   )((−2<
 )∗(
+2 <
 ))
,
(6)
В результате из списка индексов локальных минимумов W0 удаляются
индексы столбцов, средняя яркость которых не удовлетворяет этому условию,
формируется второй список W1 индексов-"кандидатов" в межсимвольные границы
на рисунке 4.
20
Рисунок 4 - Изображение слова после удаления части ложных границ
2. Выявление связей между столбцами пикселей. На этом шаге алгоритма
сегментации будем анализировать связность изображений символов и убирать из
списка W1 ложные границы, которые разрезают символ на части. Это может
происходить с широкими слабосвязанными символами. Например: символы
русского алфавита П, Н, Ц. Причём, символ может быть связан, либо в верхней (П),
либо в средней (Н), либо в нижней части (Ц) пиксельных столбцов. Чтобы избежать
неправильной классификации связности, разделим изображение на три уровня по
вертикали и будем анализировать эти уровни отдельно друг от друга. Разделение
изображения символа на части происходит в следующей пропорции: верхний
уровень - 30% от высоты символа, средний уровень - 40% от высоты символа,
нижний уровень - 30% от высоты символа.
Сформулируем условия связности двух соседних пиксельных столбцов k и
k+1:
1. Для максимумов яркости трех уровней  ℎ1 ,  1 ,  1 столбца k и
максимумов яркости трех уровней (+1) ℎ2 , (+1 ) 2 , (+1)2 столбца k+1 должно
выполняться условие
(ℎ1 = ℎ2); (1 = 2); (1 = 2),
(7)
2. Средняя яркость столбца k должна быть меньше максимума яркости
соседнего столбца  + 1:
() <  ( + 1),
(8)
3. Максимум яркости в столбце k должен быть больше удвоенного
абсолютного значения разности между значениями максимумов яркости столбца k
и соседнего столбца  + 1:
 () > 2 × | () −  ( + 1)|
(9)
Если для данного столбца выполняются все условия связности с соседями
слева и справа то граница удаляется как ложная, в противном случае выполняется
21
ещё одна проверка. Расстояние до предыдущей (левой) границы  должно быть
больше допустимого минимума  .
 >  ,
(10)
 = 0.4 × 
(11)
где n - высота изображения слова.
В результате из списка индексов "кандидатов" W1 удаляются индексы
столбцов, которые имеют связь с соседями слева и справа, формируется конечный
список индексов границ W2 на рисунке 5.
Рисунок 5 - Изображение слова после обработки.
1.3.4 Метод обнаружения линий
Данный метод разработан для того, чтобы страница, перевернутая под какимто углом, могла быть распознана, без устранения наклона - это позволяет избежать
потери качества изображения. Ключевой частью этого процесса является
фильтрация контуров и линий. Предполагая, что анализ содержимого страницы
уже предоставил области текста, примерно одного размера, простой фильтр высоты
удаляет заглавные буквы, с которых начинается страница в некоторых текстовых
файлах. (рисунок 6).
Рисунок 6 – Пример заглавной буквы в тексте
22
Медиана высоты приближается к размеру текста в регионах, поэтому
требуется отфильтровать контуры, которые меньше, чем эта медиана. Эти
элементы, скорее всего, будут пунктуацией или шумом.
Отфильтрованные контуры удовлетворяют модели неперекрывающихся
параллельных линий. Сортировка и обработка контуров вдоль координаты «x»
позволяет назначить путь к уникальной строке, отслеживая наклон страницы, что
значительно снижает вероятность присвоения неправильной линии в случае
перекоса. После того, как отфильтрованные контуры были назначены линиям, для
оценки
базовых
линий
используется
меньшая
медиана
квадратов,
а
отфильтрованные контуры возвращаются к соответствующим строкам.
Последний этап процесса создания линий соединяет контуры, которые
перекрывают друг друга по горизонтали или на половину, накладывая правильную
основу и правильно соотнесенные части искаженных символов.
1.3.5 Распознавание поврежденных символов
Данный алгоритм находит маршрут с наименьшей стоимостью от одной
вершины (начальной) до другой (целевой, конечный). Он предоставляет кандидату
новые состояния из очереди приоритетов и оценивает их, классифицируя
неклассифицированные комбинации фрагментов.
Можно утверждать, является ли этот подход лучшим, потому что очень
вероятно, что важные сегменты разделения исчезнут. Преимущество этого метода
заключается в том, что структура данных, необходимая для обработки всего
сегментированного элемента, упрощается (рисунок 7).
Рисунок 7 - Пример легко распознанного слова
Когда поиск «A *» был впервые разработан в 1989 году, точность обработки
искаженных символов была выше коммерческого развития того времени. Большая
23
часть успеха работы лежит в классификаторе изображений, который способен
легко распознавать поврежденные элементы.
1.3.6 Статический и адаптивный классификатор символов
Модуль, разработанный согласно статье Шильмана, этот метод не зависит от
шрифта и размера, работа этого модуля нестабильна. Идея заключалась в том,
чтобы взять сегмент аппроксимации и использовать его как особенность элемента,
но этот подход также нестабилен для “испорченных” символов.
Рисунок 8 - Четкий, искаженный и совпадающий по признакам прототип
Прорывом оказался следующий подход. Функции неизвестного символа не
должны совпадать с отличительными особенностями обучаемых данных. Во время
обучения сегменты многоугольной аппроксимации используются для обнаружения
признаков, но при распознавании небольшие значения фиксированной длины
извлекаются из границ и совпадают со многими атрибутами полученных данных.
На рисунке 7 короткие, тонкие линии - это признаки, извлеченные из неизвестного
символа, а тонкие длинные линии - это сегменты полигонального приближения,
используемые в прототипе подготовленных данных. Один прототип не совпадает с
двумя связанными функциями, но в этом прототипе каждое из этих свойств
отражается отдельно. Оказывается, при сравнении небольших объектов с более
крупными прототипами можно добиться хороших результатов при обработке
поврежденных символов. Основная проблема с этим подходом заключается в том,
что он требует высокой вычислительной мощности для сравнения неизвестного
элемента и прототипа.
24
Атрибуты, извлеченные из неизвестного символа, определяются тремя
направлениями (xposition, yposition, angle) с 50-100 знаками на символ, а атрибут
прототипа определяется по четыре направлениям (xposition, yposition, angle,
length), с 10- 20 свойств по конфигурации прототипа.
Использование адаптивных классификаторов в OCR-модулях приносит
значительные преимущества. Несмотря на то, что статический классификатор
хорошо подходит для обработки шрифтов любого типа, его способность различать
символы
и
не
символы
недостаточно
развита.
Более
чувствителен
к
классификаторам шрифтов, обученным с использованием выходных данных,
которые могут использоваться в документах, где количество шрифтов ограничено.
Единственное существенное различие между статическим и адаптивным
классификатором, если
забыть о подготовленных данныхто
адаптивный
классификатор использует нормализацию по базовым уровням. Нормализация по
сравнению с базовыми линиями упрощает обнаружение букв верхнего и нижнего
регистра, а также увеличивает сопротивление шуму. Основным преимуществом
нормализации является устранение зависимости от шрифтов и от ширины
символов для этого шрифта. На следующем рисунке показан пример формы
трехмерных слов в нормализации по существу линии и вид нормализации по
моменту.
Рисунок 9 - Слово в базовых линия, и нормализованные по моменту буквы
1.4 Методы распознавания символов
Распознавание
структурированных
(печатных)
символов
различных
изображений обеспечивает решение ряда научных и прикладных задач при
идентификации объектов различной природы. Современные методы распознавания
символов используются для решения как типовых задач, например, распознавание
25
текста, так и специализированных задач, ориентированных на распознавание
символьной информации, нанесенной на поверхность различных объектов.
Рассмотрим наиболее известные и распространенные методы распознавания
символов.
1.4.1 Структурные методы
Алгоритм этих методов состоит в том, чтобы разделить исходное
изображение на его составные части, описываемые как стабильные идеальные
элементы.
Один из методов этого направления используется для топологического
описания изображений. Другими словами, эталон содержит информацию об
относительных положениях отдельных составляющих частей символа. В то же
время размер распознанной буквы становится несущественным и даже шрифтом, с
помощью которого он печатается. Возможные изображения, которые составляют
тот или иной класс может быть представлен как результат гомеоморфных
преобразований некоторого эталонного изображения, соответствующие этому
классу. Проблема распознавания в этом случае может быть сведена к установлению
гомеоморфизма предоставленного изображения с одним из эталонных. Её можно
обнаружить с помощью топологических инвариантов - свойств изображения,
которые не меняются при его гомеоморфных преобразованиях. Инвариантом,
позволяющим дать числовое описание изображений, является, например,
количество линий, сходящихся в точке. Соответствующее описание получается
путем прохождения
в контурах определенного
порядка изображения
с
одновременной фиксацией точечных индексов. Установление гомеоморфизма правильное
распознавание,
представленного
изображения
которое
и
сводится
эталонных
к
сравнению
образов
классов.
описаний
Важным
преимуществом топологического описания является его нечувствительность к
сильным деформациям изображения, включая все преобразования подобия, если
мы сопоставляем каждому изображению некоторую характерную точку, из
26
которой
начинается
обход. Обучение топологическому коду состоит в
поддержании набора эталонных описаний.
Другие структурные методы реализуют алгоритм распознавания событий.
Метод события основан на топологической структуре объекта, который состоит из
линий и не изменяется при малых деформациях изображения. Линия является
частью изображения, в каждом разделе которой имеется только один интервал.
Строки, огрубленные на сетке, определяют события. Представление события - это
не только формальный набор функций, но и адекватное топологическое описание.
Обучение метода сводится к составлению списка стандартов для достаточно
большой последовательности изображений. При распознавании исходного растра
определяется представление события, к которому сопоставляется ссылочный
класс.
Основной проблемой методов структурного распознавания является
идентификация признаков, имеющих дефекты.
Преимуществами метода являются способность распознавать искаженные
символы и скорость с небольшим алфавитом.
1.4.2 Шаблонные методы
Алгоритм работы шаблонных методов основан на сравнении входного
графического изображения, идеального шаблона. Первым шагом в работе метода
шаблона является преобразование отсканированного изображения в растровое
изображение. Во время процесса распознавания шаблоны сортируются, и
вычисляется расстояние от изображения до шаблона. Класс, чьи шаблоны
находятся на минимальном расстоянии от входного изображения, является
результатом распознавания.
Эти методы делятся на два класса: зависящие от шрифта и не зависящие от
шрифтов. Независимые от шрифта методы используют предопределенные
шаблоны и универсальны для всех типов шрифтов. Однако этот подход снижает
вероятность
правильного
распознавания.
шрифтозависимые
алгоритмы
предназначены только для одного типа шрифтов, что повышает качество их
27
работы, но при использовании других шрифтов они полностью не работают. Были
предложены методы распознавания больших объемов текста, когда некоторые из
символов гарантированно распознаются не зависящими от шрифта методами, а
затем шаблоны для зависящих от шрифта алгоритмов строятся на основе
распознанных символов.
При существующем изобилии печатных материалов в процессе обучения
невозможно охватить все шрифты и их модификации.
К преимуществам этого алгоритма относятся: простота внедрения, надежная
работа при отсутствии помех, высокая точность распознавания дефектных
символов, скорость с небольшим алфавитом.
Недостатками являются: сильная зависимость от шаблонов и трудность
выбора оптимальных моделей, невозможность распознать шрифт, который
отличается от встроенного в систему, медленную работу с большим количеством
помех, чувствительность к вращению, шум и искажение.
1.4.3 Признаковые методы
Данные методы основаны на том, что изображение связано с N-мерным
вектором признаков. Распознавание заключается в сравнении его с набором
эталонных векторов того же размера. Решение о том, принадлежит ли изображение
определенному классу на основе анализа расчетных характеристик, имеет ряд
строгих математических решений в рамках вероятностного подхода. Тип и
количество атрибутов в немалой степени определяют качество распознавания.
Вектор формируется во время анализа изображения. Эта процедура называется
извлечением функций. Эталон для каждого класса получается путем аналогичной
обработки символов обучающих образцов.
К
достоинствам
метода
относятся:
простота
внедрения,
высокая
обобщающая способность, устойчивость к изменению формы символов, высокая
скорость.
К недостаткам метода относятся: неустойчивость к различным дефектам
изображения, потеря информации о символе на этапе извлечения признаков.
28
1.4.4 Нейросетевые методы
Нейросетевые методы основаны на использовании различных типов
искусственных
нейронных
человеческого
мозга.
Ввод
сетей.
Идея
этих
предварительно
методов
обученной
-
моделирование
нейронной
сети
представляет собой вектор, представляющий собой входное изображение (пиксели,
частотные характеристики, всплески). На выходе нейрон, соответствующий классу
распознанного символа, выводит максимальное значение функции активации. Или
многие ключевые характеристики изображения поступают на выход, которые
затем обрабатываются другими системами. Обучение нейронных сетей происходит
на нескольких примерах обучения. И можно тренироваться с учителем
(персептроном) или самоорганизацией (сеть Кохонена).
Преимуществами метода являются: способность к обобщению, высокая
скорость работы.
Недостатки: чувствительность к вращению и искажение символов, трудность
выбора учебного образца и алгоритма обучения.
Проанализировав вышеперечисленные методы, было принято решение
использовать нейросетевые методы, а именно рекуррентную нейронную сеть.
1.5 Выводы к первой главе
В рамках первой главы были проанализированы существующие приложения
по оптическому распознаванию символов, выявлены плюсы и минусы.
Ознакомились, что такое оптическое распознавание символов, с какими
трудностями можно столкнуться при распознавании и обработки изображений. А
также рассмотрели распространенные методы распознавания символов
29
2 ПРОЕКТИРОВАНИЕ СИСТЕМЫ
На этапе проектирования информационной системы требуется составить
модель на различных уровнях и разрезах, а также выбрать вид нейронной сети. Для
формирования данной модели необходимо использовать один из различных
стандартов проектирования. Одним из таких стандартов является стандарт Unified
Modeling Language (UML). UML – это стандартная нотация визуального
моделирования программных систем, и на сегодняшний день она поддерживается
многими объектно-ориентированными CASE – продуктами. UML содержит набор
различных диаграмм, благодаря которым, становится возможным проектирование
информационных систем на различных уровнях. Таким образом, на основе
стандарта UML будет спроектировано инструментальное средство формирования
учебно-методического комплекса дисциплин с применением компетентностного
подхода на концептуальном, логическом и физическом уровней.
На основании рассмотренных методов распознавания символов в первой
главе, для проектирования системы был выбран метод основанный на нейронной
сети. Для распознавания символов или текста применяется рекуррентная
нейронная сеть, основой которой является персептрон.
2.1 Рекуррентная нейронная сеть
Рекуррентные нейронные сети были изобретены для обработки текста или
музыки. В общем случае важна любая условно бесконечная последовательность, в
которой важно не только содержание, но и порядок, в котором следует
определенная информация. Их противоположности, которые мы назвали
«обычными», имеют более строгое названия - нейронные сети прямого
распространения (нейронные сети с обратной связью), поскольку в них
информация передается только по сети, от уровня к слою. В рекуррентных
нейронных сетях нейроны обмениваются информацией между собой: например, к
новой части входящих данных, нейрон также получает некоторую информацию о
предыдущем состоянии сети. Таким образом, сеть реализует «память», которая
30
коренным образом изменяет характер ее работы и позволяет анализировать любые
последовательности данных, в которых важно, каком порядке идут значения - от
звукозаписей до котировок акций.
Рисунок 10 - Схема однослойной рекуррентной нейронной сети
На каждом цикле работы внутренний слой нейронов получает набор входных
данных Х и информацию о предыдущем состоянии внутреннего слоя А, на
основании чего генерирует ответ h.
Наличие памяти рекуррентных нейронных сетях позволяет несколько
расширить нашу аналогию с x2. Если мы назвали нейронную сеть прямого
распространения «простой» функцией, то рекуррентную сеть можно назвать
программой. Фактически, память рекуррентных нейронных сетей делает их
завершающими: при правильном назначении весов нейронная сеть может успешно
эмулировать работу компьютерных программ.
Обычный персептрон легко запоминает этот шаблон для любых примеров,
которые ему будут предложены, но каждый раз потребуется сравнить два разных
сигнала, а не проблему эволюции или сдвига одного и того же сигнала. Решение
Эльмана, основанное на предыдущих разработках в этой области, основывалось на
том факте, что в простую нейросеть добавлялся еще один «контекстный» слой, в
котором состояние внутреннего слоя нейронов просто копировалось в каждом
цикле сетевой операции. В то же время можно было бы обучить связь между
контекстуальным и внутренним слоями. Эта архитектура позволила относительно
легко воспроизводить временные ряды, а также обрабатывать последовательности
произвольной длины, которые резко отличают простой РНС от предыдущих
понятий. Более того, эта сеть способна распознавать и даже классифицировать
31
существительные и глаголы в предложении, основываясь только на порядке слов,
который вызвал большой интерес как лингвистов, так и экспертов в изучении
сознания.
В сетях LSTM внутренние нейроны «оснащены» сложной системой так
называемых ворот, а также концепция клеточного состояния, которые являются
своего рода долговременной памятью. Ворота определяют, какая информация
попадает в состояние клеточной связи, какая из них будет стерта, и что повлияет
на результат, который выдаст РНС на этом этапе. Можно отметить, что эти
вариации РНС широко используются сейчас, например, для машинного перевода
Google.
Рисунок 11 - Принцип работы РНС типа LSTM
Нейроны внутренних слоев могут считывать и изменять состояние ячейки
(cell state), которое сочетает в себе функции краткосрочной и долгосрочной
памяти.
Одна из главных областей применения РНС на сегодняшний день - работа с
языковыми моделями, в частности - анализ контекста и общей связи слов в тексте.
Для РНС структура языка - это долгосрочная информация, которую надо
запомнить. К ней относятся грамматика, а также стилистические особенности того
корпуса текстов, на которых производится обучение. Фактически РНС запоминает,
в каком порядке обычно следуют слова, и может дописать предложение. Если же
исходный текст был осмысленным, РНС поможет его стилизовать, однако одной
РНС будет мало, так как результат должен представлять собой «смесь» случайного,
32
но стилизованного текста от РНС и осмысленной, но «неокрашенной» исходной
части.
Задача переноса стиля с одного изображения на другой решается при помощи
нейросетей и операции свертки, которая разбивает изображение на несколько
масштабов и позволяет нейросетям анализировать их независимо друг от друга, а
впоследствии и перемешивать между собой. Аналогичные операции проводились
и с музыкой (также с помощью сверточных нейросетей): в этом случае мелодия
является содержанием, а аранжировка - стилем. И вот с написанием музыки РНС
как раз успешно справляется. Поскольку обе задачи - и написание, и смешивание
мелодии с произвольным стилем - уже успешно решены при помощи нейросетей.
Рисунок 12 - Схема трехмерной рекуррентной нейросети для написания
музыкальных фрагментов
В отличие от простейшей архитектуры, в данной системе фактически
объединены две РНС, отдельно описывающих последовательность во времени и
сочетание нот в каждый момент.
33
Особый случай - это автоматическое написание программного кода.
Поскольку язык программирования по определению представляет собой язык, РНС
может его выучить. На практике оказывается, что программы, написанные РНС,
вполне успешно компилируются и запускаются, однако они не делают ничего
полезного, если им заранее не обозначить задачу. А причина этого та же, что и в
случае литературных текстов: для РНС язык программирования - не более чем
стилизация, в которую они не могут вложить никакого смысла.
На текущий момент в Google для машинного перевода используются РНС
типа LSTM, что позволило добиться наибольшей точности по сравнению с
существующими аналогами, однако, по словам самих авторов, машинному
переводу еще очень далеко до уровня человека. Сложности, с которыми
сталкиваются нейросети в задачах перевода, обусловлены сразу несколькими
факторами: во-первых, в любой задаче существует неизбежный размен между
качеством и скоростью.
На данный момент человек очень сильно опережает искусственный
интеллект по этому показателю. Поскольку машинный перевод чаще всего
используется в онлайн-сервисах, разработчики вынуждены жертвовать точностью
в угоду быстродействию. Разработчики Google на эту тему подробно описывают
многие решения, которые позволили оптимизировать текущую версию Google
Translate, однако проблема до сих пор остается. Например, редкие слова, или сленг,
или искажение слова (например, для более яркого заголовка) может сбить с толку
даже переводчика-человека, которому придется потратить время, чтобы подобрать
наиболее аналог в другом языке. Машину же такая ситуация поставит в полный
тупик, и переводчик будет вынужден «выбросить» сложное слово и оставить его
без перевода. В итоге проблема машинного перевода не настолько обусловлена
архитектурой, насколько сложностью и многообразием языка.
34
Рисунок 13 - Принцип работы машинного переводчика Google Translate,
основанного на комбинации несколько рекуррентных нейросетей
Нейронная машина Тьюринга (Neural Turing Machine), предложенная два
года назад коллективом из Google DeepMind, отличается от других РНС тем, что не
хранят информацию в явном виде - она кодируется в весах нейронов и связей, даже
в продвинутых вариациях LSTM. В нейронной машине Тьюринга разработчики
придерживались более понятной идеи «ленты памяти», как в классической машине
Тьюринга: в ней информация в явном виде записывается «на ленту» и может быть
считана в случае необходимости. При этом отслеживание того, какая информация
нужна, ложится на особую нейросеть-контроллер. Можно отметить, что идея НМТ
действительно завораживает своей простотой и доступностью для понимания. С
другой стороны, в силу технических ограничений современного аппаратного
обеспечения применить НМТ на практике не представляется возможным, потому
что обучение такой сети становится чрезвычайно долгим. В этом смысле РНС
являются промежуточным звеном между более простыми нейросетями и НМТ, так
как хранят некий «слепок» информации, который при этом не ограничивает их
быстродействие. В основе рекуррентной сети лежит персептрон, но основе его
алгоритма строятся большинство нейросетей.
35
2.1.1 Персептрон
Персептрон - простейшая нейронная сеть, состоящая из одного нейрона.
Рассмотрим следующую простую задачу. Пусть существует параметрическое
пространство и набор объектов, описанных в этом пространстве векторами x =
(x1, x2, K, xn). Разделим эти объекты на два класса 1 и 2. Поставим задачу в
виде нахождения решающей функции, разделяющей эти классы. Эта функция
определяется весовым вектором w = (w1, w2, K, wn),так что
   > 0,
∀ ∈ 
(12)
∀ ∈ 2,
Рассмотрим схему работы персептрона (рисунок 14). Он состоит из трех
сенсорных элементов сетчатки: сенсорного (S), ассоциативного (A) и реакции (R).
Элементы сенсорной сетчатки случайным образом связаны с ассоциативными
элементами. Каждый из ассоциативных элементов генерирует выходной сигнал xi
только в том случае, если достаточное количество связанных с ним сенсорных
элементов находится в возбужденном состоянии. Таким образом, сенсорная
сетчатка - это устройство, которое воспринимает сигналы из внешнего мира, а
ассоциативная сетчатка - входное описание воспринимаемого объекта.
Собственно, нейрон представлен элементом сетчатки R. Он связан со всеми
элементами ассоциативной сетчатки соединениями, каждый из которых имеет свой
собственный вес  . Ответ элемента R на воспринимаемый объект представлен
взвешенной суммой выходных сигналов ассоциативных элементов:

 = ∑=1   =   ,
(13)
Если R > 0, воспринимаемый объект считается отнесённым к классу ω1, если
же R < 0 — к классу ω2.
Описанная
схема
работы
персептрона
соответствует
принципу
распознавания, основанному на решающей функции. Таким образом, процесс
обучения системы состоит в определении весового вектора w, так что система
производит соответствующий результат R для объектов разных классов.
36
Рисунок 14 - Модель персептрона
При рассмотрении нейронных сетей сенсорная сетчатка, как правило, не
учитывается; сущность процесса функционирования сети выражается в расчете
взвешенных сумм сигналов. По той же причине сетчатка A обычно служит только
для указания входов и называется входным слоем сети, или также опускается.
Алгоритм
обучения
персептрона
проводится
по
схеме,
названной
алгоритмом персептрона, и руководствуется принципом подкрепления-наказания.
Эта процедура относится к классу процедур обучения с учителем. Пусть w (1) начальный весовой вектор.
Системе поочередно предоставляются объекты из обучающего образца с
известными принадлежностями для классов. В зависимости от реакции системы
весовой вектор корректируется. Правило коррекции выглядит следующим
образом: пусть весовой вектор w() и объект x(), принадлежащий классу ω1,
находятся на k-м этапе обучения. Тогда, если wT (k) x (k) ≤ 0, вектор w() на
этапе  + 1 заменяется вектором
w ( + 1) = w() + x(),
(14)
37
где c — корректирующее приращение или скорость обучения персептрона.
Теперь предположим, что x(k) ∈ω2. Тогда если w  ()x() ≥ 0, то весовой
вектор на шаге k+1 заменяется вектором
w ( + 1) = w() − x(),
(15)
Если вышеуказанные условия не выполняются, вектор весов не изменяется.
Таким образом, в случае некорректного распознавания класса представляемого
объекта используемый вектор «наказывается», то есть корректируется. В случае
правильной реакции вектор «усиливается», что в данном алгоритме выражается
отсутствием изменений. Выполнение алгоритма заканчивается при правильном
распознавании всех объектов учебного образца. В [3] доказано, что если
распознаваемые классы линейно отделимы в параметрическом пространстве, то
этот алгоритм сходится.
2.1.1.1 Классификация перцептронов
Понятие перцептрона имеет интересную, но незавидную историю. В
результате неразвитой терминологии нейронных сетей прошлых лет, резкой
критики и непонимания задач исследования перцептронов, а иногда и ложного
освещения прессой, изначальный смысл этого понятия исказился. Сравнивая
разработки Розенблатта и современные обзоры и статьи, можно выделить 4
довольно обособленных класса перцептронов:
1. Перцептрон с одним скрытым слоем - это классический перцептрон,
которому посвящена большая часть книги розенблатта, и рассматриваемый в данной
статье: у него имеется по одному слою s-, a- и r-элементов.
2. Однослойный перцептрон - это модель, в которой входные элементы
напрямую соединены с выходными с помощью системы весов. Является
простейшей сетью прямого распространения — линейным классификатором, и
частным случаем классического перцептрона, в котором каждый s-элемент
однозначно соответствует одному a-элементу, s—a связи имеют вес +1 и все aэлементы имеют порог = 1. Однослойные перцептроны фактически являются
формальными нейронами, то есть пороговыми элементами мак-каллока — питтса.
38
Они имеют множество ограничений, в частности, они не могут идентифицировать
ситуацию, когда на их входы поданы разные сигналы («задача xor», см. Ниже).
3. Многослойный перцептрон (по розенблатту) - это перцептрон, в котором
присутствуют дополнительные слои a-элементов. Его анализ провёл розенблатт в
третьей части своей книги.
4. Многослойный перцептрон (по румельхарту) - это перцептрон, в котором
присутствуют дополнительные слои a-элементов, причём, обучение такой сети
проводится по методу обратного распространения ошибки, и обучаемыми являются
все слои перцептрона (в том
числе s—a). Является частным случаем
многослойного перцептрона розенблатта.
В настоящее время в литературе под термином «перцептрон» понимается
чаще всего однослойный перцептрон (англ. Single-layer perceptron), причём,
существует распространённое заблуждение, что именно этот простейший тип
моделей предложил Розенблатт. В противоположность однослойному ставят
«многослойный перцептрон» (англ. Multilayer perceptron), опять же, чаще всего
подразумевая многослойный
перцептрон
Румельхарта, а
не
Розенблатта.
Классический перцептрон в такой дихотомии относят к многослойным.
2.1.1.2 Обучение перцептронов
Важным свойством любой нейронной сети является способность к обучению.
В своей книге Розенблатт пытался классифицировать различные алгоритмы
обучения перцептрона, называя их системами подкрепления.
Система подкрепления - это любой набор правил, на основании которых
можно изменять с течением времени матрицу взаимодействия (или состояние
памяти) перцептрона.
Описывая эти системы подкрепления и уточняя возможные их виды,
Розенблатт основывался на идеях Д. Хебба об обучении, предложенных им в 1949
году, которые можно перефразировать в следующее правило, состоящее из двух
частей:
1. Если два нейрона по обе стороны синапса (соединения) активизируются
39
одновременно (то есть синхронно), то прочность этого соединения возрастает.
2. Если два нейрона по обе стороны синапса активизируются асинхронно, то
такой синапс ослабляется или вообще отмирает.
2.1.1.3 Обучение с пощрением
Классический метод обучения перцептрона — это метод коррекции ошибки.
Он представляет собой такой вид обучения с поощрением, при котором вес связи
не изменяется до тех пор, пока текущая реакция перцептрона остается правильной.
При появлении неправильной реакции вес изменяется на единицу, а знак (+/-)
определяется противоположным от знака ошибки.
Допустим, мы хотим обучить перцептрон разделять два класса объектов так,
чтобы при предъявлении объектов первого класса выход перцептрона был
положителен (+1), а при предъявлении объектов второго класса — отрицательным
(−1).
Для этого выполним следующий алгоритм:
1. Случайным образом выбираем пороги для A-элементов и устанавливаем
связи S—A (далее они изменяться не будут).
2. Начальные коэффициенты wi полагаем равными нулю.
3. Предъявляем обучающую выборку: объекты (например, круги либо
квадраты) с указанием класса, к которым они принадлежат.
◦
Показываем перцептрону объект первого класса. При этом некоторые A-
элементы возбудятся. Коэффициенты w i , соответствующие этим возбуждённым
элементам, увеличиваем на “1”.
◦
Предъявляем объект второго класса и коэффициенты w i тех A-
элементов, которые возбудятся при этом показе, уменьшаем на “1”.
4. Обе части шага 3 выполним для всей обучающей выборки. В результате
обучения сформируются значения весов связей w .
Теорема сходимости перцептрона, описанная и доказанная Ф. Розенблаттом
(с участием Блока, Джозефа, Кестена и других исследователей, работавших вместе
40
с ним), показывает, что элементарный перцептрон, обучаемый по такому алгоритму,
независимо
от
начального
состояния
весовых
коэффициентов
и
последовательности появления стимулов всегда приведет к достижению решения
за конечный промежуток времени.
2.1.1.4 Обучение без поощрения
Кроме классического метода обучения перцептрона Розенблатт также ввёл
понятие об обучении без поощрения, предложив следующий способ обучения:
Альфа-система подкрепления - это система подкрепления, при которой веса
всех активных связей wi, которые ведут к элементу u j, изменяются на одинаковую
величину r, а веса неактивных связей за это время не изменяются.
Затем, с разработкой понятия многослойного перцептрона, альфа- система
была модифицирована и её стали называть дельта-правило. Модификация была
проведена с целью сделать функцию обучения дифференцируемой (например,
сигмоидной), что в свою очередь нужно для применения метода градиентного
спуска, благодаря которому возможно обучение более одного слоя.
2.1.1.5 Метод обратного распространения ошибки
Для обучения многослойных сетей рядом учёных, в том числе Д.
Румельхартом, был предложен градиентный алгоритм обучения с поощрением,
проводящий сигнал ошибки, вычисленный выходами перцептрона, к его входам,
слой за слоем. Сейчас это самый популярный метод обучения многослойных
перцептронов. Его преимущество в том, что он может обучить все слои нейронной
сети, и его легко просчитать локально. Однако этот метод является очень долгим, к
тому же, для его применения нужно, чтобы передаточная функция нейронов была
дифференцируемой. При этом в перцептронах пришлось отказаться от бинарного
сигнала, и пользоваться на входе непрерывными значениями.
41
2.2 Диаграмма вариантов использования системы
Диаграмма прецедентов широко применяется в разных сферах, особенно там,
где требуется вид системы с точки зрения разных вариаций использования или
прецедентов. В большинстве случаев здесь предполагается моделирование
контекста системы, класса или подсистемы, или же моделирование требований,
которые предъявляются к поведению выбранных элементов. Большое значение
диаграмма
прецедентов
имеет
для
специфицирования,
визуализации
и
документирования поведения системы. Используя ее, разработчику легче понимать
систему, подсистему или классы, а также взглянуть извне на преимущества
использования элементов для того или иного контекста. Подобная UML-диаграмма
представляет особую важность для проведения тестирования исполняемых систем
при прямом проектировании, а также для лучшего понимания их внутреннего
устройства, особенно при обратном проектировании.
Также
есть
возможность
дополнить
в
прецедент
дополнительной
информацией:
1. Предусловие
(pre-condition)
описывает
действия,
обязательно
выполняемые системой перед тем, как она разрешит начать работу прецедента. Это
полезная информация, позволяющая разработчикам не проверять некоторые
условия в их программе;
2. Гарантия (guarantee) описывает обязательные действия системы по
окончании работы шаблона ответа. Успешные гарантии выполняются после
успешного сценария; минимальные гарантии выполняются после любого сценария;
3. Триггер (trigger) определяет событие, инициирующее выполнение
прецедента.
На диаграмме прецедентов графически показана совокупность прецедентов
и субъектов, а также отношения между ними. Она является составной частью
модели прецедентов, что позволяет описать систему на концептуальном уровне.
Субъект (actor) - любая сущность, взаимодействующая с системой извне или
множество логически связанных ролей, исполняемых при взаимодействии с
прецедентами. Стандартным графическим обозначением субъекта на диаграммах
42
является фигурка "человечка", под которой записывается конкретное имя субъекта,
однако субъектом может быть не только человек, но и техническое устройств о,
программа или любая другая система, которая может служить источником
воздействия на моделируемую систему так, как определит сам разработчик
Прецеденты (use case) - это описание множества последовательностей
действий (включая их варианты), которые выполняются системой для того, чтобы
актер получил результат, имеющий для него определенное значение. При этом
ничего не говорится о том, каким образом будет реализовано взаимодействие
субъектов с системой, это одна из важнейших особенностей разработки
прецедентов. Стандартным графическим обозначением прецедента на диаграммах
является эллипс (рисунок 15), внутри которого содержится краткое название
прецедента или имя в форме глагола с пояснительными словами.
Диаграмма вариантов использования не описывает внутреннее устройство
системы, но показывает то, что система умеет делать, не показывая используемые
в ней методы.
43
Рисунок 15 – Диаграмма прецедентов системы
44
В данной модели представлены следующие прецеденты для пользователя:
1. «Распознавание печатных символов» отвечает за начало работы
программы, сюда входят основные функции по обработке графического файла и
дальнейшее распознаванию образов и выводе информации на дисплей смартфона.
2. «Просмотр информации о программе» показывает информацию о
возможностях программы и настройках приложения.
3. «Получение изображения» получение изображения с камеры смартфона.
4. «Выбор настроек программы» позволяет выбрать настройки для
распознавания текста, такие как: включение автофокуса, языка распознавания,
языка перевода и т.д.
5. «Применение фильтров» проверяет изображение на сильные искажения,
на допустимую яркость и убирает лишние шумы.
6. «Классификация символов» определяет к какому классу принадлежит
данный символ (цифры, буквы или специальные символы).
7. «Перевод текста» позволяет переводить распознанный текст на другой
язык.
2.3 Диаграмма деятельности системы
В качестве графического представления для выделения основных функций
системы применяется диаграмма вариантов использования (use case).
Диаграмма вариантов использования показывает представление, что должна
делать система.
Деятельность
может
содержать
входящие
и/или
исходящие
“дуги
деятельности”, показывающие потоки управления и потоки данных. Если поток
соединяет две деятельности, он является потоком управления. Если поток
заканчивается объектом, он является потоком данных.
Деятельность выполняется, только тогда, когда готовы все его «входы»,
после выполнения, деятельность передает управление и (или) данные на свои
«выходы». Диаграмму деятельности принято располагать таким образом, чтобы
действия следовали слева направо или сверху вниз.
45
Чтобы указать, где именно находится процесс, используется абстрактная
точка «маркер» (или «токен»). Визуально на диаграмме маркер не показывается,
данное понятие вводится только для удобства описания динамического процесса.
Переход маркера осуществляется между узлами. Маркер может не содержать
никакой дополнительной информации (пустой маркер) и тогда он называется
маркером управления (control flow token) или же может содержать ссылку на объект
или структуру данных, и тогда маркер называется маркером данных (data flow
token).
В точку ветвления входит ровно один переход, а выходит - два или более. Для
каждого исходящего перехода задается булевское выражение, которое вычисляется
только один раз при входе в точку ветвления. Ни для каких двух исходящих
переходов эти условия не должны одновременно принимать значение "истина",
иначе поток управления окажется неоднозначным. Желательно чтобы условия
покрывали все возможные варианты, иначе поток остановится.
Для пометки исходящего перехода, который должен быть выбран в случае,
если условия, заданные для всех остальных переходов не выполнены, разрешается
использовать ключевое слово else.
Узлы решения объединения аналогичны логическому выражению «строгое
или», т.е. для узла объединения - только при выполнении того или иного действия
осуществляется переход к следующему узлу управления. Соответственно для узла
решения – только при выполнении того или иного условия становится доступна
возможность перехода к одному из следующих действий.
46
Каждая диаграмма деятельности должна иметь единственное начальное и
единственное конечное состояния. Они имеют такие же обозначения, как и на
диаграмме состояний. При этом каждая деятельность начинается в начальном
состоянии и заканчивается в конечном состоянии. Саму диаграмму деятельности
принято располагать таким образом, чтобы действия следовали сверху вниз. В этом
случае начальное состояние будет изображаться в верхней части диаграммы, а
конечное - в ее нижней части.
Рисунок 16 – Диаграмма деятельности системы
Начальное состояние – Получение графического файла (изображение), если
изображение получено, то программа переходит к следующему действию, а если
изображение не получено, то работа завершается.
Следующий этап – обработка изображения, где настраивается яркость и
контрастность. Далее программа переводит изображение в черно- белый формат,
так как функция поиска объектов работает только в этом цвете. После перевода
изображения в черно-белый формат идет очистка от посторонних шумов,
мешающих правильной сегментации каждого печатного символа.
Выполнив обработку изображения, программа начинает классифицировать
каждый символ по признакам буква – символ. Выполнив классификацию символов
и вывода распознанного текста, работа программы завершается.
47
2.4 Диаграмма классов системы
Разрабатываемая система будет поддерживает модульную структуру и
состоять из следующих модулей:
Модуль Preferences.xml и CameraManager.java: содержит главный интерфейс
управления программой, написан на языке xml. Особенностью данного модуля
является создание и инициализация основных модулей программы посредством
конструкторов объектов соответствующих классов.
Модуль
получения
изображения:
реализован
таким
образом,
что
распознавание ведется в реальном времени, а это значит, что не требуется
дополнительных графических файлов, хранящихся в памяти смартфона (Рисунок
17).
Рисунок 17 - Получение изображения
Самый главный класс называется «CameraManager», внутри этого класса
создается все подклассы участвующие для получения данных изображения, классы
«CameraConfigurationManager», «ShutterButton».
48
В свою очередь подкласс: «CameraConfigurationManager» включает еще
несколько
подклассов:
«BeepManager»,
«AutoFocusManager».
Подкласс
«ShutterButton» включает так же несколько подклассов: «CaptureActivity»,
«OcrAsyncTask», «OcrRecognizeAsyncTask», «OcrResult», «OcrResultText»
Рисунок 18 - Диаграмма классов
Класс «CameraManage» управляет камерой любого мобильного телефона,
позволяет выбрать область распознавания и сфотографировать для фиксации
результата.
Класс «CameraConfigurationManager». – содержит в себе настройки
распознавания печатных символов. Он позволяет выбрать язык, алгоритм
распознавания текста. Так же присутствует “Белый список символов” и “Черный
49
список символов” и присутствует возможность их редактирования. “Белый список
символов” – указывает какие символы разрешены для распознавания, а в “Черный
список символов” можно записать все символы, которые приложения будет
пропускать при распознавании.
Класс «AutoFocusManager». - включить автофокус стандартного режима,
если он не работает, то есть возможность включить альтернативный режим. На
более старых смартфонах, у которых версия ОС Android меньше 4.4. может
возникнуть проблема с фокусировкой камеры и для этого был реализован
алгоритм, позволяющий исправить эту проблему. На версиях ОС Android 4.4 – 8.1
при выборе стандартного и альтернативного режима фокусировки никак не
сказывается на работе камеры.
Класс «BeepManager» - позволяет включать или отключать звуковой сигнал
при фотографировании выделенной области.
Класс «CaptureActivity» - выполняет сканирование в фоновом потоке. Он
рисует область распознавания, чтобы помочь пользователю правильно выделить
область с текстом, показывает обратную связь, как происходит обработка
изображений.
Класс «OcrAsyncTask» - устанавливает языковые данные, необходимые для
распознавания и инициализирует механизм распознавания с помощью фонового
потока.
Класс «OcrRecognizeAsyncTask» - предназначен для отправки запросов OCR
обработчику в отдельном потоке. Через него идет отправка сообщения об
успешном завершении, ошибке или закрытия диалогового окна.
Класс «OcrResult» - анализирует полученные результаты и подготавливает к
дальнейшему распознаванию.
Класс OcrResultText – Инкапсулирует текст и его координаты символов, слов в
результате распознавания и выводит на дисплей.
50
2.5 Диаграмма компонентов системы
Диаграмма компонентов, в отличие от ранее рассмотренных диаграмм,
описывает
особенности
физического
представления
системы.
Диаграмма
компонентов позволяет определить архитектуру разрабатываемой системы,
установив зависимости между программными компонентами, в роли которых
может выступать исходный, бинарный и исполняемый код. Во многих средах
разработки модуль или компонент соответствует файлу. Пунктирные стрелки,
соединяющие модули, показывают отношения взаимозависимости, аналогичные
тем, которые имеют место при компиляции исходных текстов программ.
Основными графическими элементами диаграммы компонентов являются
компоненты, интерфейсы и зависимости между ними.
Компонент (component) — физически существующая часть системы, которая
обеспечивает реализацию классов и отношений, а также функционального
поведения моделируемой программной системы.
Компонент предназначен для представления физической организации
ассоциированных с ним элементов модели. Дополнительно компонент может
иметь текстовый стереотип и помеченные значения, а некоторые компоненты –
собственное графическое представление. Компонентом может быть исполняемый
код
отдельного
модуля,
командные
файлы
или
файлы,
содержащие
интерпретируемые скрипты.
Компонент служит для общего обозначения элементов физического
представления модели и может реализовывать некоторый набор интерфейсов. Для
графического представления компонента используется специальный символ –
прямоугольник со вставленными слева двумя более мелкими прямоугольниками.
Внутри объемлющего прямоугольника записывается имя компонента и, возможно,
дополнительная информация. Этот символ является базовым обозначением
компонента в языке UML.
Графическое изображение компонента ведет свое происхождение от
обозначения
модуля
программы,
применявшегося
некоторое
отображения особенностей инкапсуляции данных и процедур.
время
для
51
Модуль (module) — часть программной системы, требующая памяти для
своего хранения и процессора для исполнения.
В
этом
случае
верхний
маленький
прямоугольник
концептуально
ассоциировался с данными, которые реализует этот компонент (иногда он
изображается в форме овала). Нижний маленький прямоугольник ассоциировался
с операциями или методами, реализуемыми компонентом. В простых случаях
имена данных и методов записывались явно в маленьких прямоугольниках, однако
в языке UML они не указываются.
Имя компонента подчиняется общим правилам именования элементов
модели в языке UML и может состоять из любого числа букв, цифр и знаков
препинания. Отдельный компонент может быть представлен на уровне типа или
экземпляра.
В качестве собственных имен компонентов принято использовать имена
исполняемых файлов, динамических библиотек, Web-страниц, текстовых файлов
или файлов справки, файлов баз данных или файлов с исходными текстами
программ, файлов скриптов и другие.
В отдельных случаях к простому имени компонента может быть добавлена
информация об имени объемлющего пакета и о конкретной версии реализации
данного компонента. Необходимо заметить, что в этом случае номер версии
записывается как помеченное значение в фигурных скобках. В других случаях
символ компонента может быть разделен на секции, чтобы явно указать имена
реализованных в нем классов или интерфейсов. Такое обозначение компонента
называется расширенным.
52
Рисунок 19 – Диаграмма компонентов системы
В
центре
диаграммы
находится
исполняемый
файл,
к
которому
подключаются различные библиотеки компьютерного зрения. Данная библиотека
распространяется бесплатно и регулярно выходят обновления, позволяющие
расширить круг применения.
TessBaseApi. - Позволяет использовать обработку графического файла
(изображения).
MediaStore. - Позволяет загружать файлы, полученные со стандартного
приложения “камера”, а также с памяти смартфона.
AndroidWidget. – Позволяет использовать различные компоненты, такие как
текстовые поля, кнопки, списки и т.д.
GraphicsBitmap – библиотека, которая обрабатывает полученное изображение.
2.6 Логика диалога с пользователем
Логика диалога программы с пользователем позволяет показать, каким
образом будет осуществляться взаимодействие пользователя с приложением.
Для представления логики диалога с пользователем используется простая
транзитивная сеть, или иначе называемая, сеть состояний и переходов (рисунок 19).
53
Главное
предназначение
последовательности
этой
состояний
диаграммы
и
переходов,
–
описать
которые
в
возможные
совокупности
характеризуют поведение модели системы в течение ее жизненного цикла.
Рисунок 19 - Алгоритм взаимодействия пользователя с программой
На данной схеме:
s1 – Режим стартового окна
s2 – Режим диалогового окна с информацией о приложении
s3 – Режим окна с областью выделения текста
s4 – Режим диалогового окна с выбором настроек приложения
s5 – Режим окна с результатом распознавания и перевода
t1 – Запуск приложения
t2 – Открытие диалогового окна
t3 – Клик по кнопке «Закрыть»
t4 – Загрузка начальной формы
t7 – Клик по кнопке «Settings»
t8 – Выбор языка распознавания
t9 – Выбор автофокуса
t10 – Выбор стандартного режима автофокуса
t11 – Выбор функции «Просмотр перевода»
t12 – Выбор функции «Звуковой сигнал»
54
t13 – Клик по кнопке «Сфотографировать»
t14 – Переход к распознаванию текста
t15 – Возврат к выделению распознаваемого текста
t16 – Переход текста
t17 – Клик по кнопке «Очистить список»
t18 – Закрытие программы
2.7 Алгоритм работы системы распознавания символов
В соответствии с поставленной задачей на первом этапе происходит запуск
камеры
смартфона,
после
подгружается
список
доступных
языков для
распознавания символов, а затем пользователь выбирает требуемый язык для
распознавания символов или текста. После выбора языка в нейронную сеть
загружается файл с обучением, который помогает персептрону корректно
различать символы или специальные знаки, которые присущи каждому языку.
Перед распознаванием символов сначала требуется обработать изображение,
а именно убрать лишние искажения и “шумы”. Для этого воспользуемся медианной
фильтрацией,
которая
заменяет
элемент
центральной
маски
средой
упорядоченного образца, сформированного из всех амплитуд выборок, покрытых
фильтрующей маской. При применении МФ каждая точка кадра обрабатывается
последовательно, что приводит к последовательности оценок. При медианной
фильтрации используется скользящее двумерное окно. В принципе, для каждого
образца выполняется независимая оценка медианы в окне. Для ускорения оценки
целесообразно использовать алгоритмические вычисления на каждом шаге.
55
Рисунок 20 – Алгоритм работы системы распознавания символов
2.8 Алгоритм сегментации символов
Для
сегментации
символов
использовались
специально
обученные
классификаторы.
В самом начале происходит “подача” изображения, где после происходит
поиск символов (если они присутствуют), после строятся горизонтальные линии.
56
Они помогают определить какие символы требуется в первую очередь
распознавать. Если символы на изображении расположены неровно, то есть
вероятность, что данные символы могут быть перенесены на другую строчку.
На рисунке 21 изображена блок-схема поиска объекта на видео.
Рисунок 21 – Алгоритм поиска автомобилей и пешеходов
2.9 Выводы по второй главе
В рамках второй главы был проведен важный этап проектирования
информационной системы, который позволил, который позволил определить
функциональные требования к системе, схему взаимодействия системы с
пользователем.
Построение UML диаграмм позволило сформировать точное представление
разрабатываемой системы на всех уровнях, а именно были построены диаграммы:
57
− Диаграмма вариантов использования системы;
− Диаграмма деятельности системы;
− Диаграмма классов системы;
− Диаграмма компонентов системы;
− Логика диалога с пользователем.
58
3 РЕАЛИЗАЦИЯ СИСТЕМЫ
3.1 Создание проекта в Android Studio
Android Studio представляет собой интегрированную среду разработки
мобильных приложений (первая стабильная версия которой вышла в 2014 г.) для
операционной системы Android, где одним из языков программирования
официально является язык Java.
Процесс установки и (или) настройки Android Studio достаточно прост и
интуитивно понятен большинству пользователей. В системе реализован механизм
оповещения о доступных обновлениях, которые устанавливаются автоматически.
Помимо Android Studio также может потребоваться установка и (или)
настройка
эмулятора
Android-устройств,
необходимого
для
тестирования
разработанных приложений, например, Genymotion, NOX, BlueStacks и т.д.
Разработка приложения в Android Studio состоит из двух этапов:
− создания оконных форм, или Activity,
− кода программных модулей, что осуществляется на рабочей области,
которая позволяет переключаться между ними в процессе выбора файлов,
входящих в структуру приложения.
Создание нового мобильного приложения в Android Studio начинается с
выбора пункта меню File — New — New Project…
Далее требуется задать имя проекта, а также путь к папке, где он будет
расположен.
Затем нужно выбрать минимальную версию операционной системы Android,
необходимую для запуска приложения.
После чего Android Studio попросит выбрать шаблон приложения из числа
имеющихся. В целях обучения отлично подходит шаблон под именем Empty
Activity, или пустое окно. Как только шаблон будет выбран следует задать имя
главного окна и нажать кнопку «Finish».
После выполнения указанных действий появится окно (рисунок 22).
59
Рисунок 22 - Среда разработки Android Studio
В левой части окна Android Studio отображается структура приложения в
виде папок с файлами, каждый из которых можно открыть для просмотра или
редактирования в правой части окна. Переключение между открытыми файлами
осуществляется путем выбора соответствующих им закладок.
В структуру приложения, разрабатываемого в Android Studio, входят
следующие основные элементы:
− файл AndroidManifest.xml, который находится в папке manifests и
предназначен для редактирования глобальных настроек приложения, таких как:
имя приложения, выбор главного окна и стиля оформления, и пр.;
− файлы с расширением .java, расположенные в папке java. Данные файлы
представляют собой программные модули, код которых пишется на языке
программирования Java;
− файлы с расширением .xml, расположенные в папке res — layout и
содержащие настройки для окон и элементов управления, используемых в
приложении, в формате XML (от англ. eXtensible Markup Language);
− файл string.xml, находящийся в папке res — values, используется для
хранения текстовых констант, используемых в приложении.
60
Проектирование оконной формы осуществляется путем размещения на ней
различных элементов управления, или View, таких как радиокнопки, текстовые
поля, переключатели, кнопки и пр., расположенные на палитре инструментов,
размещенной в левой части редактора оконных форм.
Чтобы добавить нужный элемент управления на форму, необходимо выбрать
его в списке, щелкнув по нему мышкой, а затем перетащить его на форму.
После размещения элемента управления, или компонента, необходимо
произвести настройку его свойств на соответствующей вкладке в правой части
редактора оконных форм, кроме того можно с помощью мыши менять его
положение и (или) размеры.
Чтобы изменить значение какого-либо свойства, требуется щелкнуть
мышкой по полю, напротив его названия, а затем ввести нужное значение.
Все компоненты, размещенные на оконной форме, отображаются в дереве
объектов, которое находится в левом нижнем углу. Переключение между
режимами редактирования оконных форм: в формате XML или в режиме редактора
производится путем переключения соответствующих закладок: Text и Design,
размещенных в нижней части среды разработки Android Studio. Внешний вид
редактора оконных форм показан на рисунке 23.
Рисунок 23 - Редактор оконных форм, или Activity
61
Элементы управления View, размещенные на форме, не выполняют какихлибо действий. Для этого необходимо запрограммировать их реакцию на
конкретные события, например, на нажатие кнопки мышки. Так, в коде программы
описываются методы обработки каких-либо событий, которые затем следует
привязать к компоненту в свойстве onClick, путем указания их имени. Каждому
элементу управления можно присвоить свое собственное имя, по которому к нему
можно обращаться из программы, в свойстве ID.
Элементы управления, или View, по умолчанию размещаются на так
называемых Layout (слоях или группах View), из которых состоит Activity. Каждый
слой Layout обладает своими отличительными особенностями, связанными с
размещением на нем View. По умолчанию в Android Studio версии 2.3 используется
Constraint Layout. К основным элементам управления, помещаемым на форму
Activity, относятся: TextView (текстовая надпись), Button (кнопка), editText (поле
для ввода текста), checkBox (поле для установки/снятия флажка) и пр. Кроме того,
Android
Studio
обеспечивает
программистов
большим
количеством
функциональных возможностей, облегчающим разработку, тестирование и
отладку мобильных приложений.
3.2 Интерфейс мобильного приложения
Весь интерфейс мобильного приложения представляет собой приложение
“Камера”, на которой расположены четыре элемента:
1. Кнопка для фотографирования.
2. Кнопка, показывающая информацию о приложении.
3. Кнопка для настроек мобильного приложения.
4. Прямоугольная рамка для выделения области, которую требуется
распознать.
При запуске мобильного приложения автоматически открывается камера, т.е
запускается модуль “CameraManager” – это родительский класс, который содержит
главный интерфейс управления программой. Особенностью данного модуля
является создание и инициализация основных модулей программы посредством
62
конструкторов объектов соответствующих классов. Запуск камеры осуществляется
следующим кодом:
public synchronized void openDriver(SurfaceHolder holder) throws
IOException {
Camera theCamera = camera;
if (theCamera == null) {
theCamera = Camera.open();
if (theCamera == null) {
throw new IOException();
}
camera = theCamera;
}
camera.setPreviewDisplay(holder);
if (!initialized) {
initialized = true;
configManager.initFromCameraParameters(theCamera);
if (requestedFramingRectWidth > 0 && requestedFramingRectHeight > 0) {
adjustFramingRect(requestedFramingRectWidth, requestedFramingRectHeight);
requestedFramingRectWidth = 0;
requestedFramingRectHeight = 0;
}
}
configManager.setDesiredCameraParameters(theCamera);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
reverseImage = prefs.getBoolean(PreferencesActivity.KEY_REVERSE_IMAGE, false);
}
public synchronized void closeDriver() {
if (camera != null) {
camera.release();
camera = null;
63
framingRect = null;
framingRectInPreview = null;
}
}
Рисунок 24 – Интерфейс приложения
Для реализации кнопки “Сфотографировать” использовался следующий код:
protected void drawableStateChanged() {
super .drawableStateChanged();
final boolean pressed = isPressed();
if (pressed != mOldPressed) {
if (!pressed) {
post(new Runnable() {
public void run() {
callShutterButtonFocus(pressed);
}
});
} else {
callShutterButtonFocus(pressed);
64
}
mOldPressed = pressed;
}
}
private void callShutterButtonFocus(boolean pressed) {
if (mListener != null) {
mListener.onShutterButtonFocus(this , pressed);
}
}
@Override
public boolean performClick() {
boolean result = super.performClick();
playSoundEffect(SoundEffectConstants.CLICK);
if (mListener != null) {
mListener.onShutterButtonClick(this);
}
return result;
}
}
При
реализации
модуля
“Прямоугольная
рамка”
использовалось
динамическое изменение формы для выбора конкретного символа, слова или части
текста. Приложение “проводит” распознавание только внутри выделенной области
и не выходит за ее рамки. Данный модуль реализован с помощью следующего кода:
Point screenResolution = configManager.getScreenResolution();
if (screenResolution == null) {
return null;
}
int width = screenResolution.x * 3/5;
if (width < MIN_FRAME_WIDTH) {
width = MIN_FRAME_WIDTH;
65
} else if (width > MAX_FRAME_WIDTH) {
width = MAX_FRAME_WIDTH;
}
int height = screenResolution.y * 1/5;
if (height < MIN_FRAME_HEIGHT) {
height = MIN_FRAME_HEIGHT;
} else if (height > MAX_FRAME_HEIGHT) {
height = MAX_FRAME_HEIGHT;
}
int leftOffset = (screenResolution.x - width) / 2;
int topOffset = (screenResolution.y - height) / 2;
framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
}
return framingRect;
}
public synchronized Rect getFramingRectInPreview() {
if (framingRectInPreview == null) {
Rect rect = new Rect(getFramingRect());
Point cameraResolution = configManager.getCameraResolution();
Point screenResolution = configManager.getScreenResolution();
if (cameraResolution == null || screenResolution == null) {
return null;
}
rect.left = rect.left * cameraResolution.x / screenResolution.x;
rect.right = rect.right * cameraResolution.x / screenResolution.x;
rect.top = rect.top * cameraResolution.y / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;
framingRectInPreview = rect;
}
return framingRectInPreview;
66
}
public synchronized void adjustFramingRect(int deltaWidth, int deltaHeight) {
if (initialized) {
Point screenResolution = configManager.getScreenResolution();
if ((framingRect.width() + deltaWidth > screenResolution.x - 4) ||
(framingRect.width() + deltaWidth < 50)) {
deltaWidth = 0;
}
if ((framingRect.height() + deltaHeight > screenResolution.y - 4) ||
(framingRect.height() + deltaHeight < 50)) {
deltaHeight = 0;
}
int newWidth = framingRect.width() + deltaWidth;
int newHeight = framingRect.height() + deltaHeight;
int leftOffset = (screenResolution.x - newWidth) / 2;
int topOffset = (screenResolution.y - newHeight) / 2;
framingRect = new Rect(leftOffset, topOffset, leftOffset + newWidth, topOffset +
newHeight);
framingRectInPreview = null;
} else {
requestedFramingRectWidth = deltaWidth;
requestedFramingRectHeight = deltaHeight;
}
}
3.3 Настройки мобильного приложения
При помощи кнопки “Settings” можно настроить приложение, а именно
добавляя новые возможности, а именно:
67
1. Включение “Просмотр перевода”, позволяет просматривать как программа
выделяет символы, слова и корректности перевода. Единственный недостаток
этого метода при распознавании заключается в том, что смартфон требуется
некоторое время держать неподвижно иначе приложение может снова начать
процесс выделения символов, слов или неправильно вывести результат. Данная
функция предназначена только для проверки правильности распознавания слова
или нескольких слов. Также при включении этой функции в нижнем левом углу
дисплея можно отследить время, которое потребовалось приложению на обработку
изображения и распознавания. (рисунок 26)
2. Выбор языка распознавания – позволяет выбирать язык текста, который
требуется распознать. На данный момент приложение может распознавать слова и
символы, написанные только на английском языке.
3. Автофокус – помогает камере фокусироваться при приближении или
отдалении. На некоторых моделях смартфонов, приложение не может использовать
автоматическую фокусировку камеры, т.к производители используют разные
алгоритмы автофокуса и скрывают от конкурентов. Для такого случая и была
добавлена возможность использовать сторонний модуль, который работает на всех
мобильных устройствах. Пример кода для автофокуса:
AutoFocusManager(Context context, Camera camera) {
this.camera = camera;
timer = new Timer(true);
SharedPreferences sharedPrefs =
PreferenceManager.getDefaultSharedPreferences(context);
String currentFocusMode = camera.getParameters().getFocusMode();
useAutoFocus =
sharedPrefs.getBoolean(PreferencesActivity.KEY_AUTO_FOCUS, true) &&
FOCUS_MODES_CALLING_AF.contains(currentFocusMode);
Log.i(TAG, "Current focus mode '" + currentFocusMode + "'; use auto focus? "
+ useAutoFocus);
manual = false;
68
checkAndStart();
}
@Override
public synchronized void onAutoFocus(boolean success, Camera theCamera) {
if (active && !manual) {
outstandingTask = new TimerTask() {
@Override
public void run() {
checkAndStart();
}
};
timer.schedule(outstandingTask, AUTO_FOCUS_INTERVAL_MS);
}
manual = false;
}
void checkAndStart() {
if (useAutoFocus) {
active = true;
start();
}
}
synchronized void start() {
try {
camera.autoFocus(this);
} catch (RuntimeException re) {
Log.w(TAG, "Unexpected exception while focusing", re);
}
}
69
4. Звуковой
сигнал
–
срабатывает,
когда
нажимается
кнопка
“Сфотографировать”
5. Белый и Черный список символов – позволяет добавлять специальные
символы, которые приложение будет “обходить” или наоборот распознавать.
Рисунок 25 – Меню настроек “Settings”
70
Рисунок 26 – Пример работы параметра “Просмотр перевода”
При включенном параметре “Просмотр перевода” запускается следующий
алгоритм распознавания:
1. Выбирается область для распознавания.
2. Приложение начинает разбивку каждого символа по отдельности
(происходит сегментация). (Этот пункт происходит настолько быстро, что
отследить практически невозможно и в итоге пользователь не замечает этого
пункта и сразу видит пункт 3).
3. Система ищет пробелы между первым символом и последним, если они
присутствуют, то приложение “понимает” как слово и уже сегментация
происходит по словам. (На рисунке 26 видно, как приложение выделило по
отдельности каждое слово). Красное выделение над символами означает, что
потребовалось несколько попыток для правильного распознавания, а бирюзовым
цветом малое количество попыток.
4. В верхней части появляется текстовое поле, куда выводится результат
распознавания.
5. Параллельно с 4 пунктом в нижней части приложения выводится
статистика:
71
− Какой язык распознавания выбран;
− mean confidence – среднее значение распознания (в % );
− время, которое приложение затратило на распознавания выделенной
области. Чем больше выделенная области, тем дольше будет происходить
распознавание.
3.4 Выводы по третьей главе
В третьей главе ознакомились с базовым принципом создания приложения в
среде разработке Android Studio. Разработали оформление главной экранной
формы. Подробно разобрали все возможности настройки мобильного приложения,
которые пользователь может активировать или отключить по желанию. Так же был
подробно описан алгоритм распознавания печатных символов с включенной
функцией “Просмотр перевода”.
.
72
4 ПРАКТИЧЕСКИЕ РЕЗУЛЬТАТЫ РАБОТЫ ПРИЛОЖЕНИЯ
После
разработки
приложения
было
проведено
функциональное
тестирование, все реализованные методы были протестированы на корректность
работы.
Тестирование производилось на трех смартфонах Sony Xperia Z2, Sony
Ericsson Neo, Samsung Galaxy Note 3. Характеристики смартфонов приведены в
таблице 1
Таблица 1 - Характеристики мобильных устройств
Sony Ericsson
Samsung Galaxy
Neo
Note 3
Android 4.3
Android 4.0
Android 6.1
2300 МГц
1000 МГц
2260 МГц
4
1
4
3 Гб
512 Мб
3 Гб
Adreno 330
Adreno 205
Adreno 330
Sony Xperia Z2
Версия ОС
Частота
процессора
Количество ядер
процессора
Оперативная
память
Видеопроцессор
Для проверки приложения было взято несколько предложений на английском
языке с разным количеством символов.
На рисунках 27 – 31 показан результат распознавания текста в вечернее время
с комнатным освещение.
Текст 1:
Various algorithms are used in solving problems of object recognition, among
which we can mention: comparison with the template, descriptors of local features, violaJones algorithm, neural networks, etc.
73
Рисунок 27 – Первый тест
Текст 2:
The main purpose of practical training is to study in the framework of research
work. It includes the following tasks set by the supervisor
Рисунок 28 – Второй тест
74
Текст 3:
The character recognition module is executed after receiving data from the camera
Рисунок 29 – Третий тест
Текст 4:
Contour analysis is one of the important and very useful methods of description,
storage, recognition, comparison and search of graphic images and objects.
Рисунок 30 – Четвертый тест
Текст 5:
75
In practice, digital image processing is widely used mask filtration.
Рисунок 31 – Пятый тест
Так же тестирование проводилось в дневное время суток в солнечный день и
в пасмурную погоду.
Результаты тестирования в дневное время в солнечную погоду приведены в
таблице 2.
Таблица 2 - Результаты тестирования в солнечную погоду 1 текста
№ теста
Sony Xperia Z2
Sony Ericsson Neo
Samsung Galaxy Note
3
%
Время,
%
Время,
%
точности
мс
точности
мс
точности
1
98
10493
86
20856
95
12586
2
100
11867
78
22861
92
11861
3
89
12896
75
23156
86
13562
4
95
11969
93
21964
89
10860
5
90
12015
90
20639
90
12367
Время, мс
76
Продолжение таблицы 2
6
96
12896
82
23716
98
11867
7
93
10458
73
21856
100
11854
8
80
10698
85
21473
85
12156
9
100
12753
87
22582
94
11621
10
94
11854
91
23791
97
10202
Среднее
93,5
11790
84
22289
92,6
11894
Результаты тестирования в дневное время в пасмурную погоду приведены в
таблице 3.
Таблица 3 - Результаты тестирования в пасмурную погоду 1 текста
№ теста
Sony Xperia Z2
Sony Ericsson Neo
Samsung Galaxy Note
3
%
Время,
%
Время,
%
точности
мс
точности
мс
точности
1
90
15095
75
26931
95
16887
2
92
16862
73
29354
85
15863
3
85
14593
81
28740
68
14867
4
78
15354
89
27961
72
17962
5
91
14036
74
30750
76
17023
6
86
16970
69
26951
80
16201
7
79
15342
70
27840
91
14963
8
75
14357
72
28961
74
15301
9
86
15030
85
30961
92
17230
10
89
16890
78
26842
83
14961
Среднее
85,1
15453
76,6
28529
81,6
16126
Время, мс
77
По результатам тестирования можно сделать вывод, что распознавание
текста работает корректно, но также присутствуют опечатки в словах. На
мобильных устройствах Sony Xperia Z2 и Samsung Galaxy Note 3 распознавание
происходит намного быстрее чем на Sony Ericsson Neo.
По большей мере все зависит от факторов, таких как плохое освещение,
наличие тени при фотографировании, качество напечатанного текста и камеры в
смартфоне.
Можно заметить, что на рисунке 10 слова “of graphic” приложение
распознало как единое слово “ofgraphic” и на рисунке 7 в слове “framework”
английскую букву r восприняло как букву i “fiamework”.
Так же был добавлен “готовый” модуль Google Translate, позволяющий
переводить распознанный текст на различные языки. Для работы данного модуля
требуется подключение к интернету. Пример работы перевод можно увидеть на
рисунке 32.
Рисунок 32 – Пример перевода распознанного текста
78
ЗАКЛЮЧЕНИЕ
В настоящие время качественные системы распознавания текста достаточно
дороги, поэтому недостаточно широко распространены. Например, FineReader 12
показывает лучший результат. Он великолепно распознает как сканированные, так
и сфотографированные изображения. Данная же система не имеет никаких
ограничений и может быть установлена, например, в бухгалтерии или отделе
кадров любой компании, для автоматизации сбора и обновления данных.
Наше OCR приложение позволяет с достаточно высокой степенью точности
распознавать символы, при наличии различных шумов и помех, благодаря
разработанному алгоритму предварительной обработки изображений и системой
постобработки текста. Скорость и время отклика приложения в ОС Android зависит
от характеристики мобильных устройств.
Слабые мобильные устройства испытывают затруднения при распознавании
большого количества текста и требуется больше времени, чем с более мощными
смартфонами.
Несомненным
преимуществом
нашей
системы
является
возможность быстрой доработки под иной формат документов и интуитивно
понятный интерфейс пользователя.
В дальнейшем планируется разработка web-based прототипа приложения,
расширение возможностей по распознаванию данных: поддержка других видов
документов, борьба с шумами, более качественные метод удаления фона,
видоизменение стандартного алгоритма определения базовой линии (используя
openCV).
79
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1.
Арлазаров, В. Л. Устройство для адаптивного распознавания символов
текстовых документов [Текст] / В. Л. Арлазаров, А. Н. Романов, Н. В. Котович, O.A.
Славин – М.: РосПатент, 2003 – 216с.
2.
Богданов В., Ахметов К. Системы распознавания текстов в офисе. //
Компьютер-пресс — 1999 №3, с.40-42.
3.
Багрова И. А., Грицай А. А., Сорокин С. В., Пономарев С. А., Сытник
Д. А. Выбор признаков для распознавания печатных кириллических символов //
Вестник Тверского Государственного Университета 2010 г., 28, стр. 59-73
4.
Глумов, H.H. Метод отбора информативных признаков на цифровых
изображениях [Текст] / H.H. Глумов, Е. В. Мясников – M.: Физматлит, 2007, № 3,
c. 73−76.
5.
Журавлев, Ю. И. Об алгебраическом подходе к решению задач
распознавания или классификации [Текст] / Ю. И. Журавлев – M.: КомКнига, 1978,
№ 33, - c. 5−67.
6.
Кетков, Ю. Л. Программирование, численные методы [Текст] / Ю. Л.
Кетков, М. Шульц — СПб.: БХВ-Петербург, 2005. -57c.
7.
Квасников В.П., Дзюбаненко А.В. Улучшение визуального качества
цифрового изображения путем поэлементного преобразования // Авиационнокосмическая техника и технология 2009 г., 8, стр. 200-204
8.
Михайлов, H.A. Распознавание изображений с помощью метода
радиальных окрестностей [Текст] / H.A. Михайлов – M.: Компьютерная оптика,
2010, № 3, - c. 399−407.
9.
Павлидис Т. Алгоритмы машинной графики и обработки изображений.
М:, Радиоисвязь, 1986
10.
Славин, O.A. Использование мультимножеств в распознавании
символов [Текст] / O.A. Славин -. М.: КомКнига, 2006, Том № 23, - c. 155−173.
11.
Дэвид Формайс, Жан Понс Компьютерное зрение. Современный
подход, 2004
80
12.
Айзерман М.А., Браверман Э.М., Розоноэр Л.И. Метод потенциальных
функций в теории обучения машин. - М.: Наука, 2004.
13.
Журавлев Ю.И. Об алгебраическом подходе к решению задач
распознавания или классификации // Проблемы кибернетики. М.: Наука, 2005. Вып. 33.
14.
Мазуров В.Д. Комитеты систем неравенств и задача распознавания //
Кибернетика, 2004, № 2.
15.
Потапов А.С. Распознавание образов и машинное восприятие. - С-Пб.:
Политехника, 2007.
16.
Минский М., Пейперт С. Персептроны. - М.: Мир, 2007.
17.
Растригин Л. А., Эренштейн Р. Х. Метод коллективного распознавания.
М. Энергоиздат, 2006.
18.
Рудаков К.В. Об алгебраической теории универсальных и локальных
ограничений для задач классификации // Распознавание, классификация, прогноз.
Математические методы и их применение. Вып. 1. - М.: Наука, 2007.
19.
Фу К. Структурные методы в распознавании образов. - М.: Мир, 2005.
20.
Ковалева И.Л., "Алгоритмы обработки изображений", БНТУ, 2007.
21.
Яне, Б. Цифровая обработка изображений [Текст] / Б. Яне; Пер. с англ.
А.М. Измайлова. – М.: Техносфера, 2007. – 584с.
22.
Гашников, М.В. Методы компьютерной обработки изображений
[Текст] / М.В. Гашников; Под ред. В.А. Сойфера. – М.: Физматлит, 2003. – 784с.
23.
Пшеничкин Е.В. Распознавание рукописных символов с помощью
нейронных сетей методом с обратным распространением ошибки [Текст] / Е.В.
Пшеничкин, М.В. Цуканов, Д.В. Рыженков // Инновационная наука. – 2018. – №2.
– С. 14-16.
24.
Цуканов М.В. Сравнительный анализ алгоритмов распознавания
дорожных знаков [Текст] / М.В. Цуканов, Е.В. Пшеничкин // Инновационная наука.
– 2018. – №4. – С. 66-70.
81
Приложение А
(обязательное)
Листинг программы
Экранная форма мобильного приложения
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"> <SurfaceView
android:id="@+id/preview_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"/>
<edu.sfsu.cs.orange.ocr.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#0000"/> <LinearLayout android:id="@+id/result_view"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/result_view"
android:visibility="gone"
android:padding="4dip">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="12dip">
<LinearLayout
82
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="right|center_vertical">
<ImageView android:id="@+id/image_view"
android:layout_width="160dip"
android:layout_height="wrap_content"
android:maxWidth="160dip"
android:maxHeight="160dip"
android:layout_marginBottom="4dip"
android:adjustViewBounds="true"
android:scaleType="centerInside"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:id="@+id/source_language_text_view_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OCR"
android:textColor="@color/result_minor_text"
android:textStyle="bold"
android:textSize="14sp"
android:paddingRight="4dip"/>
<TextView android:id="@+id/source_language_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/result_minor_text"
android:textSize="14sp"/>
</LinearLayout>
83
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:id="@+id/translation_language_label_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Translation"
android:textColor="@color/translation_text"
android:textStyle="bold"
android:textSize="14sp"
android:paddingRight="4dip"/>
<TextView android:id="@+id/translation_language_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/translation_text"
android:textSize="14sp"
android:text="[Target language]"/>
</LinearLayout>
</LinearLayout>
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView android:id="@+id/ocr_result_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
84
android:textColor="@color/result_text"
android:textColorLink="@color/result_text"
android:textSize="22sp"
android:paddingLeft="12dip"
android:autoLink="web"/>
<TextView android:id="@+id/translation_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/translation_text"
android:textColorLink="@color/translation_text"
android:textSize="22sp"
android:paddingLeft="12dip"
android:autoLink="web"
android:clickable="true"/>
<LinearLayout android:id="@+id/indeterminate_progress_indicator_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<ProgressBar android:id="@+id/progress_small"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="12dip"
android:paddingTop="10dip"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
</LinearLayout>
<RelativeLayout android:id="@+id/camera_button_view"
85
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/status_view_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="#0000"
android:text=""
android:textColor="@color/status_text"
android:textSize="14sp"
android:autoLink="web"
android:clickable="true" />
<edu.sfsu.cs.orange.ocr.camera.ShutterButton
android:id="@+id/shutter_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shutter_button"
android:clickable="true"
android:focusable="true"
android:layout_alignParentRight="true"
android:gravity="center_vertical"
android:layout_marginRight="8dip"
android:layout_marginTop="8dip"
android:scaleType="center"
android:visibility="gone" />
<TextView android:id="@+id/status_view_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#0000"
86
android:text=""
android:textColor="@color/status_text"
android:textSize="14sp"
android:autoLink="web"
android:clickable="true" />
</RelativeLayout>
</FrameLayout>
//---------------------------Распознавание символов-----------------------//
final class OcrInitAsyncTask extends AsyncTask<String, String, Boolean> {
private static final String TAG = OcrInitAsyncTask.class.getSimpleName();
private CaptureActivity activity;
private Context context;
private TessBaseAPI baseApi;
private ProgressDialog dialog;
private ProgressDialog indeterminateDialog;
private final String languageCode;
private String languageName;
private int ocrEngineMode;
OcrInitAsyncTask(CaptureActivity activity, TessBaseAPI baseApi, ProgressDialog
dialog,
ProgressDialog indeterminateDialog, String languageCode, String languageName,
int ocrEngineMode) {
this.activity = activity;
this.context = activity.getBaseContext();
this.baseApi = baseApi;
this.dialog = dialog;
this.indeterminateDialog = indeterminateDialog;
this.languageCode = languageCode;
this.languageName = languageName;
this.ocrEngineMode = ocrEngineMode;
87
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.setTitle("Пожалуйста подождите");
dialog.setMessage("Проверка установки данных...");
dialog.setIndeterminate(false);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);
dialog.show();
activity.setButtonVisibility(false);
}
protected Boolean doInBackground(String... params) {
String destinationFilenameBase = languageCode + ".traineddata";
boolean isCubeSupported = false;
for (String s : CaptureActivity.CUBE_SUPPORTED_LANGUAGES) {
if (s.equals(languageCode)) {
isCubeSupported = true;
}
}
String destinationDirBase = params[0];
File tessdataDir = new File(destinationDirBase + File.separator + "tessdata");
if (!tessdataDir.exists() && !tessdataDir.mkdirs()) {
Log.e(TAG, " Не удалось создать каталог " + tessdataDir);
return false;
}
File downloadFile = new File(tessdataDir, destinationFilenameBase);
File incomplete = new File(tessdataDir, destinationFilenameBase + ".download");
File tesseractTestFile = new File(tessdataDir, languageCode + ".traineddata");
88
if (incomplete.exists()) {
incomplete.delete();
if (tesseractTestFile.exists()) {
tesseractTestFile.delete();
}
deleteCubeDataFiles(tessdataDir);
}
boolean isAllCubeDataInstalled = false;
if (isCubeSupported) {
boolean isAFileMissing = false;
File dataFile;
for (String s : CUBE_DATA_FILES) {
dataFile = new File(tessdataDir.toString() + File.separator + languageCode + s);
if (!dataFile.exists()) {
isAFileMissing = true;
}
}
isAllCubeDataInstalled = !isAFileMissing;
}
boolean installSuccess = false;
if (!tesseractTestFile.exists()
|| (isCubeSupported && !isAllCubeDataInstalled)) {
Log.d(TAG, " Языковые данные для " + languageCode + " не найдено в " +
tessdataDir.toString());
deleteCubeDataFiles(tessdataDir);
try {
Log.d(TAG, " Проверка языковых данных (" + destinationFilenameBase
+ ".zip) в архивах приложения...");
installSuccess = installFromAssets(destinationFilenameBase + ".zip",
tessdataDir,
89
downloadFile);
} catch (IOException e) {
Log.e(TAG, "IOException", e);
} catch (Exception e) {
Log.e(TAG, " Получил исключение ", e);
}
if (!installSuccess) {
Log.d(TAG, "Скачивание " + destinationFilenameBase + ".gz...");
try {
installSuccess = downloadFile(destinationFilenameBase, downloadFile);
if (!installSuccess) {
Log.e(TAG, "Ошибка скачивания");
return false;
}
} catch (IOException e) {
Log.e(TAG, "IOException received
получено в фоновом режиме. Есть соединение с интернетом?");
return false;
}
}
String extension = destinationFilenameBase.substring(
destinationFilenameBase.lastIndexOf('.'),
destinationFilenameBase.length());
if (extension.equals(".tar")) {
try {
untar(new File(tessdataDir.toString() + File.separator +
destinationFilenameBase),
tessdataDir);
installSuccess = true;
90
} catch (IOException e) {
Log.e(TAG, "Ошибка");
return false;
}
}
} else {
Log.d(TAG, " Языковые данные для " + languageCode + " уже установлено в "
+ tessdataDir.toString());
installSuccess = true;
}
File osdFile = new File(tessdataDir, CaptureActivity.OSD_FILENAME_BASE);
boolean osdInstallSuccess = false;
if (!osdFile.exists()) {
languageName = " ориентация и обнаружение сценариев ";
try {
String[] badFiles = { CaptureActivity.OSD_FILENAME + ".gz.download",
CaptureActivity.OSD_FILENAME + ".gz", CaptureActivity.OSD_FILENAME
};
for (String filename : badFiles) {
File file = new File(tessdataDir, filename);
if (file.exists()) {
file.delete();
}
}
Log.d(TAG, " Проверка данных OSD (" +
CaptureActivity.OSD_FILENAME_BASE
+ ".zip) in application assets...");
osdInstallSuccess =
installFromAssets(CaptureActivity.OSD_FILENAME_BASE + ".zip",
tessdataDir, new File(CaptureActivity.OSD_FILENAME));
91
} catch (IOException e) {
Log.e(TAG, "IOException", e);
} catch (Exception e) {
Log.e(TAG, "Got exception", e);
}
if (!osdInstallSuccess) {
Log.d(TAG, "Downloading " + CaptureActivity.OSD_FILENAME + ".gz...");
try {
osdInstallSuccess = downloadFile(CaptureActivity.OSD_FILENAME, new
File(tessdataDir,
CaptureActivity.OSD_FILENAME));
if (!osdInstallSuccess) {
Log.e(TAG, "Download failed");
return false;
}
} catch (IOException e) {
Log.e(TAG, "IOException received");
return false;
}
}
} else {
Log.d(TAG, "OSD file " + tessdataDir.toString());
osdInstallSuccess = true;
}
try {
dialog.dismiss();
} catch (IllegalArgumentException e) {
}
if (baseApi.init(destinationDirBase + File.separator, languageCode,
ocrEngineMode)) {
92
return installSuccess && osdInstallSuccess;
}
return false;
}
private void deleteCubeDataFiles(File tessdataDir) {
File badFile;
for (String s : CUBE_DATA_FILES) {
badFile = new File(tessdataDir.toString() + File.separator + languageCode + s);
if (badFile.exists()) {
Log.d(TAG, "Deleting file " + badFile.toString());
badFile.delete();
}
badFile = new File(tessdataDir.toString() + File.separator + "tesseract-ocr-3.01."
+ languageCode + ".tar");
if (badFile.exists()) {
Log.d(TAG, "Deleting existing file " + badFile.toString());
badFile.delete();
}
}
}
private boolean downloadFile(String sourceFilenameBase, File destinationFile)
throws IOException {
try {
return downloadGzippedFileHttp(new URL(CaptureActivity.DOWNLOAD_BASE +
sourceFilenameBase +
".gz"),
destinationFile);
} catch (MalformedURLException e) {
throw new IllegalArgumentException("Bad URL string.");
}
93
}
private boolean downloadGzippedFileHttp(URL url, File destinationFile)
throws IOException {
Log.d(TAG, "Sending GET request to " + url + "...");
publishProgress("Downloading data for " + languageName + "...", "0");
HttpURLConnection urlConnection = null;
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setAllowUserInteraction(false);
urlConnection.setInstanceFollowRedirects(true);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
if (urlConnection.getResponseCode() != HttpURLConnection.HTTP_OK) {
Log.e(TAG, "Did not get HTTP_OK response.");
Log.e(TAG, "Response code: " + urlConnection.getResponseCode());
Log.e(TAG, "Response message: " +
urlConnection.getResponseMessage().toString());
return false;
}
int fileSize = urlConnection.getContentLength();
InputStream inputStream = urlConnection.getInputStream();
File tempFile = new File(destinationFile.toString() + ".gz.download");
Log.d(TAG, "Streaming download to " + destinationFile.toString() +
".gz.download...");
final int BUFFER = 8192;
FileOutputStream fileOutputStream = null;
Integer percentComplete;
int percentCompleteLast = 0;
try {
fileOutputStream = new FileOutputStream(tempFile);
} catch (FileNotFoundException e) {
94
Log.e(TAG, "Exception.", e);
}
int downloaded = 0;
byte[] buffer = new byte[BUFFER];
int bufferLength = 0;
while ((bufferLength = inputStream.read(buffer, 0, BUFFER)) > 0) {
fileOutputStream.write(buffer, 0, bufferLength);
downloaded += bufferLength;
percentComplete = (int) ((downloaded / (float) fileSize) * 100);
if (percentComplete > percentCompleteLast) {
publishProgress(
"Downloading data for " + languageName + "...",
percentComplete.toString());
percentCompleteLast = percentComplete;
}
}
fileOutputStream.close();
if (urlConnection != null) {
urlConnection.disconnect();
}
try {
Log.d(TAG, "Unzipping...");
gunzip(tempFile,
new File(tempFile.toString().replace(".gz.download", "")));
return true;
} catch (FileNotFoundException e) {
Log.e(TAG, " unzipping.");
} catch (IOException e) {
Log.e(TAG, "Problem unzipping.");
}
95
return false;
}
private void gunzip(File zippedFile, File outFilePath)
throws FileNotFoundException, IOException {
int uncompressedFileSize = getGzipSizeUncompressed(zippedFile);
Integer percentComplete;
int percentCompleteLast = 0;
int unzippedBytes = 0;
final Integer progressMin = 0;
int progressMax = 100 - progressMin;
publishProgress("data for " + languageName + "...",
progressMin.toString());
String extension = zippedFile.toString().substring(
zippedFile.toString().length() - 16);
if (extension.equals(".tar.gz.download")) {
progressMax = 50;
}
GZIPInputStream gzipInputStream = new GZIPInputStream(
new BufferedInputStream(new FileInputStream(zippedFile)));
OutputStream outputStream = new FileOutputStream(outFilePath);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
outputStream);
final int BUFFER = 8192;
byte[] data = new byte[BUFFER];
int len;
while ((len = gzipInputStream.read(data, 0, BUFFER)) > 0) {
bufferedOutputStream.write(data, 0, len);
unzippedBytes += len;
percentComplete = (int) ((unzippedBytes / (float) uncompressedFileSize) *
progressMax)
96
+ progressMin;
if (percentComplete > percentCompleteLast) {
publishProgress("Uncompressing data for " + languageName
+ "...", percentComplete.toString());
percentCompleteLast = percentComplete;
}
}
gzipInputStream.close();
bufferedOutputStream.flush();
bufferedOutputStream.close();
if (zippedFile.exists()) {
zippedFile.delete();
}
}
private int getGzipSizeUncompressed(File zipFile) throws IOException {
RandomAccessFile raf = new RandomAccessFile(zipFile, "r");
raf.seek(raf.length() - 4);
int b4 = raf.read();
int b3 = raf.read();
int b2 = raf.read();
int b1 = raf.read();
raf.close();
return (b1 << 24) | (b2 << 16) + (b3 << 8) + b4;
}
private void untar(File tarFile, File destinationDir) throws IOException {
Log.d(TAG, "Untarring...");
final int uncompressedSize = getTarSizeUncompressed(tarFile);
Integer percentComplete;
int percentCompleteLast = 0;
97
int unzippedBytes = 0;
final Integer progressMin = 50;
final int progressMax = 100 - progressMin;
publishProgress("Uncompressing data for " + languageName + "...",
progressMin.toString());
TarInputStream tarInputStream = new TarInputStream(new BufferedInputStream(
new FileInputStream(tarFile)));
TarEntry entry;
while ((entry = tarInputStream.getNextEntry()) != null) {
int len;
final int BUFFER = 8192;
byte data[] = new byte[BUFFER];
String pathName = entry.getName();
String fileName = pathName.substring(pathName.lastIndexOf('/'),
pathName.length());
OutputStream outputStream = new FileOutputStream(destinationDir + fileName);
BufferedOutputStream bufferedOutputStream = new
BufferedOutputStream(outputStream);
Log.d(TAG, "Writing " + fileName.substring(1, fileName.length()) + "...");
while ((len = tarInputStream.read(data, 0, BUFFER)) != -1) {
bufferedOutputStream.write(data, 0, len);
unzippedBytes += len;
percentComplete = (int) ((unzippedBytes / (float) uncompressedSize) *
progressMax)
+ progressMin;
if (percentComplete > percentCompleteLast) {
publishProgress("Uncompressing data for " + languageName + "...",
percentComplete.toString());
percentCompleteLast = percentComplete;
}
98
}
bufferedOutputStream.flush();
bufferedOutputStream.close();
}
tarInputStream.close();
if (tarFile.exists()) {
tarFile.delete();
}
}
private int getTarSizeUncompressed(File tarFile) throws IOException {
int size = 0;
TarInputStream tis = new TarInputStream(new BufferedInputStream(
new FileInputStream(tarFile)));
TarEntry entry;
while ((entry = tis.getNextEntry()) != null) {
if (!entry.isDirectory()) {
size += entry.getSize();
}
}
tis.close();
return size;
}
private boolean installFromAssets(String sourceFilename, File modelRoot,
File destinationFile) throws IOException {
String extension = sourceFilename.substring(sourceFilename.lastIndexOf('.'),
sourceFilename.length());
try {
if (extension.equals(".zip")) {
return installZipFromAssets(sourceFilename, modelRoot, destinationFile);
99
} else {
throw new IllegalArgumentException("Extension " + extension
+ " is unsupported.");
}
} catch (FileNotFoundException e) {
Log.d(TAG, "Language assets.");
}
return false;
}
private boolean installZipFromAssets(String sourceFilename,
File destinationDir, File destinationFile) throws IOException,
FileNotFoundException {
// Attempt to open the zip archive
publishProgress("Uncompressing data for " + languageName + "...", "0");
ZipInputStream inputStream = new
ZipInputStream(context.getAssets().open(sourceFilename));
for (ZipEntry entry = inputStream.getNextEntry(); entry != null; entry = inputStream
.getNextEntry()) {
destinationFile = new File(destinationDir, entry.getName());
if (entry.isDirectory()) {
destinationFile.mkdirs();
} else {
long zippedFileSize = entry.getSize();
FileOutputStream outputStream = new FileOutputStream(destinationFile);
final int BUFFER = 8192;
BufferedOutputStream bufferedOutputStream = new
BufferedOutputStream(outputStream, BUFFER);
int unzippedSize = 0;
int count = 0;
Integer percentComplete = 0;
100
Integer percentCompleteLast = 0;
byte[] data = new byte[BUFFER];
while ((count = inputStream.read(data, 0, BUFFER)) != -1) {
bufferedOutputStream.write(data, 0, count);
unzippedSize += count;
percentComplete = (int) ((unzippedSize / (long) zippedFileSize) * 100);
if (percentComplete > percentCompleteLast) {
publishProgress("Uncompressing data for " + languageName + "...",
percentComplete.toString(), "0");
percentCompleteLast = percentComplete;
}
}
bufferedOutputStream.close();
}
inputStream.closeEntry();
}
inputStream.close();
return true;
}
@Override
protected void onProgressUpdate(String... message) {
super.onProgressUpdate(message);
int percentComplete = 0;
percentComplete = Integer.parseInt(message[1]);
dialog.setMessage(message[0]);
dialog.setProgress(percentComplete);
dialog.show();
}
@Override
101
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
try {
indeterminateDialog.dismiss();
} catch (IllegalArgumentException e) {
}
if (result) {
activity.resumeOCR();
activity.showLanguageName();
} else {
activity.showErrorMessage("Error app.");
}
}
}
102
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«ОРЛОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИМЕНИ И.С. ТУРГЕНЕВА»
УДОСТОВЕРЯЮЩИЙ ЛИСТ № 166080/п
К ВЫПУСКНОЙ КВАЛИФИКАЦИОННОЙ РАБОТЕ
на демонстрационный материал, представленный в электронном виде
Студента Пшеничкина Евгения Владимировича
шифр 166080/п
Институт приборостроения, автоматизации и информационных технологий
Кафедра информационных систем
Направление 09.04.03 Прикладная информатика
Направленность (профиль) Корпоративные информационные системы
Наименование документа: Демонстрационные плакаты к выпускной
квалификационной работе
Документ разработал:
Студент
Пшеничкин Е.В.
_______________
Руководитель
Рыженков Д.В.
_______________
Нормоконтроль
Загородних Н.А.
_______________
Волков В.Н.
_______________
Документ согласован:
Документ утвержден:
Зав. кафедрой
Орел 2018
103
ИНФОРМАЦИОННО-ПОИСКОВАЯ ХАРАКТЕРИСТИКА
ДОКУМЕНТА НА ЭЛЕКТРОННОМ НОСИТЕЛЕ
Наименование
группы атрибутов
атрибута
Обозначение документа
(идентификатор(ы)
файла(ов))
Наименование документа
4. Внешние
ссылки
6. Характеристики
содержания
Характеристики документа
на электронном носителе
\Плакаты\Презентация.ppt
Демонстрационные плакаты
к выпускной
квалификационной работе
Класс документа
ЕСКД
Вид документа
Оригинал документа на
электронном носителе
Аннотация
Демонстрационный
материал, отображающий
основные этапы выполнения
выпускной
квалификационной работы
Использование документа Операционная система
Windows 10, Microsoft
PowerPoint 2016
Дата и время
26.06.2018
копирования документа
Дата создания документа 12.06.2018
Дата утверждения
25.06.2018
документа
Автор
Пшеничкин Е.В.
Изготовитель
Пшеничкин Е.В.
Ссылки на другие
Удостоверяющий лист
документы
№ 166080/п
Санкционирование
ОГУ имени И.С. Тургенева
Классификация защиты
По законодательству РФ
Объем информации
2 682 709 Б
документа
104
7. Структура
документа(ов)
Наименование плаката
(слайда) №1
Наименование плаката
(слайда) №2
Титульный лист
Наименование плаката
(слайда) №3
Наименование плаката
(слайда) №4
Функциональные требования
Наименование плаката
(слайда) №5
Диаграмма вариантов
использования системы
Наименование плаката
(слайда) №6
Диаграмма деятельности
системы
Наименование плаката
(слайда) №7
Наименование плаката
(слайда) №8
Диаграмма классов
Наименование плаката
(слайда) №9
Наименование плаката
(слайда) №10
Наименование плаката
(слайда) №11
Рекуррентная нейронная сеть
Наименование плаката
(слайда) №12
Результат работы мобильного
приложения
Наименование плаката
(слайда) №13
Результаты тестирования
Наименование плаката
(слайда) №14
Результаты тестирования
Задача распознавания
печатных символов
Системы по оптическому
распознаванию символов
Логика диалога с
пользователем
Алгоритм работы системы
Алгоритм сегментации
печатных символов
105
1/--страниц
Пожаловаться на содержимое документа