Основное содержание этой статьи взято из статьи с заголовком:MDig: Multi-digit Recognition using Convolutional Nerual Network on Mobile, содержание статьи не является построчным переводом этой статьи.Если в процессе чтения вы почувствуете, что что-то не так или что-то неясно, обратитесь к исходному тексту:Web.Stanford.Amount/class/231 на данный момент…
предисловие
Существует огромный спрос на преобразование бумажных документов в цифровые, потому что цифровые документы легче найти. После многих лет исследований и исследований технология OCR (оптическое распознавание символов, оптическое распознавание символов) становится все более и более зрелой.Технология OCR широко используется в полиграфии и полиграфии и может быстро преобразовывать бумажные данные в электронные данные. В последние годы сверточная нейронная сеть (CNN) быстро развивалась и является самой передовой технологией распознавания изображений.Сфера ее применения не ограничивается преобразованием документов и широко используется в распознавании лиц, распознавании чисел, автоматическом вождении и другие поля.
Предыдущие исследования показали, что с помощью CNN распознавание одной цифры может обеспечить уровень ошибок ниже 1%. Для многозначной идентификации некоторые люди также проводят исследования по номеру дома, идентификации транспортного средства VIN (идентификационный номер транспортного средства, идентификационный номер транспортного средства). Однако, насколько нам известно, многозначное распознавание с использованием CNN на мобильных устройствах изучено недостаточно.
Мобильные решения имеют множество преимуществ: они портативны, недороги и имеют удобный интерфейс. Однако у мобильных платформ есть свои ограничения, такие как скорость отклика в реальном времени, ограниченные ресурсы памяти. В частности, запуск CNN на мобильных устройствах представляет собой сложную проблему, поскольку традиционные CNN обычно требуют большого объема памяти. Хотя наличие мощного сервера на стороне сервера для обработки и распознавания изображений может значительно сократить объем вычислений на стороне клиента, для этого решения требуется надежное сетевое соединение с дополнительной сетевой задержкой.
Поэтому в большинстве случаев мы все же отдаем предпочтение клиентским решениям. Чтобы удовлетворить требования мобильных клиентов к производительности, мы оптимизировали систему по следующим аспектам:
-
разделить изображениеЧтобы уменьшить объем вычислений в процессе распознавания, исходное изображение предварительно обрабатывается и цифры сегментируются, а входом в CNN является блок сегментации изображения.
-
Простая архитектура CNNПо сравнению с современными глубокими CNN, предназначенными для распознавания сложных объектов, мы строим неглубокую сеть с меньшим количеством нейронов и обучаем ее только распознаванию рукописных цифр. Простая CNN требует небольшого объема памяти и быстро работает на мобильных устройствах, а результаты экспериментов показывают, что она все еще может достигать приличной точности — частота ошибок менее 1%.
-
Пакетная обработка полносвязных слоевПакетная обработка полностью связанных слоев, повторное использование большего количества параметров и более эффективное локальное кэширование.
Результаты теста показывают, что распознавание одной цифры в наборе данных MNIST все еще может достигать точности Top 1 в 99,07%, несмотря на использование относительно неглубокой CNN. Используя описанный выше метод оптимизации, мы можем обработать кадр изображения примерно за 60 мс, извлекая 32-битные числа. А пакетные полностью связанные слои сокращают время выполнения CNN еще на 12%.
Технические решения
сборочная линия
Как упоминалось ранее, мобильные приложения ограничены требованиями к памяти и низкой задержке, и мы используем несколько методов для преодоления этих ограничений. Процесс идентификации многозначных номеров включает в себя:
-
предварительная обработкаПредварительно обработайте изображение в оттенках серого и используйте обнаружение краев Canny, чтобы найти числа, увеличить числа и установить для фона полностью черный цвет, чтобы уменьшить шум.
-
сегментацияРазделите блоки чисел с помощью контурного поиска и измените их размер до 28x28 для облегчения идентификации. Кроме того, система также вычисляет, какие цифры принадлежат одному и тому же числу, исходя из позиции числа.
-
ИдентифицироватьИспользуйте CNN, чтобы идентифицировать цифры в каждом патче изображения. CNN обучается на главном компьютере, а мобильное устройство загружает обученные параметры. Пакетная программа обрабатывает несколько изображений в полностью связанном слое, ускоряя вычисление CNN.
предварительная обработка
Рисунок 1: Входные и промежуточные изображения на этапах предварительной обработки и сегментации
Пользователи фотографируют цифры, написанные от руки на светлой бумаге или картоне. Однако при реальном освещении тени и зеркальные блики затрудняют сегментацию цифр, что затрудняет прямую идентификацию цифр. Например, на рисунке 1(а) значения цвета чисел близки к теням, поэтому применение глобального порога к изображению не может эффективно отделить числа от фона. Чтобы решить эту проблему, мы сначала выполняем предварительную обработку захваченных изображений. Этап предварительной обработки полезен, потому что он удаляет шум от бумаги и света и только увеличивает масштаб чисел.
В ходе предварительной обработки результаты вычисления краевых признаков Кэнни на изображении передаются в средство поиска контуров, чтобы нарисовать ограничивающую рамку для каждого признака. Результат ограничивающей рамки показан на рис. 1 (б). Чтобы ускорить этап предварительной обработки, размер входного изображения изначально изменяется до 640×480, а значения цвета меняются местами для преобразования светлого фона в темный.
Затем мы определяем порог пикселей в ограничивающей рамке, вычисляя порог, используя следующее уравнение:
阀值 = 均值 + 标准偏差 / 2
Чтобы гарантировать, что порог не зависит от размера поля, средние значения и значения стандартного отклонения рассчитываются с использованием всех пикселей в ограничивающей рамке, а не всех пикселей изображения. Предварительно обработанное изображение показано на рис. 1(c).
Разделите блоки чисел
Даже изменение размера изображения до 640x480 все еще слишком велико для распознавания изображения. Также пользователи могут захотеть написать несколько номеров на одной странице, полезно узнавать каждый номер сразу. Поэтому для решения этих двух проблем вводится шаг сегментации.
Мы сегментируем изображение в два этапа: сначала находим ограничивающую рамку каждой цифры, а затем сегментируем каждую цифру внутри ограничивающей рамки. На первом этапе мы используем средство поиска контуров, чтобы найти каждую цифру и нарисовать ограничивающую рамку вокруг каждой цифры, а затем объединить ограничивающие рамки цифр, принадлежащих одному и тому же числу, путем вычисления и сравнения позиций цифр. Результаты показаны на рисунке 1(d). На втором этапе мы сканируем объединенную ограничивающую рамку слева направо, используя пробелы (пустые столбцы между каждым столбцом), сегментируя блоки цифр. Размер блока цифр изменен на 28×28, поэтому он совместим с входным размером CNN. Сегментированные цифровые блоки показаны на рис. 1(e).
Распознавание цифр с помощью CNN
После цифровой сегментации каждый цифровой бит в исходном изображении последовательно масштабируется в блок изображения 28×28. Патчи изображения загружаются в CNN для распознавания. Мы использовали пользовательскую архитектуру CNN, состоящую из двух сверточных слоев (C1 и C3), двух слоев с максимальным объединением (S2 и S4) и двух полносвязных слоев (F5 и F6), как показано на рисунке 2. Выходные данные F2 передаются на уровень softmax с 10 путями, который создает распределение вероятностей по 10 меткам (т. е. «0» — «9»).
Рисунок 2: Архитектура CNN
Первый сверточный слой (C1) фильтрует входное изображение в градациях серого 28×28 с 8 ядрами размером 5×5, а второй сверточный слой (C3) фильтрует вход с 16 ядрами размером 5×5×8. Карта объектов ×8. Оба сверточных слоя используют единичный шаг. На уровнях S2 и S4 для понижения частоты дискретизации используется неперекрывающийся максимальный пул 2×2. Наконец, два полносвязных слоя F5 и F6 содержат 128 и 10 нейронов соответственно.
Размер всей нейронной сети (например, размер окна свертки, количество слоев, количество ядер и т. д.) близок к LeNet-5, которая представляет собой CNN, используемую на заре распознавания рукописных цифр, но мы уменьшаем полносвязный слой. Однако для построения сети мы использовали более простые, но более популярные компоненты. Например, нелинейная функция ReLU, используемая для вывода сверточных и полносвязных слоев, более эффективна, чем сигмовидная или гиперболическая, и обучается быстрее с той же точностью.
Оффлайн обучение
Мы используем Python для создания и обучения архитектуры CNN, показанной на рисунке 2, используя MNIST в качестве набора данных для обучения. После преобразования байтов с помощью MATLAB каждое входное изображение представляет собой блок чисел 28x28 с серым фоном и белыми числами. Мы вычисляем среднее значение изображения и вычитаем среднее значение из каждого изображения, чтобы сформировать окончательный входной патч. Поскольку входной патч представляет собой одноканальное изображение только с одним объектом в центре, мы не проводили над ним какую-либо аугментацию данных. Чтобы ускорить процесс обучения и уменьшить переоснащение, мы вставляем слой отсева между F5 и F6 с коэффициентом отсева 0,5. Начальная скорость обучения была установлена на 0,01, и при пакетной обработке 100 изображений мы пробовали разные скорости обучения и регуляризацию и обнаружили, что когда скорость обучения составляла 5e-4, а скорость регуляризации была 5e-3, после 5 периодов обучения, модель может достичь точности проверки 99,07%.
Мобильная реализация
Учитывая относительно низкую производительность ЦП и ограниченные ресурсы памяти, реализация CNN на мобильных платформах сопряжена с определенными трудностями. В этом проекте мы создаем CNN на основе DeepBeliefSDK, среды CNN с открытым исходным кодом для мобильных платформ. DeepBeliefSDK реализован с использованием высокооптимизированного кода C++, операция свертки преобразована в обычное матричное умножение (GEMM), и поддерживаются несколько библиотек GEMM. Для платформы Android он реализует GEMM, оптимизированный для NEON, с использованием библиотеки Eigen.
DeepBeliefSDK изначально создавался для AlexNet, но модульность фреймворка позволяет нам многократно использовать код повторно. Поскольку наша CNN использует те же компоненты, что и AlexNet (такие как свертка, полное подключение, ReLU, максимальный пул и слои softmax), мы вызываем внутренние функции и методы класса в DeepBeliefSDK для построения сети вручную. Затем используйте стандартный формат файла DeepBeliefSDK для сохранения сети, чтобы наше основное приложение могло вызывать API-интерфейс библиотеки DeepBeliefSDK для использования фреймворка. Поскольку наша CNN относительно неглубокая, сетевые параметры (в основном 32-битные веса с плавающей запятой) не сжимаются, а вместо этого выгружаются непосредственно в двоичный файл с окончательным размером файла 426 КБ.
эталонная реализация
исходный код
Исходный код проекта находится по адресуgithub.com/jingpu/MDig.
Основной конвейер обработки изображений, включая предварительную обработку, сегментацию и CNN, реализован на C++, построенном с помощью Android NDK 10d, а пользовательский интерфейс приложения использует Android SDK API 21 и библиотеку Java OpenCV. Код C++ зависит от двух библиотек, OpenCV и Наш модифицированный DeepBeliefSDK. Мы собираем DeepBeliefSDK с библиотекой Eigen, используя NDK с оптимизацией NEON, отключая оптимизацию многопоточности в библиотеке Eigen для более последовательного анализа производительности.
Дисплей пользовательского интерфейса
Смотрите демонстрационное видео ниже:
V.QQ.com/small/afraid/you 077…
Это конец этой статьи, следующая статья объяснит, как собрать код и запустить его, так что следите за обновлениями!