Дополненная
Реальность
в Облаке
NODE.JS И С++ ПОД ОДНОЙ КРЫШЕЙ

Хведченя Евгений
Computer Vision Talks
Дополненная реальность
Дополненная реальность (англ. augmented reality, AR), — термин,
относящийся ко всем проектам, направленным на дополнение
реальности любыми виртуальными элементами.
Дополненная реальность сегодня
u 

Возможности ограничены мощностью
устройства

u 

Высокое энергопотребление

u 

30FPS – это минимум

u 

Обилие и фрагментация платформ

u 

Разнообразие языков программирования
Дополненная реальность в облаке
u 

Работает везде

u 

Потребляет меньше энергии

u 

С++ для алгоритмов

u 

Производительность и масштабируемость

u 

Легкий обмен данными между устройствами
Так появился CloudCV –
Cloud Computer Vision Platform
Цель – Algorithms as a Service
Так появился CloudCV –
Cloud Computer Vision Platform
u 

Инфраструктура для алгоритмов в облаке:
u 
u 

3Д реконструкция

u 

Анализ видео (подсчет людей, выявление дефектов)

u 

u 

Дополненная реальность

Распознавание объектов и лиц

Node.js & C++
Альтернативы Node.js & C++
u 

SWIG & JAVA

u 

RoR & C++

u 

Boost.Python
Почему C++ и Node.js

С++

Node.js

•  Производительность

•  Простая обработка запросов

•  Библиотеки

•  Поддержка С++

•  Опыт разработки

•  Легковесный
•  Он прикольный J
Node.js и C++ такие разные
u 

Компиляция vs Интерпретация

u 

Строгая типизация vs Слабая типизация

u 

Makefile vs nothing

u 

И это работает!
Взаимодействие Node.js и С++
u 

Node.js построен на базе движка V8

u 

V8 написан на С++

u 

Можно грабить корованы писать свои модули

u 

?????

u 

PROFIT!
Минимальный модуль
#include	
  <node.h>	
  
#include	
  <v8.h>	
  
	
  
using	
  namespace	
  v8;	
  
	
  
Handle<Value>	
  Method(const	
  Arguments&	
  args)	
  {	
  
	
  	
  HandleScope	
  scope;	
  
	
  	
  return	
  scope.Close(String::New("world"));	
  
}	
  
	
  
void	
  init(Handle<Object>	
  exports)	
  {	
  
	
  	
  exports-­‐>Set(String::NewSymbol("hello"),	
  
	
  	
  	
  	
  	
  	
  FuncPonTemplate::New(Method)-­‐>GetFuncPon());	
  
}	
  
	
  
NODE_MODULE(hello,	
  init)	
  
Что тут неправильно?
#include	
  <node.h>	
  
#include	
  <v8.h>	
  
	
  
using	
  namespace	
  v8;	
  
	
  
Handle<Value>	
  Method(const	
  Arguments&	
  args)	
  {	
  
	
  	
  HandleScope	
  scope;	
  
	
  	
  return	
  scope.Close(String::New("world"));	
  
}	
  
	
  
void	
  init(Handle<Object>	
  exports)	
  {	
  
	
  	
  exports-­‐>Set(String::NewSymbol("hello"),	
  
	
  	
  	
  	
  	
  	
  FuncPonTemplate::New(Method)-­‐>GetFuncPon());	
  
}	
  
	
  
NODE_MODULE(hello,	
  init)	
  
Неблокирующие вычисления в С++
u 

Node.js работает асинхронно

u 

Блокирующие задачи - в отдельном потоке

u 

Код С++ также должен следовать парадигме
Как правильно
1. 

Вызов функции С++ из JavaScript

2. 

Создание рабочего потока (libuv)

3. 

WorkerFn – чистый С++ код (без V8)

4. 

Возврат результата через callback
Запуск обработчика
Handle<Value>	
  Async(const	
  Arguments&	
  args)	
  {	
  
	
  	
  	
  	
  HandleScope	
  scope;	
  
	
  	
  	
  	
  Local<FuncPon>	
  callback	
  =	
  Local<FuncPon>::Cast(args[0]);	
  
	
  	
  	
  	
  Task*	
  task	
  =	
  new	
  Task();	
  
	
  	
  	
  	
  task-­‐>request.data	
  =	
  baton;	
  
	
  	
  	
  	
  task-­‐>callback	
  =	
  Persistent<FuncPon>::New(callback);	
  
	
  	
  	
  	
  uv_queue_work(uv_default_loop(),	
  &task-­‐>request,	
  
	
  	
  	
  	
  	
  	
  	
  	
  AsyncWork,	
  AsyncAber);	
  
	
  	
  	
  	
  return	
  Undefined();	
  
}	
  
Передача данных между потоками
struct	
  Task	
  {	
  
	
  	
  	
  	
  uv_work_t	
  request;	
  
	
  	
  	
  	
  Persistent<FuncPon>	
  callback;	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  //	
  Custom	
  data	
  
	
  	
  	
  	
  int32_t	
  theAnswer;	
  
};	
  
Передача данных между потоками
struct	
  Task	
  {	
  
	
  	
  	
  	
  uv_work_t	
  request;	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  Хранит	
  внутреннее	
  состояние	
  задачи
	
  
	
  	
  	
  	
  Persistent<FuncPon>	
  callback;	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  //	
  Custom	
  data	
  
	
  	
  	
  	
  int32_t	
  theAnswer;	
  
};	
  
Передача данных между потоками
struct	
  Task	
  {	
  
	
  	
  	
  	
  uv_work_t	
  request;	
  

//	
  Хранит	
  внутреннее	
  состояние	
  задачи

	
  	
  	
  	
  Persistent<FuncPon>	
  callback;	
   //	
  JavaScript	
  функция,	
  которая	
  будет	
  вызвана	
  по	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  //	
  Custom	
  data	
  
	
  	
  	
  	
  int32_t	
  theAnswer;	
  
};	
  

выполнению	
  работы	
  
Асинхронный обработчик
void	
  AsyncWork(uv_work_t*	
  req)	
  {	
  
	
  	
  	
  	
  //	
  No	
  HandleScope!	
  
	
  	
  	
  	
  Task*	
  task=	
  staPc_cast<	
  Task	
  *>(req-­‐>data);	
  
	
  	
  	
  	
  sleep(1000);	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  Do	
  something	
  useful	
  
	
  	
  	
  	
  task-­‐>theAnswer	
  =	
  42;	
  
}	
  
Получение результата
void	
  AsyncAber(uv_work_t*	
  req)	
  {	
  
	
  	
  	
  	
  HandleScope	
  scope;	
  
	
  	
  	
  	
  Task*	
  task	
  =	
  staPc_cast<	
  Task	
  *>(req-­‐>data);	
  
	
  
	
  	
  	
  	
  task-­‐>callback-­‐>Call(…);	
  	
  	
  //	
  Call	
  Task-­‐>callback	
  with	
  results.	
  
	
  	
  	
  	
  task-­‐>callback.Dispose();	
  //	
  Clean-­‐up	
  memory:	
  
	
  	
  	
  	
  delete	
  baton;	
  
}	
  
О чем следует помнить
u 

AsyncWork – блокирующая функция

u 

Внутри AsyncWork запрещен доступ к V8

u 

Task хранит аргументы и результат

u 

Используйте TryCatch при обращениях к V8
Использование TryCatch
//	
  Trying	
  to	
  call	
  JavaScript	
  callback:	
  
TryCatch	
  try_catch;	
  
callback-­‐>Call(Context::GetCurrent()-­‐>Global(),	
  	
  
	
  	
  	
  	
  1,	
  	
  	
  /*	
  Number	
  of	
  arguments	
  of	
  callback	
  	
  */	
  	
  
	
  	
  	
  	
  res	
  /*	
  Array	
  of	
  arguments	
  */);	
  
	
  
if	
  (try_catch.HasCaught())	
  {	
  
	
  	
  	
  	
  node::FatalExcepPon(try_catch);	
  
}	
  
Демонстрация
Дополненная реальность в браузере
u 

Используется только браузер и веб-камера

u 

Вся «магия» происходит на сервере

u 

Потоковая обработка в реальном времени

Захват кадра
(JavaScript)

Отправка
кадра
(node.js)

Визуализация

Обработка (С+
+)

Отправка
ответа
(node.js)
Попробовать дома
u  http://cloudcv.io/demo/ar/live
u  http://cloudcv.io

Посмотреть код
u  https://github.com/BloodAxe/CloudCV

https://github.com/BloodAxe/CloudCVBackend
А давайте
поговорим?
Спасибо за внимание!
u  ekhvedchenya@gmail.com	
  
u  @cvtalks	
  
u  computer-­‐vision-­‐talks.com	
  
u  cloudcv.io	
  

Дополненная Реальность в Облаке

  • 1.
    Дополненная Реальность в Облаке NODE.JS ИС++ ПОД ОДНОЙ КРЫШЕЙ Хведченя Евгений Computer Vision Talks
  • 2.
    Дополненная реальность Дополненная реальность (англ. augmentedreality, AR), — термин, относящийся ко всем проектам, направленным на дополнение реальности любыми виртуальными элементами.
  • 3.
    Дополненная реальность сегодня u  Возможностиограничены мощностью устройства u  Высокое энергопотребление u  30FPS – это минимум u  Обилие и фрагментация платформ u  Разнообразие языков программирования
  • 4.
    Дополненная реальность воблаке u  Работает везде u  Потребляет меньше энергии u  С++ для алгоритмов u  Производительность и масштабируемость u  Легкий обмен данными между устройствами
  • 5.
    Так появился CloudCV– Cloud Computer Vision Platform Цель – Algorithms as a Service
  • 6.
    Так появился CloudCV– Cloud Computer Vision Platform u  Инфраструктура для алгоритмов в облаке: u  u  3Д реконструкция u  Анализ видео (подсчет людей, выявление дефектов) u  u  Дополненная реальность Распознавание объектов и лиц Node.js & C++
  • 7.
    Альтернативы Node.js &C++ u  SWIG & JAVA u  RoR & C++ u  Boost.Python
  • 8.
    Почему C++ иNode.js С++ Node.js •  Производительность •  Простая обработка запросов •  Библиотеки •  Поддержка С++ •  Опыт разработки •  Легковесный •  Он прикольный J
  • 9.
    Node.js и C++такие разные u  Компиляция vs Интерпретация u  Строгая типизация vs Слабая типизация u  Makefile vs nothing u  И это работает!
  • 10.
    Взаимодействие Node.js иС++ u  Node.js построен на базе движка V8 u  V8 написан на С++ u  Можно грабить корованы писать свои модули u  ????? u  PROFIT!
  • 11.
    Минимальный модуль #include  <node.h>   #include  <v8.h>     using  namespace  v8;     Handle<Value>  Method(const  Arguments&  args)  {      HandleScope  scope;      return  scope.Close(String::New("world"));   }     void  init(Handle<Object>  exports)  {      exports-­‐>Set(String::NewSymbol("hello"),              FuncPonTemplate::New(Method)-­‐>GetFuncPon());   }     NODE_MODULE(hello,  init)  
  • 12.
    Что тут неправильно? #include  <node.h>   #include  <v8.h>     using  namespace  v8;     Handle<Value>  Method(const  Arguments&  args)  {      HandleScope  scope;      return  scope.Close(String::New("world"));   }     void  init(Handle<Object>  exports)  {      exports-­‐>Set(String::NewSymbol("hello"),              FuncPonTemplate::New(Method)-­‐>GetFuncPon());   }     NODE_MODULE(hello,  init)  
  • 13.
    Неблокирующие вычисления вС++ u  Node.js работает асинхронно u  Блокирующие задачи - в отдельном потоке u  Код С++ также должен следовать парадигме
  • 14.
    Как правильно 1.  Вызов функцииС++ из JavaScript 2.  Создание рабочего потока (libuv) 3.  WorkerFn – чистый С++ код (без V8) 4.  Возврат результата через callback
  • 15.
    Запуск обработчика Handle<Value>  Async(const  Arguments&  args)  {          HandleScope  scope;          Local<FuncPon>  callback  =  Local<FuncPon>::Cast(args[0]);          Task*  task  =  new  Task();          task-­‐>request.data  =  baton;          task-­‐>callback  =  Persistent<FuncPon>::New(callback);          uv_queue_work(uv_default_loop(),  &task-­‐>request,                  AsyncWork,  AsyncAber);          return  Undefined();   }  
  • 16.
    Передача данных междупотоками struct  Task  {          uv_work_t  request;          Persistent<FuncPon>  callback;                    //  Custom  data          int32_t  theAnswer;   };  
  • 17.
    Передача данных междупотоками struct  Task  {          uv_work_t  request;                                              //  Хранит  внутреннее  состояние  задачи          Persistent<FuncPon>  callback;                    //  Custom  data          int32_t  theAnswer;   };  
  • 18.
    Передача данных междупотоками struct  Task  {          uv_work_t  request;   //  Хранит  внутреннее  состояние  задачи        Persistent<FuncPon>  callback;   //  JavaScript  функция,  которая  будет  вызвана  по                    //  Custom  data          int32_t  theAnswer;   };   выполнению  работы  
  • 19.
    Асинхронный обработчик void  AsyncWork(uv_work_t*  req)  {          //  No  HandleScope!          Task*  task=  staPc_cast<  Task  *>(req-­‐>data);          sleep(1000);                                              //  Do  something  useful          task-­‐>theAnswer  =  42;   }  
  • 20.
    Получение результата void  AsyncAber(uv_work_t*  req)  {          HandleScope  scope;          Task*  task  =  staPc_cast<  Task  *>(req-­‐>data);            task-­‐>callback-­‐>Call(…);      //  Call  Task-­‐>callback  with  results.          task-­‐>callback.Dispose();  //  Clean-­‐up  memory:          delete  baton;   }  
  • 21.
    О чем следуетпомнить u  AsyncWork – блокирующая функция u  Внутри AsyncWork запрещен доступ к V8 u  Task хранит аргументы и результат u  Используйте TryCatch при обращениях к V8
  • 22.
    Использование TryCatch //  Trying  to  call  JavaScript  callback:   TryCatch  try_catch;   callback-­‐>Call(Context::GetCurrent()-­‐>Global(),            1,      /*  Number  of  arguments  of  callback    */            res  /*  Array  of  arguments  */);     if  (try_catch.HasCaught())  {          node::FatalExcepPon(try_catch);   }  
  • 23.
  • 24.
    Дополненная реальность вбраузере u  Используется только браузер и веб-камера u  Вся «магия» происходит на сервере u  Потоковая обработка в реальном времени Захват кадра (JavaScript) Отправка кадра (node.js) Визуализация Обработка (С+ +) Отправка ответа (node.js)
  • 25.
    Попробовать дома u  http://cloudcv.io/demo/ar/live u http://cloudcv.io Посмотреть код u  https://github.com/BloodAxe/CloudCV https://github.com/BloodAxe/CloudCVBackend
  • 26.
  • 27.
    Спасибо за внимание! u ekhvedchenya@gmail.com   u  @cvtalks   u  computer-­‐vision-­‐talks.com   u  cloudcv.io