Основы, функциональность и особенности Intel Perceptual Computing SDK Лекция 2 Содержание лекции • Что такое комплект инструментов Intel Perceptual Computing SDK; • Модули SDK; • C чего начать написание программы с помощью SDK. Цель Intel Perceptual Computing SDK • SDK предназначен для того, чтобы снизить стоимость разработки программных продуктов, в которых в качестве средств взаимодействия с пользователем необходимо использовать что-то отличное от клавиатуры или мышки Системные требования Системные требования: •32 или 64 битная архитектура процессора Intel; •1Гб свободного места на жестком диске; •Creative interactive gesture camera; Программные требования: •Microsoft Windows 7, 8; •Microsoft Visual Studio C++ 2008-2012; •Microsoft .NET 4.0 Framework (для работы с C#); •SoftKinetic DepthSense SDK runtime 1.0.4 (с возможностью отслеживания пальцев рук); •Unity PRO 3.5.1f2; •Processing 1.5.1; •openFrameworks v0071; Архитектура SDK (1) SDK Applications SDK Utilities SDK Samples SDK Framework and Language Ports SDK Interfaces I/O Modules Algorithm Modules Core Services: Context Module Loading Synchronization Interoperability Multiple Implementations Available Multiple Implementations Available Архитектура SDK (2) • Приложения могут получить доступ к функциональности SDK напрямую за счет стандартизации интерфейсов модулей ввода/вывода и алгоритмов; • SDK предоставляет механизм для поиска конкретной реализации из множества доступных модулей; • Реализует функции синхронизации выполнения и взаимодействие с другими библиотеками и фреймворками; • SDK предоставляет набор вспомогательных классов для общих случаев использования (исходный код или библиотеки форм). Модули обработки • Модуль распознавания жестов; • Модуль распознавания лиц; • Модуль голосового управления; • Модуль отслеживания двумерных и трехмерных объектов; Модуль распознавания жестов (1) Отслеживания позиций пальцев на руке (7 точек): •Кончики пальцев; •Центр ладони; •Максимально видимая точка, которая находится у локтя. Модуль распознавания жестов (2) Распознавание стандартных жестов: •Большой палец вверх; •Большой палец вниз; •Символ V (победа). •Раскрытая ладонь. Распознавание динамических жестов: •Взмахи руки влево, вправо, вверх, вниз, круговое движение, помахивание. Модуль распознавания жестов (3) • Модуль позволяет возвращать карту значений, т.е. специальный набор, где каждому пикселю будет присвоено значение именно того объекта, которому он принадлежит. Это может быть полезно для сегментации объектов, то есть отделение одних объектов от других. Модуль распознавания лиц (1) Модуль позволяет получить большое количество информации о распознанном лице (7 точек на лице): •Уголки глаз; •Уголки рта; •Кончик носа. Модуль распознавания лиц (2) Модуль позволяет получить некоторую аналитическую информацию о распознанном лице: •Возрастная группа лица присутствующего на картинке (ребенок, пожилой человек); •Пол; •Подмигивание; •Улыбка. Еще одна полезная особенность этого модуля заключается в том, что он может находить похожие лица. Модуль голосового управления Модуль предлагает следующую функциональность: •Реализация голосовых меню; •Надиктовывание; •Синтез речи. На текущий момент доступен только английский словарь. Другие языки будут добавляться по мере сотрудничества с разработчиками голосового движка. Сейчас для реализации голосового управления используется голосовой движок Nuance Dragon Assistant. Русский язык также скоро будет доступен. Модуль отслеживания двумерных и трехмерных объектов Функционал данного модуля позволяет отслеживать плоские двумерные объекты. Достаточно создать модель объекта на компьютере и отслеживать его. В результате будут получены: •Параметры позиции объекта; •Угол наклона и т.д. Также поддерживается отслеживание трехмерных объектов, которые задаются в виде модели (.obj файла). Модуль отслеживания двумерных и трехмерных объектов SDK реализует несколько уровней интерфейсов, которые позволяют сразу же использовать игровые движки. На текущий момент поддерживаются следующие игровые движки: •Unity; •Processing (использующий Java); •openFrameworks. Конфиденциальность пользователя • В состав SDK включена утилита, уведомляющая пользователя о том, что его персональные данные используются в данный момент. • Данная утилита предназначена только для уведомления пользователя и не предназначена для блокировки доступа к сенсору камеры или микрофона. Ограничить доступ к камере или микрофону через данное приложение невозможно. Иерархия интерфейсов Applications C# PXCMSession PXCMImage PXCMAudio PXCMCapture PXCMGesture PXCMFaceAnalysis PXCMVoice UtilMCapture UtilMPipeline Unity Pro Processi ng libpxcupipeline C++ UtilCapture, UtilPipeline C++ PXCSession, PXCImage, PXCAudio, PXCCapture, PXCGesture, PXCFaceAnalysis, PXCVoice Open Frame works Additional Language and Framework Support Module Interaction Module Functionalities Классы UtilCapture и UtilPipeline • Класс UtilCapture является расширением интерфейса PXCCapture, помогает объединить модули алгоритмов с устройствами ввода и синхронизировать поток данных между ними. • Класс UtilPipeline предоставляет простой интерфейс общего назначения, ограничивается распознаванием жестов, лица и голоса. Интерфейсы • Интерфейс PXCCapture предоставляет функции-члены для опроса устройства видео захвата и создает экземпляр устройства захвата; • Интерфейс PXCAudio обеспечивает последовательный способ доступа к аудио буферу; • Интерфейс PXCImage обеспечивает последовательный способ доступа к буферу изображения; • Интерфейс PXCGesture позволяет выполнять распознавание жестов; функции-члену Модель программирования 1. Создание сессии 2. Создание модуля 3. Работа модуля 4. Закрытие // Создаем сессию PXCSmartPtr<PXCSession> session; PXCSession_Create(&session); // Создаем захват PXCSmartPtr<PXCCapture> capture; session>CreateImpl<PXCCapture>(&capture ); // Производим захват Модули ввода/вывода и модули алгоритмов (1) • Модули ввода/вывода служат в качестве источника получения информации от устройств ввода и передачи обработанной информации на устройства вывода. • На момент создания сессии, SDK загружает все предустановленные модули в сессию. Приложение также может явно загрузить модули, вызывая функцию LoadImplFromFile, как показано на следующем примере: Модули ввода/вывода и модули алгоритмов (2) Пример загрузки модуля: session->LoadImplFromFile(L"my_module.dll"); Модули ввода/вывода и модули алгоритмов (3) • Приложение должно создать экземпляр модуля, прежде чем использовать его функции. • Существует несколько способов, как приложение может найти модуль и создать экземпляр. Самым простым способом является создание экземпляра модуля, основываясь на его интерфейсе. Модули ввода/вывода и модули алгоритмов (4) • Как показано в примере, приложение создает экземпляр модуля захвата с помощью функции CreateImpl с идентификатором интерфейса PXCCapture:: CUID. SDK ищет первый модуль, который реализует указанный интерфейс и создает экземпляр модуля. PXCFaceAnalysis *fd=0; session->CreateImpl<PXCFaceAnalysis>(&fd); Конфигурирование модулей (1) Важно настроить модуль после создания его экземпляра. Каждый интерфейс модуля обычно предоставляет две функции конфигурации: •QueryProfile перечисляет все поддерживаемые конфигурации и запрашивает текущую рабочую конфигурацию; •SetProfile устанавливает активную конфигурацию. Конфигурирование модулей (2) PXCFaceAnalysis::ProfileInfo info; // первая поддерживаемая конфигурация sts=face->QueryProfile(i,&info); // устанавливаем рабочую конфигурацию face->SetProfile(&info); … // получаем текущую рабочую конфигурацию face->QueryProfile(&info); Функция SetProfile служит средством для инициализации модуля. После начальной установки, приложение может вызвать функцию SetProfile для изменения некоторых параметров работы во время выполнения. Создание конвейера (1) • Приложению может потребоваться получать входные данные от алгоритма конфигурации, а затем искать соответствующее устройство ввода. • Класс UtilCapture выполняет именно это. • Функция LocateStreams перечисляет доступные устройства ввода и сравнивает источник с алгоритмом конфигурации. Создание конвейера (2) // получаем данные из модуля распознования лиц PXCFaceAnalysis::ProfileInfo info; face->QueryProfile(0, &info); // находим соответствующее устройство ввода UtilCapture capture(session); capture.LocateStream(&info.inputs); // задаем конфигурацию модуля face->SetProfile(&info); UtilCapture инициализирует захват Создание конвейера (3) Функция LocateStreams может объединить несколько входных потоков, как показано в Примере (функция находит устройства для распознавания лица и жестов). PXCFaceAnalysis::ProfileInfo pinfo1; face->QueryProfile(0, &pinfo1); PXCGesture::ProfileInfo pinfo2; gesture->QueryProfile(0, &pinfo2); UtilCapture capture(session); std::vector<PXCCapture::VideoStream::DataDesc*> minputs; minputs.push_back(&pinfo1.inputs); minputs.push_back(&pinfo2.inputs); capture.LocateStreams(minputs); face->SetProfile(&pinfo1); gesture->SetProfile(&pinfo2); UtilCapture объединяет потоки с нескольких устройств Передача данных и асинхронное выполнение (1) • Конструкция SDK требует от приложения явной передачи данные от модуля к модулю. • Например, для обнаружения позиции лица (как показано на Рисунке) приложение создает конвейер, состоящий из потока с камеры, а также модуля распознавания лица и явно передает изображения с камеры в модуль распознавания лиц. Camera input Face detection Передача данных и асинхронное выполнение (2) • Для повышения эффективности выполнения, SDK предполагает асинхронное выполнение каждого этапа конвейера. На Рисунке приложение передает данные со входа камеры в модуль распознавания лица асинхронно, без ожидания синхронизации между двумя модулями. SP1 Camera input Face detection SP2 Передача данных и асинхронное выполнение (3) • Асинхронные функции не блокируют выполнение, а возвращают точку синхронизации (или SP) для последующей синхронизации результата выполнения. Приложению не требуется синхронизация промежуточных SP (например SP1). Вместо этого, приложение синхронизирует только окончание работы конвейера. PXCSmartArray<PXCImage> images; PXCSmartSPArray sps(2); stream>ReadStreamAsync(&images,&sps[0]); face>ProcessImageAsync(images,&sps[1]); sps.Synchronize(); Передача данных и асинхронное выполнение (4) SDK поддерживает асинхронное выполнение в виде графа. Есть два способа построения графа выполнения: •Приложение передает одно и то же выходное значение для последующего выполнения. •Некоторые функции SDK создают несколько выходных значений. Приложение передает каждое выходное значение для последующего выполнения. Передача данных и асинхронное выполнение (5) На Рисунке Функция 1 генерирует два выходных значения. Приложение передает первое выходное значение на Функцию 2 и Функцию 4, а второе выходное значение на Функцию 3 и Функцию 5. Приложение также передает выходное значение Функции 2 на Функцию 5. Соответственно Функция 5 требуется несколько входов. Функция 2 Функция 4 Функция 3 Функция 5 Функция 1 Передача данных с использование UtilCapture(1) PXCSmartSPArray sps(2); PXCSmartArray<PXCImage> images; capture.ReadStreamAsync(images,&s ps[0]); face>ProcessImageAsync(images,face,&s ps[1]); while (…) { /* выполнение */ sps.SynchronizeEx(); capture.ReadStreamAsync(images.Re leaseRefs(),sps.ReleaseRef(0)); face>ProcessImageAsync(images,face,sp s.ReleaseRef(1)); } Класс UtilCapture помогает объединить модули алгоритмов с устройствами ввода и синхронизировать поток данных между ними. Как показано в Примере, для получения потока с входного устройства, а затем для передачи его в модуль распознавания лица приложение вызывает функцию ReadStreamAsync. Передача данных с использование UtilCapture(2) • При наличии нескольких модулей обработки, каждый модуль определяет его входные требования. На Рисунке такими требованиями являются DataDesc1 и DataDesc2. Например, Модуль 1 требует цветной поток, и Модуль 2 требует как цветной поток, так и поток данных с датчика глубины. Функции LocateStreams интерфейса UtilCapture объединяет эти требования и находит устройства ввода, которые могут предоставить данные для обоих модулей. Images1 DataDesc1 Input device Processing Module 1 Images Images2 DataDesc2 Processing Module 2 Передача данных с использование UtilCapture(3) PXCSmartSPArray sps(3); PXCSmartArray<PXCImage> images; PXCCapture::VideoStream::Images images1, images2; capture.ReadStreamAsync(images,&sps[0]); capture.MapImages(0, images, images1); face->ProcessImageAsync(images1,&sps[1]); capture.MapImages(1, images, images2); gesture->ProcessImageAsync(images2,&sps[2]); while (…) { /* выполнение */ sps.SynchronizeEx() capture.ReadStreamAsync(images.ReleaseRefs(),sps.Relea seRef(0)); capture.MapImages(0, images, images1); face->ProcessImageAsync(images1,sps.ReleaseRef(1)); capture.MapImages(1, images, images2); gesture>ProcessImageAsync(images2,sps.ReleaseRef(2)); } Во время передачи потоков, устройства ввода (через функцию ReadStreamAsync) создают набор кадров, описанных как Images. Порядок кадров определяется устройством ввода. Функция MapImages переносит кадры с устройств ввода в соответствующий модуль обработки. Создание конвейера с использованием UtilPipeline Общий порядок использования UtilPipeline выглядит следующим образом: •Настройка: приложение использует набор функций EnableXXXX для настройки конвейера. Например, можно использовать функцию EnableGesture для инициализации модуля распознавания жестов в конвейере. •Запуск конвейера: приложение вызывает функцию LoopFrames для инициализации конвейера и передачи данных между его компонентами. •Обработка событий: приложение вызывает функцию OnXXXX для обработки событий конвейера. Возвращаемое значение функции OnNewFrame определяет, когда следует выйти из конвейера. Ссылки на источники • Intel Perceptual Computing SDK 2013 http://software.intel.com/en-us/vcsource/tools/perceptual-computing-sdk • http://software.intel.com/sites/default/files/sdkmanual-module.pdf sdkmanual-core.pdf sdkmanual-sensor.pdf sdkmanual-face.pdf sdkmanual-voice.pdf • Функциональность и особенности Intel Perceptual Computing SDK довольно подробно описаны в данном документе на английском языке http://software.intel.com/sites/landingpage/perceptual_computing/documentation/html/ • Примеры приложений http://software.intel.com/en-us/vcsource/tools/perceptual-computing-sdk/demos • Видео обзор Intel Perceptual Computing SDK 2013 на русском языке YOUTUBE www.youtube.com/watch?v=U0lkGE1X9X8 Контрольные вопросы 1. 2. Какова цель использования Intel Perceptual Computing SDK? Что означает слово «Perceptual» (Воспринимающий) в рассматриваемом контексте? 3. В чем заключаются особенности коммерческого использования компонентов SDK? 4. В чем заключается особенность архитектуры SDK? 5. Что такое интерфейс SDK? 6. Какова особенность класса UtilCapture? 7. Какова особенность класса UtilPipeline? 8. Каковы этапы процедуры программирования SDK? 9. Каков общий порядок использования класса UtilPipeline? 10. Как происходит асинхронное выполнение процессов?