Презентацию к лекции можно скачать здесь.
Intel Perceptual Computing SDK предназначен в первую очередь для того, чтобы снизить стоимость разработки программных продуктов, в которых в качестве средств взаимодействия с пользователем необходимо использовать что-то, отличное от клавиатуры или мышки. Другими словами те, кто в дальнейшем будут использовать SDK для разработки, смогут потратить свои силы и время на то, чтобы реализовать именно логику программы, а не на реализацию алгоритма, который будет взаимодействовать с пользователем.
Перечислим системные требования для установки комплекта.
Аппаратные требования:
Программные требования:
(рис 2.1) Архитектура SDK
Комплект Intel Perceptual Computing SDK распространяется бесплатно и может быть скачан с официального сайта Intel (http://software.intel.com/en-us/vcsource/tools/perceptual-computing-sdk). Многие модули SDK могут быть доступны без технической составляющей. Однако для того, чтобы пользоваться широкими возможностями Intel Perceptual Computing SDK потребуется техническая составляющая. Описанная ранее Creative Interactive Gesture Camera позволяет захватывать не только видео или изображения, но она также снабжена сенсором глубины, с помощью которого можно захватывать карту глубины и т.д.
Карта глубины – это черно-белое изображение, на котором объект будет темнее, если он находится ближе к камере и наоборот, если расположен дальше от камеры.
Формат захвата цветного изображения 720p до 30 кадров в секунду. Сенсор глубины возвращает изображения формата 320х240 пикселей. Сенсор глубины возвращает несколько слоев: карта глубины, карта доверия (насколько можно доверять значению в конкретной точке), и карту вершин. По умолчанию карта глубины возвращается в отфильтрованном формате. Это сделано для того чтобы устранить шум, который возникает к примеру от источников света. Однако при желании можно получить исходный нефильтрованный сигнал. Стоит заметить, что все приведенные параметры являются всего лишь ограничениями самой камеры. Непосредственно SDK может работать с изображением большего формата.
Кроме того с камеры можно получить некоторые параметры, например, такие как яркость, экспозицию, значение уровня доверия, после которого все точки будут отсекаться.
Creative Interactive Gesture Camera это камера ближнего действия. Ее рабочая дистанция примерно от 50 до 150 см, хотя при помощи нее отслеживать объекты на расстоянии 4-5 метров принципиально возможно, но сенсор глубины не рассчитан на большое расстояние, и, соответственно качество отслеживания будет сильно снижаться с увеличением расстояния.
Кроме того доступен захват аудио с двух микрофонов. Захватывается одно или двух канальный звук с частотой дискретизации до 48 кГц.
Заказать Creative interactive gesture camera можно также с сайта Intel, перейдя по следующей ссылке: http://click.intel.com/intelsdk/Creative_Interactive_Gesture_Camera_Developer_Kit-P2061.aspx.
На рис 2.1 представлена архитектура SDK. Основная идея заключается в модульности структуры SDK. Здесь имеется набор модулей для ввода/вывода, а также набор модулей для реализации тех или иных алгоритмов. Например, алгоритмов распознавания лиц, распознавания речи или синтеза речи.
SDK стандартизирует интерфейсы модулей ввода/вывода и алгоритмы модулей таким образом, что приложения могут получить доступ к функциональности напрямую. Приложение, использующее SDK, не работает напрямую с камерой, этим занимается модуль ввода-вывода, благодаря чему достигается одновременная работа сразу нескольких приложений, использующих SDK, что, например, невозможно при работе с web камерой, когда приложение получает эксклюзивный доступ, ограничивающий работу с камерой для других приложений. Также SDK предоставляет механизм для поиска конкретной реализации из множества доступных модулей, а также другие важные функции, такие как синхронизация выполнения и взаимодействие с другими библиотеками и фреймворками. Кроме того SDK предоставляет набор вспомогательных классов для общих случаев использования (исходный код или библиотеки форм), таким образом разработчику остается только настроить их для конкретного использования. SDK включает в себя несколько популярных платформ и врапперов (языковых оберток) для расширения сферы применения.
Рассмотрим модуль отслеживания позиций пальцев на руке. Нам доступны 7 точек: кончики пальцев, центр ладони и максимально видимая точка, которая находится у локтя. Если не требуется знать о местоположении каждого пальца, то можно запросить специальные параметры, например, самую верхнюю точку, самую правую точку или центр масс руки. На последнее не стоит сильно полагаться, так как это изменяемая величина. Поэтому если нужно отслеживать руку, то для точных взаимодействий рекомендуется использовать кончик пальца.
Кроме этого существует возможность распознать несколько стандартных жестов. Такие как большой палец вверх, большой палец вниз, символ V (победа). В новой версии SDK доступен жест ладони (раскрытая ладонь). Кроме статических жестов камера позволяет возвращать события о том, что произошли какие-то динамические жесты. Например, взмахи руки влево, вправо, вверх, вниз, круговое движение, помахивание.
Кроме всего прочего, данный модуль позволяет возвращать карту значений. Это специальный набор, где каждому пикселю будет присвоено значение именно того объекта, которому он принадлежит. Это может быть полезно для сегментации объектов, то есть отделение одних объектов от других.
Наверное, всем известно как работает функция обнаружения лиц в фотоаппаратах, когда в окне предварительного просмотра появляется квадратик на распознанном лице и в зависимости от его положения выставляется фокусное расстояние или другие настройки. Данный модуль SDK позволяет получить большое количество информации о распознанном лице. В итоге может быть возвращено 7 точек на лице: уголки глаз, уголки рта, кончик носа. Кроме этого можно получить некоторую аналитическую информацию о распознанном лице. Например, мы можем получить возрастную группу лица присутствующего на картинке (ребенок, пожилой человек), можно определить пол, распознать подмигивание, распознать улыбку. Еще одна полезная особенность этого модуля заключается в том, что он может находить похожие лица.
Модуль голосового управления предлагает две основных функциональности по распознаванию речи: первая – это использование функций модуля для реализации голосовых меню. Вторая – это надиктовывание. Данная функция предназначена для реализации надиктовывания коротких фраз продолжительностью до 30 секунд. На текущий момент доступны немецкий, британский английский, американский английский, французский, итальянский, японский, португальский, испанский, китайский словари. Другие языки будут добавляться по мере сотрудничества с разработчиками голосового движка. Сейчас для реализации голосового управления используется голосовой движок Nuance Dragon Assistant. Русский язык также скоро будет доступен.
Кроме того, в SDK доступен модуль синтеза речи. С помощью этой функции компьютер сможет отвечать пользователю. Отличительной особенностью здесь является то, что не требуется заносить в программу какие-то предзаписанные фразы, а аудио поток формируется на лету и результат воспроизводится через аудио систему компьютера.
Функционал данного модуля позволяет отслеживать плоские двумерные объекты. Достаточно просто создать модель этого объекта на компьютере и отслеживать его. В результате мы можем получать параметры позиции объекта, угол наклона и т.д. Также поддерживается отслеживание трехмерных объектов, которые задаются в виде модели (.obj файла). По умолчанию доступна модель маски лица, при помощи которой можно отслеживать наклоны и изменения позиции лица как трехмерного объекта.
Стоит дополнить, что SDK реализует несколько уровней интерфейсов, которые позволяют сразу же использовать игровые движки. На текущий момент поддерживаются следующие игровые движки: Unity, Processing, использующий Java и openFrameworks.
Компания Intel заботится о сохранности персональных данных пользователей. В состав SDK включена утилита, предназначение которой заключается в уведомлении пользователя о том, что его персональные данные используются в данный момент. Ведь если камера персонального компьютера включена постоянно, то можно начать сомневаться, а не следят ли за мной. Поэтому данная утилита присутствует в составе SDK. Когда утилита запущена, то ее значок прячется в системном трее рядом с часами. В случае использования интерфейса SDK появляется всплывающая подсказка. Работу утилиты можно настроить на свое усмотрение. К примеру, если вы не хотите, чтобы подсказка постоянно всплывала, то ее можно отключить, а иконка в системном трее будет просто моргать. Данная утилита предназначена только для уведомления пользователя и не предназначена для блокировки доступа к сенсору камеры или микрофона. Ограничить доступ к камере или микрофону через данное приложение невозможно.
(рис 2.2) Иерархия API SKD
Поскольку SDK нацелен на различные модели использования, а также на широкий спектр разработчиков с разным уровнем знаний, то достаточно сложно разработать единый интерфейс, который работает во всех случаях. Некоторые разработчики ценят простоту, другим требуется как можно точнее настроить каждый шаг алгоритма. SDK предоставляет слои иерархии интерфейсов для удовлетворения этих потребностей.
Как представлено на рис 2.2, основой SDK являются набор блоков C++ интерфейсов, модули ввода/вывода и модули алгоритмов. Эти интерфейсы обеспечивают грубую функциональность. Например, PXCCapture интерфейс возвращает аудио семплы (PXCAudio) или изображения (PXCImage) с сенсора устройства. Интерфейс PXCGesture выполняет отслеживание пальцев и распознавания жестов. Приложения, использующие данные уровни интерфейсов, достигают максимальной гибкости и умеренно сложны в реализации. Интерфейсы C++ напрямую портируются в интерфейсы C# (левая часть рисунка).
SDK предоставляет набор вспомогательных классов для упрощения разработки приложений: класс UtilCapture является расширением интерфейса PXCCapture, помогает объединить модули алгоритмов с устройствами ввода и синхронизировать поток данных между ними. Класс UtilPipeline предоставляет простой интерфейс общего назначения, ограничивается распознаванием жестов, лица и голоса.
В своем приложении вы можете использовать любой из этих интерфейсов и настраивать их под конкретные случаи. Для максимальной простоты, вы можете начать с класса UtilPipeline. Для большей гибкости, вы можете использовать класс UtilCapture. Большинство приложений должны использовать определенные комбинации. Например, класс UtilPipeline определит, как направить поток данных с устройства ввода в модули алгоритмов, а также использовать интерфейс PXCGesture для управления деталями алгоритма.
рис 2.3 отображает приложение, которое использует класс UtilPipeline для распознавания жестов. Приложение позволяет распознавать жесты с помощью функции EnableGesture. Запускается цикл с помощью функции LoopFrames, которая инициализирует конвейер распознавания жестов и направляет данные с устройства ввода (камеры глубина) в модуль распознавания жестов.
Интерфейсы SDK (с префиксом PXC) - это виртуальные классы C++, каждый из которых может иметь несколько исполнений.
Общая процедура программирования представлена в Примере 2.
// Создаем сессию PXCSmartPtr<PXCSession> session; PXCSession_Create(session); // Создаем захват PXCSmartPtr<PXCCapture> capture; session->CreateImpl<PXCCapture>(capture); // Производим захват
В примере 2.2, приложение использует шаблонную функцию PXCSmartPtr для управления жизненным циклом сессии и захвата экземпляров. Это упрощает программирование. Некоторые из шаблонов, таких как PXCSmartArray, PXCSmartSP, и PXCSmartSPArray, введены для удобства, но являются необязательными.
Модули ввода/вывода служат в качестве источника получения информации от устройств ввода и передачи обработанной информации на устройства вывода.
Сессии SDK может содержать несколько и модулей ввода/вывода и модулей алгоритмов. На момент создания сессии, SDK загружает все предустановленные модули в сессию. Приложение также может явно загрузить модули, вызывая функцию LoadImplFromFile, как показано на следующем примере:
session->LoadImplFromFile(L"my_module.dll");
Приложение должно создать экземпляр модуля, прежде чем использовать его функции. Существует несколько способов, как приложение может найти модуль и создать экземпляр. Самым простым способом является создание экземпляра модуля, основываясь на его интерфейсе. Как показано в примере 4, приложение создает экземпляр модуля захвата с помощью функции CreateImpl с идентификатором интерфейса PXCCapture:: CUID. SDK ищет первый модуль, который реализует указанный интерфейс и создает экземпляр модуля.
PXCFaceAnalysis *fd=0; session->CreateImpl<PXCFaceAnalysis>(fd);
В некоторых случаях, приложению необходимо точно указать модуль для настройки. Это может быть сделано двумя способами:
1. Если приложение уже знает исполняемый идентификатор модуля, то оно может вызвать функцию CreateImpl с данным идентификатором, как показано в Примере 2.5. Идентификатор интерфейса и исполняемый идентификатор однозначно определяют модуль. Приложение может найти исполняемый идентификатор, вызвав функцию QueryImpl, которая перечисляет все доступные модули.
PXCFaceAnalysis *fd=0;
session->CreateImpl<PXCFaceAnalysis>(PXC_UID('F','I','L','C'),fd);
2. Кроме того, приложение может создать структуру ImplDesc, которая определяет различные аспекты модуля. Функция CreateImpl найдет совпадения и создаст экземпляр модуля, как показано на Примере 2.6.
PXCSession::ImplDesc desc; memset(desc,0,sizeof(desc)); desc.group=PXCSession::IMPL_GROUP_OBJECT_RECOGNITION; desc.subgroup=PXCSession::IMPL_SUBGROUP_FACE_ANALYSIS; desc.vendor=0x8086; // от Intel // Создаем образец алгоритма PXCFaceAnalysis *fd=0; Session->CreateImpl<PXCFaceAnalysis>(desc,fd);
Так как модуль может поддерживать различные конфигурации, важно настроить модуль после создания его экземпляра. Каждый интерфейс модуля обычно предоставляет две функции конфигурации: QueryProfile и SetProfile. Первая функция перечисляет все поддерживаемые конфигурации и запрашивает текущую рабочую конфигурацию, а вторая функция устанавливает активную конфигурацию, как показано в Примере 2.7.
PXCFaceAnalysis::ProfileInfo info; // первая поддерживаемая конфигурация sts=face->QueryProfile(i,info); // устанавливаем рабочую конфигурацию face->SetProfile(info); ... // получаем текущую рабочую конфигурацию face->QueryProfile(info);
По умолчанию модуль не инициализируется после создания. Функция SetProfile служит средством для инициализации модуля. После начальной установки, приложение может вызвать функцию SetProfile для изменения некоторых параметров работы во время выполнения.
Обычно модули не работают сами по себе. Приложение должно определить источник данных и передавать эти данные в модуль. Если приложение предварительно знает о модуле и его устройстве ввода, то оно может создать модуль устройства и модулей обработки данных и передают данные между этими двумя модулями.
Приложению может потребоваться получать входные данные от алгоритма конфигурации, а затем искать соответствующее устройство ввода. Класс UtilCapture выполняет именно это. Функция LocateStreams перечисляет доступные устройства ввода и сравнивает источник с алгоритмом конфигурации, как показано в Примере 2.8.
// получаем данные из модуля распознавания лиц PXCFaceAnalysis::ProfileInfo info; face->QueryProfile(0, info); // находим соответствующее устройство ввода UtilCapture capture(session); capture.LocateStream(info.inputs); // задаем конфигурацию модуля face->SetProfile(info);
После вызова функции LocateStreams, структура входных данных изменяется в соответствии с текущими параметрами устройства ввода. Очень важно, чтобы приложение задавало конфигурацию модуля алгоритма после функции LocateStreams, таким образом, текущие параметры устройства ввода могут быть переданы в модуль алгоритма.
Функция LocateStreams может объединить несколько входных потоков, как показано в Примере 2.9, где функция находит устройства для распознавания лица и жестов.
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);
Конструкция SDK требует от приложения явной передачи данных от модуля к модулю. Такая передача данных происходит во время выполнения и формирует конвейер. Например, для обнаружения позиции лица, как показано на рис 2.3, приложение создает конвейер, состоящий из потока с камеры, а также модуля распознавания лица и явно передает изображения с камеры в модуль распознавания лиц.
(рис 2.3) Обнаружения позиции лица
Для повышения эффективности выполнения, SDK предполагает асинхронное выполнение каждого этапа конвейера. На рис 2.4, приложение передает данные со входа камеры в модуль распознавания лица асинхронно, без ожидания синхронизации между двумя модулями. Соответствующий код представлен на Примере 2.10.
PXCSmartArray<PXCImage> images; PXCSmartSPArray sps(2); stream->ReadStreamAsync(images,sps[0]); face->ProcessImageAsync(images,sps[1]); sps.Synchronize();
SDK помечает асинхронные функций суффиксом "Async" в имени функции. Асинхронные функции не блокируют выполнение, а возвращают точку синхронизации (или SP) для последующей синхронизации результата выполнения. Приложение использует функцию Synchronize для явного ожидания завершения выполнения. Каждая асинхронная операция возвращает SP. Приложению не требуется синхронизация промежуточных SP (например, SP1). Вместо этого, приложение синхронизирует только окончание работы конвейера.
(рис 2.4) Асинхронное выполнение конвейера распознавания лиц с SP
На рис 2.5, изображение с камеры не доступно на момент, когда приложение вызывает функцию распознавания лиц. Приложение просто передает указатель буфера изображения от входной функции камеры к функции распознавания лиц. SDK заполнит буфер изображения позднее, когда изображение с камеры будет доступно. Естественно, что приложение не должно освобождать буфер, прежде чем приложение синхронизирует исполнение всего конвейера, так как жизненный цикл конвейера являются динамическим во время исполнения.
(рис 2.5) Асинхронный конвейер распознавания лиц с SP и данными
SDK поддерживает асинхронное выполнение в виде графа. Есть два способа построения графа выполнения:
На рис 2.6 Функция 1 генерирует два выходных значения. Приложение передает первое выходное значение на Функцию 2 и Функцию 4, а второе выходное значение на Функцию 3 и Функцию 5. Приложение также передает выходное значение Функции 2 на Функцию 5. Соответственно Функция 5 требуется несколько входов.
(рис 2.6) Граф асинхронного выполнения
Как уже упоминалось выше, класс UtilCapture помогает объединить модули алгоритмов с устройствами ввода и синхронизировать поток данных между ними.
Прямая передача данных с устройства ввода в модуль алгоритма является относительно простой процедурой. Как показано в Примере 11, для получения потока с входного устройства, а затем для передачи его в модуль распознавания лица приложение вызывает функцию ReadStreamAsync.
PXCSmartSPArray sps(2);
PXCSmartArray<PXCImage> images;
capture.ReadStreamAsync(images,sps[0]);
face->ProcessImageAsync(images,face,sps[1]);
while (...) {
/* выполнение */
sps.SynchronizeEx();
capture.ReadStreamAsync(images.ReleaseRefs(),sps.ReleaseRef(0));
face->ProcessImageAsync(images,face,sps.ReleaseRef(1));
}
При наличии нескольких модулей обработки, каждый модуль определяет его входные требования. На рис 2.7 такими требованиями являются DataDesc1 и DataDesc2. Например, Модуль 1 требует цветной поток, и Модуль 2 требует как цветной поток, так и поток данных с датчика глубины. Функции LocateStreams интерфейса UtilCapture объединяет эти требования и находит устройства ввода, которые могут предоставить данные для обоих модулей.
(рис 2.7) Конвейер совместной обработки
Во время передачи потоков, устройства ввода (через функцию ReadStreamAsync) создают набор кадров, описанных как Images. Порядок кадров определяется устройством ввода. Функция MapImages переносит кадры с устройств ввода в соответствующий модуль обработки (Пример 2.12).
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.ReleaseRef(0));
capture.MapImages(0, images, images1);
face->ProcessImageAsync(images1,sps.ReleaseRef(1));
capture.MapImages(1, images, images2);
gesture->ProcessImageAsync(images2,sps.ReleaseRef(2));
}
UtilPipeline организует конвейер либо на основе потока с устройства ввода, либо на основе уже существующего файла. Общий порядок использования UtilPipeline выглядит следующим образом:
Следует заметить, что на текущий момент не все компоненты Intel Perceptual Computing SDK могут быть использованы в коммерческих целях. К примеру, модуль распознавания голоса использует функциональность разработанную компанией Nuance и должен быть использован только для тестирования и разработки прототипов под соответствующей лицензией. Данный функционал работает только на машинах с предустановленным движком Dragon Assistant, который по умолчанию установлен на современных ультрабуках.
Сайт:
http://software.intel.com/en-us/vcsource/tools/perceptual-computing-sdk
http://software.intel.com/sites/default/files/sdkmanual-module.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
Overview - Intel® Perceptual Computing SDK 2013.
YOUTUBE https://www.youtube.com/watch?v=U0lkGE1X9X8
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.