"Мобильное приложение для перевода жестов пальцев в текст"

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 28.10.2019
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Правительство российской федерации

Федеральное государственное автономное образовательное учреждение высшего образования

Национальный исследовательский университет

"Высшая школа экономики"

Факультет компьютерных наук

Департамент программной инженерии

Выпускная квалификационная работа

"Мобильное приложение для перевода жестов пальцев в текст"

А.И. Антонов

Москва 2019

Аннотации

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

В работе рассмотрены существующие методы распознавания жестов пальцев и на их основе разработан метод, способный работать на мобильных устройствах с ограниченной вычислительной мощностью. Распознавание жестов производится на карте глубины, захваченной мобильным устройством, в качестве классификатора используется сверточная нейронная сеть на основе MobileNetV2, обученная с использованием техники Transfer Learning. Обучение модели было проведено в облачном сервисе Paperspace с использованием языка программирования Python 3 и библиотеки Keras.

Мобильное приложение для распознавания жестов пальцев было разработано для платформы iOS на языке программирования Swift 4.2. Интеграция модели произведена при помощи библиотек CoreML и Vision.

Работа содержит 40 страниц, 3 главы, 16 рисунков, 2 таблицы, 18 источников, 4 приложения.

Ключевые слова: язык жестов, дактилология, карта глубины, распознавание образов, iOS, CoreML

Nowadays there is a communication problem between deaf and hearing people. The reason behind this is an unpopularity of a sign language. This paper presents a possible solution to this problem - mobile application for translating finger gestures to text.

This paper describes current methods for recognizing fingerspelling gestures and new method which can run on mobile devices with limited computational power. Fingerspelling recognition method uses depth map captured by mobile device as input. Convolution neural network based on MobileNetV2 used as classifier. It was trained by using Transfer Learning technique. Training was implemented in Python 3 with Keras library and run on cloud service Paperspace.

Mobile application for translating finger gestures to text was developed for iOS operating system with Swift 4.2 programming language. Classification was integrated using CoreML and Vision libraries.

The paper contains 40 pages, 3 chapters, 16 illustrations, 2 tables, 18 references and 4 appendices.

Keywords: sing language, fingerspelling, depth map, pattern recognition, iOS, CoreML

Содержание

Введение

Глава 1. Анализ существующих технологий

1.1 Готовые решения распознавания жестов

1.2 Выбор метода распознавания

Глава 2. Метод перевода жестов пальцев в текст

2.1 Обнаружение руки на изображении

2.2 Классификация жестов пальцев

2.3 Формирование слов

Глава 3. Технологии и детали реализации

3.1 Обучение классификатора

3.2 Мобильное приложение

Заключение

Список использованных источников

Определения и сокращения

ASL - American Sign Language, американский язык жестов

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

Датасет - набор данных для обучения и тестирования алгоритмов машинного обучения

Сверточная нейронная сеть - архитектура нейронных сетей для эффективного распознавания образов

Гиперпараметр - параметр обучения или архитектуры нейронной сети

Активация - функция, применяемая к выходному значения слоя в нейронной сети

GPU - графический процессор, специализированный под одновременное выполнение вычислений над большим объемом данных

iOS - операционная система для мобильных устройств

Введение

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

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

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

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

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

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

Рисунок 1. Буквы и цифры ASL

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

Для достижения представленной цели необходимо решить ряд задач:

1. Изучение существующих решений проблемы распознавания жестов пальцев;

2. Определение возможных вариантов улучшений этих решений для работы на мобильном устройстве с ограниченными ресурсами;

3. Анализ датасетов для обучения и тестирования метода распознавания жестов пальцев;

4. Разработка алгоритма для перевода жестов пальцев в текст на основе разработанного классификатора жестов пальцев;

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

6. Тестирование и оценка полученных результатов

7. Написание технической документации

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

Глава 1. Анализ существующих технологий

1.1 Готовые решения распознавания жестов

В настоящее время единственной компанией, которая предоставляет технологии автоматического перевода языка жестов, является компания "SignAll" [1]. Работа этой компании осуществляется только с организациями в США и Канаде. Их услуги включают полную установку и настройку компьютерной системы со специализированными камерами. Для использования системы, необходим доступ к сети Интернет, а пользователи должны надеть специальные перчатки и настроить хорошее освещение. Большинство потенциальных пользователей не могут воспользоваться предложенным решением из-за вышеперечисленных ограничений, также остается неизвестной стоимость данного решения.

В апреле 2018 появилась новость о том, что магистры политехнического института Нью-Йоркского университета разработали мобильный переводчик языка жестов под названием "Augmented Reality Sign Language" [2]. На видеообзоре приложения показана возможность перевода в двух направлениях: с языка жестов и на него, с использованием технологии дополненной реальности. Данное приложение предназначено только для записи на прием в больницах и банках. Помимо нескольких новостей и видеообзоре об этом приложении, больше нет информации, что наводит на мысль, что оно не вышло из стадии прототипа.

Существующие методы

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

Pugeault и Bowden разработали полноценную систему распознавания жестов пальцев с видеопотока [3]. Их система обладает методом классификации, основанном на алгоритме машинного обучения под названием Random Forest (случайный лес), а также использует словарь для коррекции неправильно распознанных слов. Они первые решили проверить гипотезу о том, что использование карт глубин может дать более точные результаты, чем использование обычных изображений. Для захвата изображений и карт глубины использовался бесконтактный сенсорный игровой контроллер Microsoft Kinect.

Создание такой системы ставило перед Pugeault и Bowden ряд задач. Первая задача - это отслеживание руки на видеопотоке и определение описывающего прямоугольника. Решение этой задачи предполагает анализ и распознавание жестов только на статичных кадрах, которые получены путем отбрасывания изображений, значительно отличающихся от предыдущих 10. Значение 10 кадров было подобрано экспериментальным путем.

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

Рисунок 2. Карта глубины перед обнаружением руки

После нахождения региона вокруг руки, его масштабы изменяются до размера 128x128 пикселей, а затем применяется 16 фильтров Габора разных размеров и ориентаций. Полученный вектор, содержащий 1024 значения, подается на вход алгоритму Random Forest.

На наборе данных, полученном от 4 независимых людей, точность метода Pugeault и Bowden в среднем достигла 69% при использовании карт глубин, 73% на цветных изображениях и 75% при их одновременном использовании. Авторы отмечают, что низкий результат для карт глубины компенсируется тем, что они более устойчивы к изменениям в освещении. Также в результате своей работы они выложили в открытый доступ набор изображений и карт глубины, на которых был обучен классификатор.

Однако эта система не может быть реализована на мобильных устройствах из-за большой вычислительной сложности фильтров Габора. Так же авторы заявляют о работе в режиме 30 кадров в секунду на ноутбуке с процессором Intel Core i5, до вычислительных возможностей которого современным мобильным устройствам еще далеко.

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

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

В качестве классификатора используется сверточная нейронная сеть с архитектурой AlexNet. Авторы провели эксперименты с разными режимами обучения модели: обучение с нуля и Transfer learning, когда готовая модель, обученная под схожую задачу, дообучается под наши данные. В качестве базовой модели используется модель, обученная на наборе данных ImageNet. Таким образом их метод берет за основу знания для классификации цветных изображений и адаптирует их для карт глубины.

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

Авторы заявляют, что их классификатор работает быстрее всех рассмотренных ранее методов. Его работа занимает 3 мс на видеокарте Nvidia Titan, вычислительная мощность которой составляет 4,709 TFLOPS, что на порядки больше, чем на мобильном устройстве.

Обоснование разработки метода

Недостаток вышеописанных алгоритмов - предположение о том, что они будут использоваться только на полноценных компьютерных системах. Мобильные устройства не обладают достаточной мощностью для работы таких методов в режиме реального времени. Анализ представленных систем позволяет использовать при разработке собственного метода такие идеи как распознания жестов только на статичных кадрах, алгоритм для определения руки на изображении и использование Transfer learning [5] с моделью, обученной на ImageNet [6].

1.2 Выбор метода распознавания

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

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

Постановка задач реализации метода распознавания

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

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

2. Применить Transfer learning к MobileNetV2, обученной на ImageNet. Выбрать метрики оценки качества. Провести ряд экспериментов, проверив как влияет изменение гиперпараметров на итоговую точность;

3. Реализовать алгоритм нахождения руки на видеопотоке;

4. Реализовать определение отсутствия движения в видеопотоке;

5. Интегрировать все алгоритмы в мобильное приложение на платформе iOS;

Глава 2. Метод перевода жестов пальцев в текст

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

2.1 Обнаружение руки на изображении

люди при использовании языка жестов пальцев задействуют только кисти рук. Таким образом классификатору необходимо подавать на вход карту глубины, содержащую только эту область, коротая задается прямоугольником, описывающим кисть руки. Метод нахождения описывающего прямоугольника кисти был построен на основе работы Pugeault и Bowden [3].

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

Для обнаружения самого близкого объекта к камере в работе [3] выбираются точки, расположенные в диапазоне 20 см от минимального значения на карте глубины. Такое значение порога позволяет захватывать только руку и было подобрано эмпирическим путем. На мобильном устройстве подобный выбор является непригодным в силу того, что расстояние от руки до объектов за ней в большинстве случаев менее 20 см. На основании вышеизложенного был проведен ряд экспериментов и выбрано значение порога для разрабатываемого приложения 15 см.

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

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

a) минимальная точка (b) обход в ширину (c) описывающий руку прямоугольник (d) описывающий кисть прямоугольник

Рисунок 3. Этапы распознавания руки на карте глубины.

После определения региона кисти руки, содержимое описанного прямоугольника приводится к требуемому формату данных классификатора - одноканальное 8-битное изображение с размером 224 x 224 пикселя. Преобразование включает в себя центровку кисти руки и нормирование пикселей. Центровка кисти руки состоит из добавления отступов в 10 пикселей, расположенных по краям. Нормирование пикселей представляет собой отображение значений каждого пикселя в диапазон от 0 до 255, где 0 соответствует минимальному значению на карте глубины, а 255 - сумме минимального значения и порога в 15 см. Результат преобразования показан на рис. 4.

Рисунок 4. Нормализованная карта глубины

2.2 Классификация жестов пальцев

Классификация полученной карты глубины производится при помощи сверточной нейронной сети, созданной на основе архитектуры MobileNetV2 [8].

Архитектура классификатора

В качестве классификатора была выбрана сверточная нейронная сеть по причине высокой точности распознавания жестов пальцев относительно других методов. Авторы работы [4] достигли точности 85.49% со сверточный нейронной сетью, основанной на архитектуре AlexNet. Вычислительная сложность архитектуры AlexNet не позволяет использовать ее на мобильных устройствах для классификации изображений за допустимое время. Учитывая, что время классификации каждого изображения не должно превышать 33 миллисекунд при видеопотоке 30 кадров в секунду, для классификации карты глубины была выбрана сверточная нейронная сеть, основанная на архитектуре MobileNetV2, представленной компанией Google в 2018 году.

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

Рисунок 5. Архитектура bottleneck блока

Bottleneck блок содержит 3 последовательных слоя: расширяющий, сверточный и проецирующий. Результат работы расширяющего слоя - увеличенное количество каналов в данных. Коэффициент увеличения каналов является одним из гиперпараметров. Проведенные эксперименты авторами архитектуры MobileNetV2 показали, что лучший результат достигается при значении коэффициента увеличения каналов равном 6. Далее к данным применяется свертка с размером ядра 3х 3 без изменения количества каналов, после чего слой проекции обратно уменьшает размерность входных данных. Данная структура основана на предположении, что модель может хранить знания в сжатом формате путем уменьшения размерностей промежуточных данных, что в свою очередь делает вычислительную сложность меньше. Расширяющий и проецирующий слой представляют собой pointwise свертку - свертку с размером ядра 1х 1 с обучаемыми параметрами, что позволяет модели учиться распаковывать и сжимать данные в bottleneck блоке. Выходной тензор блока соединен с выходным residual connection (соединение быстрого доступа) для повышения стабильности обучения модели и предотвращения переобучения [10], когда модель дает корректные предсказания только для данных из тренировочного множества.

Общая архитектура классификатора, основанного на MobileNetV2 представлена на табл. 1. Она состоит из входного слоя свертки с размером ядра 3х 3, за которым следуют девятнадцать bottleneck блоков, слой свертки и полносвязный слой. К выходному слою каждого блока свертки применяется Batch normalization [11] и активация ReLU6 [12], к полносвязному слою - активация Softmax. Итоговый размер модели составил 9.2 Мб, в то время как у AlexNet - 240 Мб.

Таблица 1

Архитектура классификатора, основанная на MobileNetV2

Размер входа

Тип слоя

Кол-во повторений

224х 224х 3

Сверточный, ядро 3x3

1

112х 112х 32

Bottleneck

1

112x112x16

Bottleneck

2

56x56x24

Bottleneck

3

28x28x32

Bottleneck

4

14x14x64

Bottleneck

3

14x14x96

Bottleneck

3

7x7x160

Bottleneck

1

7x7x320

Сверточный, ядро 1x1

1

7x7x1280

Глобальный средний пулинг

1

1x1x1280

Полносвязный

1

1x1x31

Выходной

Набор данных для обучения и тестирования

Для обучения сверточной нейронной сети и анализа полученного результата необходим набор данных, где для каждой единицы указано к какому классу она принадлежит. Общее количество классов представленной работы - 31. Множество классов состоит из жестов для букв латинского алфавита за исключением букв J и Z, которые включают движение, и цифр за исключением 0, 2, 6, имеющих общие жесты с буквами O, V и W соответственно и различающихся по контексту. Так как метод основывается на анализе карт глубины, то набор данных представляет собой карты глубины для каждого из 31 классов.

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

С целью расширения набора данных для обучения классификатора разрабатываемого приложения было проведено исследование на пригодность тестовых наборов данных работ [3] и [4]. В работе [3] авторы выделяли руку целиком, без сегментации кисти, как изображено на рис. 6, а карты глубины были захвачены при помощи Microsoft Kinect с низким разрешением, что делает их полностью непригодными для обучения нашего классификатора.

Рисунок 6. Карта глубины из работы [3]

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

Рисунок 7. Карта глубины из работы [4]

В связи с тем, что уже существующие наборы данных оказались непригодными, было решено собрать собственные. В приложении был разработан модуль захвата данных, изображённый на рис. 8. Он позволяет автоматически захватывать 200 карт глубины для каждого изображения и указывать id пользователя, с которого собираются жесты. Данные были собраны с 6 пользователей, что в итоге дает 1200 карт глубины для каждого класса и 37 200 в общем.

Рисунок 8. Модуль захвата данных

Чтобы избежать переобучения модели и увеличить вариативность данных при обучении классификатора применяется аугментация данных, которая заключается в применении преобразований к исходным данным, таких как: поворот в диапазоне [-12, 12] градусов, случайный горизонтальный и вертикальный сдвиг в пределах 10% от размера изображения, масштабирование с коэффициентом в диапазоне [0.94, 1.04] и случайное зеркальное отображение относительно вертикальной оси, которое позволяет классификатору одновременно распознавать жесты левой и правой руки.

Обучение классификатора

В работе [4] был проведен обширный эксперимент с двумя способами обучения сверточной нейронной сети: обучение с нуля и Transfer Learning [5]. При обучении с нуля авторы получили точность распознавания жестов 99% для людей из обучающей выборки, но при тестировании на других - 78.39%. Так как мобильный переводчик с языка жестов предназначен для широкого круга людей, необходимо повышать точность модели в общем случае, независящем от конкретных людей и данных. Это позволяет сделать метод обучения Transfer Learning, с помощью которого авторы работы [4] достигнули точности 85.49% для людей не из обучающей выборки.

Основная идея Transfer Learning заключается в использовании знаний модели, обученной на схожей задаче - это позволяет значительно сократить время обучения и получить высокую точность в общем случае. В работе [4] в качестве базовой модели использовался AlexNet обученный для классификации изображений из набора данных ImageNet. Несмотря на то, что карты глубины представляют собой черно-белые изображения, в то время как изображения из ImageNet - цветные, авторам удалось достигнуть хорошей точности. Это можно объяснить большим количеством данных в ImageNet: при обучении на таком объеме сверточная нейронная сеть становится аппроксимацией визуальных образов, то есть обучается находить общие признаки для всех изображений, такие как: прямые контуры, углы, кривые и окружности. Отдельно стоит отметить полносвязный слой на выходе сверточной сети: ему подаются на вход общие признаки из сверточного слоя, а выдает он вероятности для каждого класса набора данных, на которых он был обучен. Этот слой специализирован для решения исходной задачи с конкретным количеством классов, поэтому при обучении модели под задачу распознавания жестов пальцев этот слой полностью заменяется. Исходя из вышесказанного было решено использовать Transfer Learning для MobileNetV2, обученной на ImageNet.

С практической точки зрения применение Transfer Learning состоит из двух этапов: обучение с нуля нового полносвязного слоя и подстройка сверточных слоев. Обучение полносвязного слоя включает следующие этапы, изображенные на рис. 9:

1. Замена исходного полносвязного слоя с 1000 выходами для классов ImageNet на слой с 31 выходами для классов жестов пальцев, параметры которого случайно инициализированы;

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

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

a) Исходная модель b) Замена полносвязного слоя с) Заморозка сверточных слоев d) Обучение полносвязного слоя

Рисунок 9. Этапы обучения полносвязного слоя

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

1. Разморозка параметров сверточных слоев, которые нужно подстроить

2. Обучение модели

1.

a) Разморозка сверточных слоев b) Обучение модели

Рисунок 10. Этапы настройки сверточных слоев

В качестве функции ошибки при обучении используется кросс-энтропия (1).

(1)

где M - количество классов, log - натуральный логарифм, уo, c - 0, если o корректная классификация для класса c, 1 в ином случае, po, c - полученная вероятность o для класса c.

Оценка качества модели

Для анализа качества обучения модели, используемой в мобильном приложении для распознавания жестов пальцев, были рассмотрены несколько метрик. При обучении модели крайне важно выбрать метрики, которые будут показывать ее качество при использовании в мобильном приложении для распознавания жестов пальцев. Одна из самых распространенных метрик для оценки модели - точность (accuracy), которая вычисляется как отношение корректно классифицированных изображений к общему количеству изображений в выборке (2).

(2)

где T - количество верно классифицированных изображений, N - общее количество изображений в тестовой выборке

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

F1-мера, в качестве метрики, представляет собой гармоническое среднее между Precision и Recall (3). Precision представляет собой точность модели относительно заданного класса, то есть отношение количества изображений принадлежащих этому классу к общему количеству изображений, которые классификатор отнес к этому классу (4). Recall - полнота, отношение количества изображений которые классификатор корректно отнес к этому классу к общему количеству изображений этого класса в тестовой выборке (5).

(3)

(4)

где TP - правильное положительное решение, FP - ложное положительное решение.

(5)

где FN - ложное отрицательное решение.

Исходя из всего вышесказанного, метрикой для оценки модели была выбрана F1-мера для каждого класса.

Полученные результаты

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

Рисунок 11. Точность и функция ошибки при обучении полносвязного слоя

Рисунок 12. Точность и функция ошибки при подстройке сверточных слоевТаблица 2

F1-мера классификатора жестов пальцев

Класс

F1-мера

Precision

Recall

Класс

F1-мера

Precision

Recall

1

0.956

0.933

0.980

h

0.980

0.995

0.965

2

0.993

0.985

1.000

i

0.964

0.938

0.990

3

1.000

1.000

1.000

k

0.939

1.000

0.885

4

0.983

0.966

1.000

l

0.941

0.896

0.990

5

0.978

0.966

0.990

m

0.795

0.660

1.000

6

0.876

0.927

0.830

n

0.995

1.000

0.990

7

1.000

1.000

1.000

o

0.849

0.904

0.800

8

0.992

0.995

0.990

p

0.195

0.322

0.140

9

0.791

0.909

0.700

q

0.990

0.990

0.990

a

0.737

0.983

0.590

r

1.000

1.000

1.000

b

0.973

0.948

1.000

s

0.901

1.000

0.820

c

0.958

1.000

0.920

t

0.651

0.483

1.000

d

0.778

0.875

0.700

u

0.985

1.000

0.970

e

0.703

0.561

0.940

x

0.987

1.000

0.975

f

0.180

0.292

0.130

y

0.978

0.957

1.000

g

0.995

0.995

0.995

Итоговая точность классификатора на тестовом наборе данных - 87.91 %. Самые низкие значения F1-меры у букв F и P, 0.18 и 0.195 соответственно. Это объясняется неправильным выполнением жестов F и P человеком, с которого была собрана тестовая выборка данных.

2.3 Формирование слов

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

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

Результат каждой классификации добавляется в кольцевой буфер максимального размера 45, который сбрасывается при обнаружении движения на видеопотоке. Окончательная классификация производится при выполнении следующих условий: в буфере хранятся результаты классификации как минимум для 8 кадров и максимальное среднее значение для всех классификаций превышает заданный порог. Порог был подобран таким образом, чтобы при малом количестве классификаций он был высокий и постепенно уменьшался (6). При минимальном количестве кадров равном 8 значение порога - 0,936, а при максимальном равном 45 - 0,825.

(6)

После окончательной классификации соответствующий символ добавляется в конец текущего текста. Символы, которые соответствуют одновременно букве и цифре, такие как 0/O, 2/V и 6/W различаются по контексту: если предыдущий символ пробел или цифра, то добавляется цифра, но если позже после этой цифры добавляется буква, то цифра меняется на букву.

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

Глава 3. Технологии и детали реализации

3.1 Обучение классификатора

Обучение классификатора осуществляется при помощи библиотеки машинного обучения Keras [14] на языке программирования Python 3 в облачном сервисе Paperspace [15].

Язык программирования

Языком программирования для обучения классификатора был выбран Python 3. Вокруг него сложилась стабильная инфраструктура для работы с моделями машинного обучения, а его краткость позволяет быстро проводить эксперименты и проверять гипотезы.

Transfer Learning

Библиотека машинного обучения Keras позволяет взаимодействовать с моделями в привычном объектно-ориентированном стиле. Благодаря этому код обучения Transfer Learning получается небольшим:

IMG_SHAPE = (224, 224, 3)

// Скачивание предобученной MobileNetV2 без полносвязного слоя

base_model = keras.applications.MobileNetV2(input_shape=IMG_SHAPE, include_top=False, weights='imagenet')

// Заморозка сверточных слоев

base_model.trainable = False

// Добавление полносвязного слоя

model = keras.Sequential([

base_model,

keras.layers.GlobalAveragePooling2D(),

keras.layers.Dense(31, activation='softmax')

])

// Обучение

model.compile(optimizer=keras.optimizers.RMSprop(lr=1e-4),

loss='categorical_crossentropy',

metrics=['accuracy'])

training_steps = training_generator.n // batch_size

validation_steps = validation_generator.n // batch_size

history = model.fit_generator(training_generator,

steps_per_epoch = training_steps,

epochs=10,

workers=4,

validation_data=validation_generator,

validation_steps=validation_steps)

Конвертация в формат CoreML

Coremltools - библиотека для работы с форматом CoreML [16], который используется для запуска обученной модели в мобильном приложении. Она включает в себя конвертеры для популярных библиотек машинного обучения. Фрагмент кода, используемый для конвертации Keras формата в CoreML приведен ниже:

coreml_model = coremltools.converters.keras.convert(model, input_names="image", output_names="result", image_input_names="image", image_scale = 1./255, class_labels="classLabels.txt")

coreml_model.save("FingerspellingRecognizer.mlmodel")

Облачный сервис Paperspace

Обучение моделей машинного обучения - это очень вычислительно-затратная задача, которая хорошо распараллеливается, что позволяет запускать ее на GPU и тратить на порядки меньше времени по сравнению с CPU. В то же время подходящие GPU имеют высокую цену для обучения одной модели, поэтому было решено воспользоваться облачным сервисом, который предлагает в аренду вычислительные мощности GPU. Выбор сервиса Paperspace был обусловлен соотношением цены и качества, а так же его простотой: он позволяет запускать интерактивную среду программирования Jupyter Notebook с выбором модели GPU и списком установленных библиотек как показано на рис. 13.

Рисунок 13. Запуск интерактивной среды выполнения на сервисе Paperspace

3.2 Мобильное приложение

Мобильное приложение для платформы iOS было при помощи IDE Xcode 10.1 на языке программирования Swift 4.2 с использованием архитектуры MVC [17].

Язык программирования

Язык программирования Swift 4.2 поддерживает несколько парадигм, включая объектно-ориентированную, что позволяет использовать подходящие абстракции для каждой задачи. Компилятор Swift содержит применяет множество оптимизаций с исходному коду, что позволяет писать алгоритмы и структуры данных и получать производительность сравнимую с С/С++.

Обработка видеопотока

В мобильном приложении необходим доступ к синхронизированным картам глубины и цветным кадрам. Поэтому работа с системной библиотекой AVFoundation, которая абстрагирует детали доступа к потоку карт глубины и цветных кадров с камеры iOS устройства инкапсулирована в классе CaptureSession, публичный интерфейс которого представлен ниже:

class CaptureSession : NSObject {

weak var delegate: CaptureSessionDelegate?

lazy var previewLayer: AVCaptureVideoPreviewLayer { get set }

func startSession() // Запустить захват кадров

func stopSession() // Остановить захват кадров

}

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

protocol CaptureSessionDelegate: class {

func didOutputSynchronizedData(syncedDepthData: AVCaptureSynchronizedDepthData, syncedVideoData: AVCaptureSynchronizedSampleBufferData)

}

В CaptureSession синхронизация происходит при помощи вспомогательного класса AVCaptureDataOutputSynchronizer в отдельном от главного потоке, чтобы не блокировать обновление UI:

let videoDataOutput = AVCaptureVideoDataOutput()

let depthDataOutput = AVCaptureDepthDataOutput()

let dataOutputQueue = DispatchQueue(label: "fingerspelling.videoOutput", qos: .userInitiated, attributes: [], autoreleaseFrequency: .workItem)

let outputSynchronizer = AVCaptureDataOutputSynchronizer(dataOutputs: [videoDataOutput, depthDataOutput])

outputSynchronizer.setDelegate(self, queue: dataOutputQueue)

extension CaptureSession: AVCaptureDataOutputSynchronizerDelegate {

func dataOutputSynchronizer(_ synchronizer: AVCaptureDataOutputSynchronizer,

didOutput synchronizedDataCollection: AVCaptureSynchronizedDataCollection) {

guard let syncedDepthData: AVCaptureSynchronizedDepthData =

synchronizedDataCollection.synchronizedData(for: depthDataOutput) as? AVCaptureSynchronizedDepthData,

let syncedVideoData: AVCaptureSynchronizedSampleBufferData =

synchronizedDataCollection.synchronizedData(for: videoDataOutput) as? AVCaptureSynchronizedSampleBufferData else {

// Проверяем что присутствуют все данные

return

}

if syncedDepthData.depthDataWasDropped || syncedVideoData.sampleBufferWasDropped {

// Проверяем что данные не устаревшие

return

}

// Передаем синхронизированные данные собственному делегату

delegate?.didOutputSynchronizedData(syncedDepthData: syncedDepthData, syncedVideoData: syncedVideoData)

}

}

Распознавание жестов

Классификация нормализованной карты глубины осуществляется в классе GestureClassifier c интерфейсом:

class GestureClassifier {

weak var delegate: GestureClassifierDelegate?

func recognize(image: CGImage)

}

Так как метод recognize(image:) работает асинхронно, то для получения результатов необходимо реализовать протокол GestureClassifierDelegate:

protocol GestureClassifierDelegate: class {

func recognized(results: [String: Float])

}

Запуск обученной модели осуществляется при помощи библиотеки CoreML. Так как перед запуском необходимо преобразовать изображение в нужный формат и размер, для этого используется библиотека Vision [18], которая делает это автоматически перед запуском модели:

let model = try! VNCoreMLModel(for: FingerspellingRecognizer().model)

let visionRequest = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in

self?.processClassifications(for: request, error: error)

})

visionRequest.imageCropAndScaleOption = .scaleFit

private func processClassifications(for request: VNRequest, error: Error?) {

guard let results = request.results else {

print("Vision request failed. \(error?.localizedDescription ?? "")")

return

}

let classifications = results as! [VNClassificationObservation]

let dict = [String: Float](uniqueKeysWithValues: classifications.map { ($0.identifier, $0.confidence) })

delegate?.recognized(results: dict)

}

В начале вызова метода recognize(image:) проверяется, что указатель currentProcessedImage, в котором хранится текущее распознаваемое изображение - нулевой. Это гарантирует, что в любой момент времени происходит максимум одно распознавание и система не перегружена. Распознавание происходит на отдельном потоке, чтобы не блокировать основной, где происходит обновление UI:

func recognize(image: CGImage) {

guard currentProcessedImage == nil else { return }

currentProcessedImage = image

processingQueue.async {

defer { self.currentProcessedImage = nil }

let handler = VNImageRequestHandler(cgImage: image, orientation: GestureClassifier.exifOrientationFromDeviceOrientation())

do {

try handler.perform([self.visionRequest])

} catch {

print("Failed to perform classification. \(error.localizedDescription)")

}

}

}

Формирование слов

За формирование слов и вводимого жестами текста в целом отвечает класс WordComposer:

class WordComposer {

struct CurrentLetter {

enum Confidence {

case low, medium, high

}

let letter: String

let confidence: Confidence

}

var currentText: String

var currentLetter: CurrentLetter?

func add(classifications: [String : Float])

func clearClassifications()

func removeLastLetter()

}

Свойство currentText содержит текущий распознанный текст, а currentLetter - наиболее вероятный символ, который пользователь сейчас показывает, вместе со степенью уверенности: low - скорее всего ошибочно распознанный символ, medium - уверенно распознанный символ, но все же добавить его к тексту пока нельзя, high - очень высокая степень уверенности, символ добавляется в текст.

В методе add(classifications:) происходит обновление текущих накопленных классификаций:

func add(classifications: [String: Float]) {

let previousSampleCount = sampleCount // Текущее количество классификаций

sampleCount = min(bufferSize, sampleCount + 1)

for (key, value) in classifications {

if currentLetterResults[key] == nil {

// кольцевой буфер с максимальным размером bufferSize(45 по умолч.)

currentLetterResults[key] = CircularBuffer<Float>(capacity:bufferSize)

}

// Средние значения кэшируются

if currentLetterMeans[key] == nil {

currentLetterMeans[key] = 0

}

if let replacedValue = currentLetterResults[key]!.addOrReplace(value: value) {

// Если буфер переполнен, то убираем старое значение из среднего

currentLetterMeans[key] = currentLetterMeans[key]! - replacedValue / Float(previousSampleCount)

}

// Пересчет среднего с учетом нового значения

currentLetterMeans[key] = (currentLetterMeans[key]! * Float(previousSampleCount) + value) / Float(sampleCount)

}

// Обновление текущего символа

updateCurrentLetter()

}

Метод updateCurrentLetter() обновляет текущий распознанный символ и если необходимо добавляет его к текущему распознанному тексту:

private func updateCurrentLetter() {

// Проверяем, что количества классификаций хватает для надежного распознавания

guard sampleCount > framesBeforeRecognition else { return }

let maxConfidenceLetter = currentLetterMeans.max(by: { return $0.value < $1.value })!

// У распознавания максимальная уверенность, добавляем символ в текст

if maxConfidenceLetter.value > 0.96 - Float(sampleCount) * 0.003 {

resetSpaceThrottler()

// Если распознанный символ повторяется, то делаем паузу чуть больше

if let lastChar = currentText.last, String(lastChar) == maxConfidenceLetter.key, sampleCount < framesBetweenSameResults {

return

}

currentText.append(maxConfidenceLetter.key)

clearClassifications()

} else if maxConfidenceLetter.value > 0.4 {

let confidence: CurrentLetter.Confidence

if maxConfidenceLetter.value > 0.6 {

confidence = .medium

resetSpaceThrottler()

} else {

confidence = .low

}

currentLetter = CurrentLetter(letter: maxConfidenceLetter.key,

confidence: confidence)

} else {

currentLetter = nil

if !spaceThrottler.isValid {

resetSpaceThrottler()

}

}

}

Метод resetSpaceThrottler() отвечает за запуск таймера, после которого в текст добавляется пробел:

private func resetSpaceThrottler() {

spaceThrottler.throttle { [weak self] in

// Проверка что последний символ не пробел

if let lastChar = self?.currentText.last, lastChar != " " {

self?.currentText.append(" ")

}

}

}

Общая архитектура

Архитектура приложения была построена на основе паттерна Model-View-Controller (MVC), рекомендуемого компанией Apple для создания приложений на платформе iOS. Диаграмма классов приведена на рис. 14.

Рисунок 14. Общая архитектура приложения

Интерфейс приложения

Графический интерфейс приложения построен при помощи высокоуровневой библиотеки UIKit. При открытии приложения показывается основной экран приложения - экран ввода жестами пальцев, изображенный на рис 15. Внизу располагается распознанный текст и текущий символ красного цвета, если уверенность распознавания низкая и желтым - если средняя. Область распознанной кисти показана зеленым прямоугольником поверх видеопотока. При нажатии на кнопку Debug в правом левом углу открывается экран настроек, который показан на рис. 16. Помимо изменения значений настроек из него можно попасть на экран сбора данных для обучения, ранее продемонстрированный на рис. 8.

Рисунок 15. Экран распознавания

Рисунок 16. Экран настроек

Заключение

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

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

Для обучения классификатора был собран набор карт глубины каждого жеста с 6 человек. Общее количество карт глубины в собранном наборе - 37200. Позже планируется опубликовать набор данных для возможного использования исследователями при разработке новых методов.

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

В рамках технического направления предполагается работа над методом распознавания. Основное улучшение, которое поможет повысить точность для всех пользователей - персонализация классификатора. При запуске приложения пользователю будет предложено показать все жесты, после чего полученные карты глубины отправляются на сервер, где они используются для обучения персонализированной модели. После обучения модели сервер отправляет ее в приложение и точность распознавания жестов пользователя значительно повышается. Также собранные карты глубины с разных пользователей можно агрегировать и повысить качество базовой, подходящей для всех модели. Повышения точности и снижения вычислительной сложности метода можно добиться путем объединения нахождения кисти и классификации. Для решения такой задачи необходима другая архитектура классификатора, в качестве которой может выступать MobileNetV2+SSDLite [8].

...

Подобные документы

  • Система помощи водителю на базе регистратора. Установка операционной системы Debian. Настройка системных служб и разработка серверного приложения. Создание локальной Wi-Fi сети. Распознавание знаков и библиотека OpenCV. Потоковое видео в Android.

    дипломная работа [3,9 M], добавлен 13.09.2017

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

    курсовая работа [669,9 K], добавлен 20.05.2017

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

    курсовая работа [1,1 M], добавлен 11.01.2017

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

    дипломная работа [1,3 M], добавлен 19.05.2011

  • Анализ российского рынка мобильных приложений. Мобильное приложение как новый канал коммуникации с целевой аудиторией. Этапы создания мобильного приложения. План продвижения мобильного приложения в сети Интернет. Бесплатные инструменты продвижения.

    дипломная работа [1,6 M], добавлен 23.06.2016

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

    курсовая работа [1,1 M], добавлен 11.01.2017

  • Создание приложения для Android на языке Java. Переключатель языка и варианты перевода, которые появляются, когда пользователь вводит текст в поле. Возможность просмотра истории переводов. Разработка и подготовка вида экранов тестового приложения.

    курсовая работа [114,8 K], добавлен 03.08.2017

  • Компьютерная программа как последовательность инструкций, предназначенная для исполнения устройством управления вычислительной машины. Анализ стандартов перевода текстов компьютерных игр. Рассмотрение особенностей ИТ-перевода, примеры грубейших ошибок.

    реферат [65,5 K], добавлен 29.01.2013

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

    курсовая работа [2,2 M], добавлен 30.07.2010

  • Составление транслятора на языке С для перевода кода программы из языка Pascal в код программы на языке Cи. Распознавание и перевод конструкций: for, type, function, integer. Вешняя спецификация, описание, структура, текст программы; распечатка текстов.

    курсовая работа [287,8 K], добавлен 24.06.2011

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

    дипломная работа [2,6 M], добавлен 09.02.2017

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

    дипломная работа [2,7 M], добавлен 03.04.2015

  • Новые сетевые технологии мобильных устройств на примере планшетов. Пути общения между людьми. Связь с помощью мобильного устройства на примере планшета. Основные сетевые технологии и схемы подключения. Сравнительные характеристики Bluetooth и NFC.

    реферат [1,7 M], добавлен 03.10.2014

  • Приведена оптимизация расходов и трудозатрат персонала. Реализация модели ARIMA (модели Бокса-Дженкинса), являющейся интегрированной композицией метода авторегрессии и модели скользящего среднего. Применение средств программного продукта Matlab 2013a.

    дипломная работа [876,7 K], добавлен 19.09.2019

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

    дипломная работа [3,1 M], добавлен 18.11.2017

  • Информационно-измерительные системы мобильных роботов. Системы технического зрения; дескриптивный подход к обработке, анализу и распознаванию изображений. Разработка программного обеспечения для создания СТЗ мобильного робота для ориентации в комнате.

    дипломная работа [5,5 M], добавлен 10.05.2014

  • Современное состояние рынка мобильных приложений. Основные подходы к разработке мобильных приложений. Обоснование выбора целевой группы потребителей приложения. Этапы проектирования и разработки мобильного приложения для операционной системы Android.

    курсовая работа [987,1 K], добавлен 27.06.2019

  • Сбор сведений по способам очистки памяти мобильных и бытовых устройств. Изучение программных средств: SKTools, Ram Cleaner, СleanRAM, Pocket Mechanic Professional, Disk Cleaner, WashAndGo. Очистка памяти ПК с помощью Disk Cleaner, удаление программ.

    курсовая работа [2,0 M], добавлен 12.10.2011

  • Программный комплекс для разработки программы транслирующей программу с языка Pascal на язык С++. Построение логической и арифметической модели решения. Разработка компилятора для программы. Методы отладки программы и создание для нее документации.

    курсовая работа [742,6 K], добавлен 03.07.2011

  • Проектирование приложения на языке С# в среде Microsoft Visual Studio 2008: составление алгоритмов сегментации текста документа и распознавания слова "Указ" в нем, создание архитектуры и интерфейса программного обеспечения, описание разработанных классов.

    курсовая работа [2,4 M], добавлен 05.01.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.