Node.js and C++ #foss-sea.org.ua

28
Дополненная Реальность в Облаке NODE.JS И С++ ПОД ОДНОЙ КРЫШЕЙ Хведченя Евгений Computer Vision Talks

description

 

Transcript of Node.js and C++ #foss-sea.org.ua

Page 1: Node.js and C++ #foss-sea.org.ua

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

Хведченя ЕвгенийComputer Vision Talks

Page 2: Node.js and C++ #foss-sea.org.ua

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

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

Page 3: Node.js and C++ #foss-sea.org.ua

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

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

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

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

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

Разнообразие языков программирования

Page 4: Node.js and C++ #foss-sea.org.ua

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

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

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

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

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

Легкий обмен данными между устройствами

Page 5: Node.js and C++ #foss-sea.org.ua

cloudcv.io

Так появился CloudCV – Cloud Computer Vision Platform

Цель – Algorithms as a Service

Page 6: Node.js and C++ #foss-sea.org.ua

cloudcv.io

Так появился CloudCV – Cloud Computer Vision Platform

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

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

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

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

Node.js & C++

Page 7: Node.js and C++ #foss-sea.org.ua

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

SWIG & JAVA

RoR & C++

Boost.Python

Page 8: Node.js and C++ #foss-sea.org.ua

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

С++ Node.js

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

• Библиотеки

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

• Простая обработка

запросов

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

• Легковесный

• Он прикольный

Page 9: Node.js and C++ #foss-sea.org.ua

Node.js и C++ такие разные

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

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

Makefile vs nothing

И это работает!

Page 10: Node.js and C++ #foss-sea.org.ua

Взаимодействие Node.js и С++

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

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

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

?????

PROFIT!

Page 11: Node.js and C++ #foss-sea.org.ua

Минимальный модуль

#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"), FunctionTemplate::New(Method)->GetFunction());}

NODE_MODULE(hello, init)

Page 12: Node.js and C++ #foss-sea.org.ua

Что тут неправильно?

#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"), FunctionTemplate::New(Method)->GetFunction());}

NODE_MODULE(hello, init)

Page 13: Node.js and C++ #foss-sea.org.ua

Неблокирующие вычисления в С++

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

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

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

Page 14: Node.js and C++ #foss-sea.org.ua

Как правильно

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

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

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

4. Возврат результата через callback

Page 15: Node.js and C++ #foss-sea.org.ua

Запуск обработчика

Handle<Value> Async(const Arguments& args) {

HandleScope scope;

Local<Function> callback = Local<Function>::Cast(args[0]);

Task* task = new Task();

task->request.data = task;

task->callback = Persistent<Function>::New(callback);

uv_queue_work(uv_default_loop(), &task->request,

AsyncWork, AsyncAfter);

return Undefined();

}

Page 16: Node.js and C++ #foss-sea.org.ua

Передача данных между потоками

struct Task {

uv_work_t request;

Persistent<Function> callback;

// Custom data

int32_t theAnswer;

};

Page 17: Node.js and C++ #foss-sea.org.ua

Передача данных между потоками

struct Task {

uv_work_t request;

Persistent<Function> callback;

// Custom data

int32_t theAnswer;

};

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

Page 18: Node.js and C++ #foss-sea.org.ua

Передача данных между потоками

struct Task {

uv_work_t request;

Persistent<Function> callback;

// Custom data

int32_t theAnswer;

};

// JavaScript функция, которая будет вызвана по выполнению работы

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

Page 19: Node.js and C++ #foss-sea.org.ua

Асинхронный обработчик

void AsyncWork(uv_work_t* req) {

// No HandleScope!

Task* task= static_cast< Task *>(req->data);

sleep(1000); // Do something useful task->theAnswer = 42;

}

Page 20: Node.js and C++ #foss-sea.org.ua

Получение результата

void AsyncAfter(uv_work_t* req) {

HandleScope scope;

Task* task = static_cast< Task *>(req->data);

task->callback->Call(…); // Call Task->callback with results.

task->callback.Dispose(); // Clean-up memory:

delete baton;

}

Page 21: Node.js and C++ #foss-sea.org.ua

Использование в JS

var cppModule = require(‘hello’);

cppModule.hello(“some input”, function(result) {

// result.theAnswer = 40});

Page 22: Node.js and C++ #foss-sea.org.ua

О чем следует помнить

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

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

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

Используйте TryCatch при обращениях к V8

Page 23: Node.js and C++ #foss-sea.org.ua

Использование 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::FatalException(try_catch);

}

Page 24: Node.js and C++ #foss-sea.org.ua

Демонстрация

Page 25: Node.js and C++ #foss-sea.org.ua

Дополненная реальность в браузере

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

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

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

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

Отправка кадра

(node.js)

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

Отправка ответа

(node.js)

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

Page 26: Node.js and C++ #foss-sea.org.ua

http://cloudcv.io

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

Попробовать дома

Page 27: Node.js and C++ #foss-sea.org.ua

А давайте поговорим?

Page 28: Node.js and C++ #foss-sea.org.ua

Спасибо за внимание!

[email protected] @cvtalks computer-vision-talks.com cloudcv.io