Transcript здесь

Основы, функциональность и
особенности
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. Как происходит асинхронное выполнение процессов?