Дополненная Реальность в Облаке
DESCRIPTION
TRANSCRIPT
![Page 1: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/1.jpg)
Дополненная Реальность в Облаке NODE.JS И С++ ПОД ОДНОЙ КРЫШЕЙ
Хведченя Евгений Computer Vision Talks
![Page 2: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/2.jpg)
Дополненная реальность
Дополненная реальность (англ. augmented reality, AR), — термин, относящийся ко всем проектам, направленным на дополнение реальности любыми виртуальными элементами.
![Page 3: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/3.jpg)
Дополненная реальность сегодня
u Возможности ограничены мощностью устройства
u Высокое энергопотребление u 30FPS – это минимум u Обилие и фрагментация платформ u Разнообразие языков программирования
![Page 4: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/4.jpg)
Дополненная реальность в облаке
u Работает везде u Потребляет меньше энергии u С++ для алгоритмов u Производительность и масштабируемость u Легкий обмен данными между устройствами
![Page 5: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/5.jpg)
Так появился CloudCV – Cloud Computer Vision Platform
Цель – Algorithms as a Service
![Page 6: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/6.jpg)
Так появился CloudCV – Cloud Computer Vision Platform
u Инфраструктура для алгоритмов в облаке: u Дополненная реальность u 3Д реконструкция
u Анализ видео (подсчет людей, выявление дефектов) u Распознавание объектов и лиц
u Node.js & C++
![Page 7: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/7.jpg)
Альтернативы Node.js & C++
u SWIG & JAVA u RoR & C++ u Boost.Python
![Page 8: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/8.jpg)
Почему C++ и Node.js
С++ Node.js
• Производительность
• Библиотеки
• Опыт разработки
• Простая обработка запросов
• Поддержка С++
• Легковесный
• Он прикольный J
![Page 9: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/9.jpg)
Node.js и C++ такие разные
u Компиляция vs Интерпретация u Строгая типизация vs Слабая типизация u Makefile vs nothing u И это работает!
![Page 10: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/10.jpg)
Взаимодействие Node.js и С++
u Node.js построен на базе движка V8 u V8 написан на С++ u Можно грабить корованы писать свои модули u ????? u PROFIT!
![Page 11: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/11.jpg)
Минимальный модуль
#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)
![Page 12: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/12.jpg)
Что тут неправильно?
#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)
![Page 13: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/13.jpg)
Неблокирующие вычисления в С++
u Node.js работает асинхронно u Блокирующие задачи - в отдельном потоке u Код С++ также должен следовать парадигме
![Page 14: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/14.jpg)
Как правильно
1. Вызов функции С++ из JavaScript 2. Создание рабочего потока (libuv) 3. WorkerFn – чистый С++ код (без V8) 4. Возврат результата через callback
![Page 15: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/15.jpg)
Запуск обработчика
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();
}
![Page 16: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/16.jpg)
Передача данных между потоками
struct Task {
uv_work_t request;
Persistent<FuncPon> callback;
// Custom data
int32_t theAnswer;
};
![Page 17: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/17.jpg)
Передача данных между потоками
struct Task {
uv_work_t request;
Persistent<FuncPon> callback;
// Custom data
int32_t theAnswer;
};
// Хранит внутреннее состояние задачи
![Page 18: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/18.jpg)
Передача данных между потоками
struct Task {
uv_work_t request;
Persistent<FuncPon> callback;
// Custom data
int32_t theAnswer;
};
// JavaScript функция, которая будет вызвана по выполнению работы
// Хранит внутреннее состояние задачи
![Page 19: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/19.jpg)
Асинхронный обработчик
void AsyncWork(uv_work_t* req) {
// No HandleScope!
Task* task= staPc_cast< Task *>(req-‐>data);
sleep(1000); // Do something useful task-‐>theAnswer = 42;
}
![Page 20: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/20.jpg)
Получение результата
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;
}
![Page 21: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/21.jpg)
О чем следует помнить
u AsyncWork – блокирующая функция u Внутри AsyncWork запрещен доступ к V8 u Task хранит аргументы и результат u Используйте TryCatch при обращениях к V8
![Page 22: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/22.jpg)
Использование 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);
}
![Page 23: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/23.jpg)
Демонстрация
![Page 24: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/24.jpg)
Дополненная реальность в браузере
u Используется только браузер и веб-камера u Вся «магия» происходит на сервере u Потоковая обработка в реальном времени
Захват кадра (JavaScript)
Отправка кадра
(node.js)
Обработка (С++)
Отправка ответа
(node.js)
Визуализация
![Page 25: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/25.jpg)
u http://cloudcv.io/demo/ar/live u http://cloudcv.io
Посмотреть код u https://github.com/BloodAxe/CloudCV
https://github.com/BloodAxe/CloudCVBackend
Попробовать дома
![Page 26: Дополненная Реальность в Облаке](https://reader035.vdocuments.site/reader035/viewer/2022081716/5495eeffb47959f06a8b479c/html5/thumbnails/26.jpg)
А давайте поговорим?