Аннотация

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

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

Исследования по улучшению эффективности и универсальности систем OCR имеют большое значение для повышения качества распознавания текста в разных условиях. В таких работах рассматриваются перспективные подходы, такие как аугментация данных, трансферное обучение и специализированные архитектуры нейронных сетей, адаптированные для работы с ограниченными данными. Эти исследования могут привести к созданию более совершенных и доступных систем OCR, что расширит их практическое применение. Улучшение качества распознавания текста позволит автоматизировать процессы обработки информации в бизнесе, образовании, архивировании, научных исследованиях и других областях, способствуя более эффективному взаимодействию с текстовыми данными в цифровую эпоху.

Цели работы

Основные цели:

  1. Разработка новых моделей OCR, устойчивых к нехватке данных: создание моделей, способных эффективно обучаться и функционировать с высокой точностью даже при ограниченном объеме тренировочных данных, особенно для языков с ограниченными ресурсами;

  2. Повышение адаптивности и гибкости OCR-систем: разработка моделей, способных успешно распознавать текст в документах различных стилей, форматов, с нестандартными шрифтами, а также в условиях шумов и искажений (например, на изображениях низкого качества);

  3. Обеспечение независимости точности распознавания от объема обучающей выборки: разработка методов, позволяющих достигать высокой точности распознавания независимо от размера обучающего набора данных, что особенно важно для языков и специализированных областей с ограниченными ресурсами;

Дополнительные цели, учитывающие специфические аспекты:

  1. Улучшение доступности информации для людей с нарушениями зрения: разработка OCR-систем, интегрированных с инструментами озвучивания текста, для обеспечения доступа к информации из печатных и цифровых источников для людей с нарушениями зрения;

  2. Разработка методов OCR для работы с ветхими документами: создание алгоритмов, способных эффективно распознавать текст на поврежденных, выцветших или деформированных документах, в том числе исторических архивах;

  3. Автоматизация обработки больших объемов печатных документов: разработка высокопроизводительных OCR-систем, способных быстро и точно обрабатывать большие массивы печатных материалов, например, в архивах, библиотеках и крупных организациях;

  4. Совершенствование методов перевода графем с цифрового изображения в текстовый формат: исследование и разработка новых алгоритмов для точного и надежного преобразования графических символов (графем) в цифровой текстовый формат, с учетом особенностей различных языков, шрифтов и стилей написания;

  5. Создание мультиязычных и кросс-форматных OCR-систем: разработка универсальных OCR-систем, способных эффективно работать с различными языками и форматами документов без необходимости переобучения или адаптации под каждый конкретный случай;

  6. Разработка OCR-систем с возможностью семантического анализа текста: интеграция OCR с методами обработки естественного языка (NLP) для не только распознавания текста, но и извлечения смысла, ключевых сущностей и взаимосвязей между ними;

Введение

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

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

Традиционные методы машинного обучения, такие как линейные и нелинейные классификаторы, метод K-ближайших соседей и метод опорных векторов (SVM), предлагали решения для задачи распознавания образов задолго до появления глубокого обучения. Эти методы, основанные на ручном извлечении признаков и относительно простых моделях, могут быть применены к задаче распознавания рукописных символов даже при ограниченном объеме данных. Однако, несмотря на свою универсальность, они не способны достичь уровня точности, сравнимого с человеческим, который демонстрируют современные модели глубокого обучения, особенно при работе со сложными рукописными данными, содержащими вариации в стиле написания, шумы и искажения.

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

Несмотря на впечатляющие результаты, CNN имеют существенное ограничение – их эффективность напрямую зависит от объема доступных обучающих данных. Для достижения высокой точности классические CNN требуют огромных объемов размеченных данных, обычно тысячи или десятки тысяч примеров на каждый класс. Кроме того, неотъемлемой частью архитектуры CNN является операция объединения слоев (pooling), которая, хотя и необходима для снижения вычислительной сложности и обеспечения инвариантности к небольшим сдвигам и искажениям, может приводить к потере ценной информации о пространственной структуре объекта. Эта потеря информации может быть особенно критичной при работе с ограниченными данными, где каждый пример имеет большое значение.

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

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

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

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

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

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

Используемые технологии

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

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

Python как используемая технология
Python как используемая технология
  • NumPy: NumPy – это незаменимая библиотека для научных вычислений в Python. Она предоставляет высокопроизводительные инструменты для работы с многомерными массивами, которые являются основным способом представления изображений в компьютерном зрении. NumPy позволяет эффективно выполнять операции над массивами пикселей, такие как изменение размера, нормализация, фильтрация и другие преобразования, необходимые для предобработки изображений перед подачей их в модель глубокого обучения. Благодаря оптимизированным функциям, написанным на C, NumPy обеспечивает высокую скорость вычислений, что особенно важно при работе с большими изображениями или наборами данных. В данной работе NumPy используется для эффективной манипуляции изображениями и подготовки данных для обучения модели.

    NumPy как используемая технология
    NumPy как используемая технология
  • PyTorch: PyTorch – это ведущий фреймворк глубокого обучения, выбранный для реализации и обучения модели OCR. Он предоставляет гибкий и мощный инструментарий для построения и тренировки нейронных сетей, включая сверточные нейронные сети (CNN), которые хорошо зарекомендовали себя в задачах распознавания образов. PyTorch поддерживает динамическое построение вычислительных графов, что упрощает отладку и экспериментирование с различными архитектурами моделей. Кроме того, PyTorch предоставляет широкие возможности для оптимизации моделей, работы с GPU и распределенного обучения, что позволяет эффективно обучать сложные модели на больших наборах данных. В данной работе PyTorch используется для создания, обучения и применения модели CNN для распознавания текста на изображениях, а также для интеграции с другими компонентами системы. Выбор PyTorch обусловлен его гибкостью, производительностью, активным сообществом и наличием предварительно обученных моделей, которые могут быть использованы для ускорения процесса разработки.

PyTorch как используемая технология
PyTorch как используемая технология

Распознавание символов с помощью капсульной сети

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

 Рисунок 1. Модель TextCap для распознавания символов
Рисунок 1. Модель TextCap для распознавания символов

Капсульная часть сети состоит из пяти последовательных уровней, каждый из которых выполняет специфическую функцию в процессе обработки входного сигнала. Первые три уровня представляют собой каскад свёрточных слоев с увеличивающимся количеством фильтров и варьирующимся шагом свертки, что позволяет постепенно наращивать сложность извлекаемых признаков. Четвертый уровень формирует первичные капсулы, агрегируя информацию из предыдущих слоев в компактные векторные представления. Финальный, пятый уровень капсульной сети содержит капсулы высокого уровня, соответствующие различным классам распознаваемых символов.

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

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

 Рисунок 2. Связь декодеров для реконструкции символов.
Рисунок 2. Связь декодеров для реконструкции символов.

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

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

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

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

Реализация на практике модели TextCap

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

Процесс начинается с предварительной обработки изображения рукописного текста. Этот этап критически важен для всего последующего анализа. Изображение преобразуется в оттенки серого, что уменьшает сложность входных данных без существенной потери информации. Затем производится изменение размера изображения до стандартного формата (28x28 пикселей), что обеспечивает единообразие входных данных. Наконец, выполняется нормализация значений пикселей, что помогает стабилизировать процесс обучения нейронной сети.

import torch
import torchvision.transforms as transforms
from PIL import Image

def preprocess_image(image_path):
    # Загрузка изображения и преобразование в оттенки серого
    image = Image.open(image_path).convert('L')
    
    # Определение последовательности преобразований
    transform = transforms.Compose([
        transforms.Resize((28, 28)),  # Изменение размера до 28x28 пикселей
        transforms.ToTensor(),  # Преобразование в тензор PyTorch
        transforms.Normalize((0.5,), (0.5,))  # Нормализация значений пикселей
    ])
    
    # Применение преобразований и добавление размерности пакета
    return transform(image).unsqueeze(0)

# Пример использования
input_image = preprocess_image('handwritten_text.jpg')

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

import torch.nn as nn

class HybridModel(nn.Module):
    def __init__(self):
        # Вызов конструктора родительского класса
        super(HybridModel, self).__init__()
        
        # Создание первого сверточного слоя со следующими параметрами:
        # 1 - количество входных каналов (для изображений в оттенках серого)
        # 256 - количество выходных каналов (число фильтров)
        # kernel_size=9 - размер ядра свертки (9x9 пикселей)
        # stride=1 - шаг, с которым перемещается ядро свертки по изображению
        self.conv1 = nn.Conv2d(1, 256, kernel_size=9, stride=1)

За сверточным слоем следует слой первичных капсул. Этот слой преобразует скалярные выходы предыдущего слоя в векторные представления. Он состоит из 8 типов капсул, каждый из которых реализован как отдельный сверточный слой. Каждая капсула производит 32-мерный вектор выхода.

class PrimaryCaps(nn.Module):
    def __init__(self, num_capsules=8, in_channels=256, out_channels=32):
        # Вызов конструктора родительского класса
        super(PrimaryCaps, self).__init__()
        
        # Создание списка из 8 сверточных слоев (капсул)
        # Каждая капсула преобразует 256 входных каналов в 32-мерный вектор выхода
        self.capsules = nn.ModuleList([
            nn.Conv2d(in_channels, out_channels, kernel_size=9, stride=2, padding=0)
            for _ in range(num_capsules)
        ])
    
    def forward(self, x):
        # Применение каждой капсулы к входным данным
        u = [capsule(x) for capsule in self.capsules]
        # Объединение результатов всех капсул
        u = torch.stack(u, dim=1)
        # Преобразование размерности для получения векторного представления
        u = u.view(x.size(0), 32 * 6 * 6, -1)
        # Применение функции squash для нормализации векторов
        return self.squash(u)
    
    def squash(self, input_tensor):
        # Вычисление квадрата нормы вектора
        squared_norm = (input_tensor ** 2).sum(-1, keepdim=True)
        # Вычисление коэффициента масштабирования
        scale = squared_norm / (1 + squared_norm)
        # Нормализация вектора с сохранением направления
        return scale * input_tensor / torch.sqrt(squared_norm)

Здесь forward-метод выполняет свертку для каждой капсулы, объединяет результаты и применяет функцию squash. Функция squash является ключевой особенностью капсульных сетей - она нормализует длину вектора, сохраняя его направление, что позволяет интерпретировать длину вектора как вероятность наличия объекта.

class DigitCaps(nn.Module):
    def __init__(self, num_capsules=10, num_routes=32 * 6 * 6, in_channels=8, out_channels=16):
        # Вызов конструктора родительского класса
        super(DigitCaps, self).__init__()
        
        # Установка параметров слоя
        self.num_routes = num_routes          # Количество маршрутов от предыдущего слоя
        self.num_capsules = num_capsules      # Количество выходных капсул (по одной на каждую цифру)
        
        # Создание матрицы преобразования для динамической маршрутизации
        self.W = nn.Parameter(torch.randn(1, num_routes, num_capsules, out_channels, in_channels))

    def forward(self, x):
        # Получение размера пакета
        batch_size = x.size(0)
        
        # Добавление необходимых размерностей для матричных операций
        x = x.unsqueeze(2).unsqueeze(4)
        
        # Вычисление предсказаний для маршрутизации
        u_hat = torch.matmul(self.W, x).squeeze(4)
        
        # Инициализация логитов маршрутизации нулями
        b_ij = x.new_zeros(1, self.num_routes, self.num_capsules, 1)
        
        # Итеративный процесс динамической маршрутизации
        num_iterations = 3
        for iteration in range(num_iterations):
            # Вычисление коэффициентов связи через softmax
            c_ij = F.softmax(b_ij, dim=2)
            
            # Взвешенное суммирование предсказаний
            s_j = (c_ij * u_hat).sum(dim=1, keepdim=True)
            
            # Применение функции squash для получения выходных векторов
            v_j = self.squash(s_j)
            
            # Обновление логитов маршрутизации (кроме последней итерации)
            if iteration < num_iterations - 1:
                # Вычисление скалярного произведения для обновления весов
                a_ij = torch.matmul(u_hat.transpose(2, 3), v_j).squeeze(3).squeeze(2)
                # Обновление логитов маршрутизации
                b_ij = b_ij + a_ij.unsqueeze(2).unsqueeze(3)
        
        # Возврат финальных выходных векторов
        return v_j.squeeze(1)

    def squash(self, input_tensor):
        # Вычисление квадрата нормы вектора
        squared_norm = (input_tensor ** 2).sum(-1, keepdim=True)
        # Вычисление коэффициента масштабирования
        scale = squared_norm / (1 + squared_norm)
        # Нормализация вектора с сохранением направления
        return scale * input_tensor / torch.sqrt(squared_norm)

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

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

class Decoder(nn.Module):
    def __init__(self, num_classes=10, output_size=28):
        # Вызов конструктора родительского класса
        super(Decoder, self).__init__()
        
        # Создание последовательности слоев для реконструкции изображения
        self.reconstruct = nn.Sequential(
            # Первый полносвязный слой: преобразует капсульное представление в 512 нейронов
            nn.Linear(16 * num_classes, 512),
            nn.ReLU(inplace=True),  # Функция активации ReLU
            
            # Второй слой: расширяет представление до 1024 нейронов
            nn.Linear(512, 1024),
            nn.ReLU(inplace=True),
            
            # Выходной слой: формирует изображение размером output_size × output_size
            nn.Linear(1024, output_size * output_size),
            nn.Sigmoid()  # Сигмоида для нормализации значений пикселей в диапазоне [0,1]
        )
        
    def forward(self, x, data):
        # Вычисление длины векторов капсул (вероятностей классов)
        classes = (x ** 2).sum(dim=-1) ** 0.5
        # Применение softmax для получения распределения вероятностей
        classes = F.softmax(classes, dim=-1)
        
        # Определение класса с максимальной вероятностью
        _, max_length_indices = classes.max(dim=1)
        # Маскирование входа: оставляем только активации для предсказанного класса
        masked = x * F.one_hot(max_length_indices, num_classes=10).unsqueeze(-1)
        
        # Реконструкция изображения
        reconstructions = self.reconstruct(masked.view(x.size(0), -1))
        # Преобразование выхода в формат изображения (batch_size, 1, 28, 28)
        reconstructions = reconstructions.view(-1, 1, 28, 28)
        
        # Возвращаем реконструированное изображение и вероятности классов
        return reconstructions, classes

Декодер состоит из трех полносвязных слоев с активациями ReLU между ними. Последний слой использует сигмоидную активацию для нормализации выходных значений в диапазоне [0, 1], что соответствует значениям пикселей изображения.

Эта гибридная модель сочетает в себе преимущества капсульных сетей (способность эффективно моделировать иерархические отношения между частями и целым) и автоэнкодеров (способность к реконструкции входных данных).

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

  1. Кросс-энтропийная потеря: вычисляет ошибку классификации, сравнивая предсказанные классы с истинными метками. Она показывает, насколько хорошо модель выполняет задачу классификации.

  2. Среднеквадратичная ошибка: измеряет разницу между реконструированными изображениями и оригинальными изображениями. Она позволяет контролировать качество реконструкции, что особенно важно в задачах, где требуется восстановление входных данных.

  3. Регулирующий параметр (lambda_recon): позволяет регулировать баланс между двумя компонентами потерь. Увеличивая значение lambda_recon, можно усилить влияние ошибки реконструкции, тогда как уменьшение этого значения сделает акцент на ошибке классификации.

def loss_function(reconstructions, classes, images, labels, lambda_recon=0.0005):
    # Вычисляем кросс-энтропийную потерю для задачи классификации
    margin_loss = F.cross_entropy(classes, labels)
    
    # Вычисляем среднеквадратичную ошибку для задачи реконструкции
    reconstruction_loss = F.mse_loss(reconstructions, images)
    
    # Возвращаем комбинированную функцию потерь
    return margin_loss + lambda_recon * reconstruction_loss

Теперь рассмотрим процесс обучения модели. Этот процесс включает несколько ключевых этапов.

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

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

Процесс обучения проходит в цикле по эпохам. Каждая эпоха включает в себя полное прохождение через весь набор данных. В нашем примере мы предусмотрели 10 эпох.

import torch.optim as optim

def train(model, train_loader, optimizer, epoch):
    model.train()  # Переводим модель в режим обучения
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()  # Обнуляем градиенты
        reconstructions, classes = model(data)  # Прямой проход через модель
        loss = loss_function(reconstructions, classes, data, target)  # Вычисляем функцию потерь
        loss.backward()  # Обратное распространение
        optimizer.step()  # Обновляем параметры модели
        
        # Выводим информацию о ходе обучения каждые 100 батчей
        if batch_idx % 100 == 0:
            print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} '
                  f'({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')

# Инициализация модели и оптимизатора
model = HybridModel()  # Создаём экземпляр модели
optimizer = optim.Adam(model.parameters())  # Инициализируем оптимизатор Adam

# Обучение модели
for epoch in range(1, 11):  # 10 эпох
    train(model, train_loader, optimizer, epoch)  # Запускаем процесс обучения

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

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

def augment_capsules(capsules, num_augmentations=5):
    # Получаем размерность входных капсул: размер батча, количество классов и размер капсулы
    batch_size, num_classes, capsule_dim = capsules.size()
    augmented_capsules = []  # Список для хранения аугментированных капсул
    
    for _ in range(num_augmentations):
        # Случайное изменение длины вектора капсулы
        # Генерируем случайные коэффициенты масштабирования от 0.9 до 1.1
        scale = torch.rand(batch_size, num_classes, 1) * 0.2 + 0.9
        scaled_capsules = capsules * scale  # Масштабируем капсулы
        
        # Случайное вращение вектора капсулы
        # Генерируем случайные углы вращения
        theta = torch.rand(batch_size, num_classes, 1) * 2 * math.pi
        # Создаём матрицу вращения из углов
        rotation_matrix = torch.cat([torch.cos(theta), -torch.sin(theta),
                                     torch.sin(theta), torch.cos(theta)], dim=-1)
        rotation_matrix = rotation_matrix.view(batch_size, num_classes, 2, 2)  # Преобразуем в 2x2 матрицу
        
        # Применяем вращение к масштабированным капсулам
        rotated_capsules = torch.matmul(rotation_matrix, scaled_capsules.view(batch_size, num_classes, 2, -1))
        rotated_capsules = rotated_capsules.view(batch_size, num_classes, -1)  # Возвращаем к исходной размерности
        
        # Добавляем аугментированные капсулы в список
        augmented_capsules.append(rotated_capsules)
    
    # Объединяем оригинальные капсулы с аугментированными
    return torch.cat([capsules] + augmented_capsules, dim=0)

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

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

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

def test(model, test_loader):
    model.eval()  # Переводим модель в режим оценки
    test_loss = 0  # Инициализируем переменную для накопления потерь
    correct = 0  # Инициализируем счётчик правильных предсказаний
    with torch.no_grad():  # Отключаем вычисление градиентов для экономии памяти
        for data, target in test_loader:
            reconstructions, classes = model(data)  # Выполняем прямой проход через модель
            # Вычисляем функцию потерь
            test_loss += loss_function(reconstructions, classes, data, target).item()
            # Получаем предсказания модели
            pred = classes.argmax(dim=1, keepdim=True)
            # Сравниваем предсказания с истинными метками
            correct += pred.eq(target.view_as(pred)).sum().item()

    # Вычисляем среднюю потерю и точность
    test_loss /= len(test_loader.dataset)
    accuracy = 100. * correct / len(test_loader.dataset)
    
    # Выводим результаты оценки
    print(f'\nTest set: Average loss: {test_loss:.4f}, '
          f'Accuracy: {correct}/{len(test_loader.dataset)} ({accuracy:.2f}%)\n')
    
    return test_loss, accuracy

# Оценка модели
test_loss, test_accuracy = test(model, test_loader)

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

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

import matplotlib.pyplot as plt

def visualize_reconstructions(model, data_loader, num_images=5):
    model.eval()  # Переводим модель в режим оценки
    with torch.no_grad():  # Отключаем вычисление градиентов для экономии памяти
        for data, _ in data_loader:
            reconstructions, _ = model(data)  # Получаем реконструкции от модели
            break  # Выходим из цикла после получения первого батча
    
    # Создаём фигуру для визуализации
    fig, axes = plt.subplots(2, num_images, figsize=(12, 6))
    for i in range(num_images):
        # Отображаем оригинальные изображения
        axes[0, i].imshow(data[i].squeeze(), cmap='gray')
        axes[0, i].axis('off')  # Убираем оси
        # Отображаем реконструированные изображения
        axes[1, i].imshow(reconstructions[i].squeeze(), cmap='gray')
        axes[1, i].axis('off')  # Убираем оси
    
    plt.tight_layout()  # Убираем лишние отступы
    plt.show()  # Показываем визуализацию

# Визуализация реконструкций
visualize_reconstructions(model, test_loader)

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

В следующем разделе мы рассмотрим результаты распознавания, продемонстрировав, как модель справляется с различными задачами, а также оценим её производительность и точность на тестовых данных.

Результаты распознавания

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

EMNIST-Balanced — это расширенный набор данных, основанный на MNIST, который включает в себя рукописные символы. Этот набор данных содержит как буквы, так и цифры. В EMNIST-Balanced представлено 47 классов, включая 26 заглавных букв (A-Z) и 10 цифр (0-9), а также 11 дополнительных классов для различных вариаций.

EMNIST-Letters — этот набор данных содержит только рукописные буквы. Он является частью EMNIST и включает исключительно заглавные буквы английского алфавита. В EMNIST-Letters представлено 26 классов, соответствующих буквам A-Z.

EMNIST-Digits — также часть EMNIST, этот набор данных включает только рукописные цифры. Он основан на стандартном наборе MNIST, но с некоторыми изменениями для улучшения качества данных. В EMNIST-Digits представлено 10 классов, соответствующих цифрам от 0 до 9.

MNIST (Modified National Institute of Standards and Technology) — это один из самых известных наборов данных для распознавания рукописных цифр. В MNIST содержатся изображения цифр, написанных от руки. В этом наборе данных также представлено 10 классов, соответствующих цифрам от 0 до 9.

Набор данных

Кол-во классов

Размер обучающего набора

Размер тестового набора

EMNIST-Balanced

47

27,000

9,000

EMNIST-Letters

26

145,600

26,000

EMNIST-Digits

10

240,000

40,000

MNIST

10

60,000

10,000

Выбор этих наборов данных обусловлен их разнообразием и сложностью. EMNIST-Balanced представляет собой сбалансированный набор рукописных символов, включающий как буквы, так и цифры, что делает его особенно сложным для классификации. EMNIST-Letters и EMNIST-Digits фокусируются на распознавании букв и цифр соответственно. MNIST является классическим бенчмарком для распознавания рукописных цифр, в то время как Fashion MNIST представляет собой более сложную задачу классификации изображений одежды.

Методология эксперимента была разработана для оценки производительности модели в двух ключевых аспектах:

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

  2. Масштабируемость: дополнительно модель обучалась на полных обучающих наборах для оценки ее способности эффективно использовать большие объемы данных и потенциала для дальнейшего улучшения производительности при наличии дополнительных данных.

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

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

Классификация рукописных символов

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

EMNIST-Balanced

Модель

Полный тестовый набор

200 наборов на класс

Cohen et al.

Dufourq et al.

75.67%

85.23%

-

-

TextCaps

86.23 +/- 0.25%

88.82 +/- 0.27%

EMNIST-Letters

Модель

Полный тестовый набор

200 наборов на класс

Cohen et al.

Wiyatno et al.

83.34%

89.73%

-

-

TextCaps

92.3 +/- 0.2%

90.47 +/- 0.2%

EMNIST-Digits

Модель

Полный тестовый набор

200 наборов на класс

Cohen et al.

Dufourq et al.

92.31%

98.54%

-

-

TextCaps

98.67 +/- 0.15%

97.85 +/- 0.21%

MNIST

Модель

Полный тестовый набор

200 наборов на класс

Sabour

Cires

Wan

99.29%

99.31%

99.33%

-

-

-

TextCaps

99.3 +/- 0.18%

98.68 +/- 0.3%

При анализе результатов на полных наборах данных TextCaps демонстрирует существенное превосходство на EMNIST-Letters, достигая точности 92.3% и превышая результат Wiyatno на 2.57%, что обусловлено улучшенным извлечением иерархических признаков и эффективной обработкой вариативности символов. На наборе EMNIST-Balanced достигнутая точность 86.23% превосходит показатели Dufourq на 1.0%, подтверждая эффективность предложенной архитектуры при работе со сложными формами символов. Для EMNIST-Digits модель достигает впечатляющей точности 98.67%, превосходя результат Dufourq на 0.13%. На наборе MNIST TextCaps показывает сопоставимые результаты (99.3%) с ведущими моделями Sabour (99.29%) и Wan (99.33%), что свидетельствует о достижении теоретического максимума точности для данного набора данных.

Особый интерес представляют результаты на ограниченной выборке в 200 образцов на класс, где для EMNIST-Letters достигнута точность 90.47%, что показывает исключительную эффективность модели в условиях недостатка данных. На EMNIST-Balanced снижение точности до 88.82% относительно некритично, учитывая существенное уменьшение обучающей выборки. Впечатляющий результат 97.85% получен на EMNIST-Digits при ограниченной выборке, показывая минимальную деградацию производительности. Для MNIST точность 98.68% на малой выборке подтверждает эффективность архитектуры.

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

Результаты тестирования функции потерь

Исследование эффективности различных функций потерь и их комбинаций при реконструкции изображений представляет ключевой интерес для оптимизации капсульных нейронных сетей. Экспериментальный анализ проводился на модифицированной архитектуре CapsNet, где основным изменением стало использование полносвязных слоев в декодере вместо стандартной конфигурации. Для всестороннего изучения влияния объема данных на качество реконструкции использовался набор EMNIST-balanced с систематическим варьированием размера обучающей выборки (100, 200, 500 и 1000 образцов на класс).

Анализ эффективности отдельных функций потерь выявил нетривиальные зависимости от размера обучающей выборки. В частности, функция L1 демонстрирует относительно низкую эффективность при ограниченных наборах данных (100-200 образцов), существенно уступая MSE. Однако при увеличении объема обучающей выборки производительность L1 значительно возрастает, превосходя MSE. Бинарная кросс-энтропия (BCE) показала исключительную стабильность, демонстрируя наивысшие значения PSNR во всем диапазоне размеров выборки, что делает ее оптимальным выбором для базовой функции потерь реконструкции.

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

Комбинации функций потерь

Количество тренировочных классов

100

200

500

1000

L1 &

DSSIM

13.43

12.32

14.5

14.04

15.9

15.47

17.5

17.1

L1 &

BCE

14.33

14.57

15.2

15.33

16.55

16.68

18.1

18.15

MSE &

DSSIM

13.61

12.2

14.71

14.03

16.00

15.5

17.3

16.75

MSE &

BCE

14.58

14.59

15.16

15.27

16.55

16.56

17.76

17.78

BCE &

DSSIM

14.62

13.8

15.3

14.8

16.7

16.21

18.08

17.6

Детальный анализ различных комбинаций функций потерь показал, что наиболее эффективными являются пары BCE&DSSIM и L1&BCE. Особого внимания заслуживает функция DSSIM, которая, несмотря на относительно скромные значения PSNR, вносит существенный вклад в качество реконструкции за счет эффективного учета пространственных характеристик изображений. При этом наблюдается четкая зависимость эффективности различных комбинаций от размера обучающей выборки: BCE&DSSIM демонстрирует превосходство при ограниченных наборах данных, тогда как L1&BCE обеспечивает лучшие результаты при увеличении объема обучающей выборки.

Эти закономерности наглядно проиллюстрированы на рисунках 3 и 4, где представлена динамика изменения PSNR для различных конфигураций функций потерь. Рисунок 3 демонстрирует стабильное превосходство BCE над другими одиночными функциями потерь, в то время как рисунок 4 показывает значительное улучшение качества реконструкции при использовании двухдекодерной архитектуры с комбинированными функциями потерь.

Рисунок 3. Изменение PSNR для различных функций потерь
Рисунок 3. Изменение PSNR для различных функций потерь
Рисунок 4. Изменение PSNR для различных комбинаций функций потерь
Рисунок 4. Изменение PSNR для различных комбинаций функций потерь

Заключение

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

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

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

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

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

Список литературы

1. Информационная база Researchgate [Электронный ресурс]. - 2017. - URL: https://www.researchgate.net/publication/267960550_ImageNet_Classification_with_Dee p_Convolutional_Neural_Networks

2. Информационная база psycnet [Электронный ресурс]. - 2017. - URL: https://psycnet.apa.org/record/1992-11189-001

3. Информационная база института Cornell [Электронный ресурс]. - 2017. - URL: https://arxiv.org/abs/1710.09829

4. Информационная база MNIST [Электронный ресурс]. - 2017. - URL: http://yann.lecun.com/exdb/mnist/

5. Информационная база института Cornell [Электронный ресурс]. - 2017. - URL: https://arxiv.org/abs/1202.2745

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


  1. zoldaten
    04.12.2024 09:25

    Потеряли в коде train_loader, test_loader. Хотя, возможно, так задумано.
    Отсюда, наверно, материал - https://github.com/cezannec/capsule_net_pytorch/blob/master/Capsule_Network.ipynb
    Но там по mnist у автора скромнее результаты.
    Возможно, капсульные сети стали лучше спустя время.