SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Downloaden Sie, um offline zu lesen
Дополненная
Реальность
в Облаке
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	
  

Weitere ähnliche Inhalte

Was ist angesagt?

Эффективное использование спотовых узлов Amazon EC2 / Дмитрий Пушкарев (Molec...
Эффективное использование спотовых узлов Amazon EC2 / Дмитрий Пушкарев (Molec...Эффективное использование спотовых узлов Amazon EC2 / Дмитрий Пушкарев (Molec...
Эффективное использование спотовых узлов Amazon EC2 / Дмитрий Пушкарев (Molec...Ontico
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)it-park
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooMail.ru Group
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)Smolensk Computer Science Club
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and ClojureVasil Remeniuk
 
Autoscaling for fun and profit
Autoscaling for fun and profitAutoscaling for fun and profit
Autoscaling for fun and profitAlexander Demidko
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Ontico
 
Денис Колодин: Low-latency и soft-realtime на Python
Денис Колодин: Low-latency и soft-realtime на PythonДенис Колодин: Low-latency и soft-realtime на Python
Денис Колодин: Low-latency и soft-realtime на Pythonit-people
 
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Ontico
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupMail.ru Group
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис РечкуновJSib
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)Ontico
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Badoo Development
 
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JSFestUA
 
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkDF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkMoscowDataFest
 
Highload: специализированные высокопроизводительные индексы
Highload: специализированные высокопроизводительные индексыHighload: специализированные высокопроизводительные индексы
Highload: специализированные высокопроизводительные индексыPavel Egorov
 

Was ist angesagt? (20)

Эффективное использование спотовых узлов Amazon EC2 / Дмитрий Пушкарев (Molec...
Эффективное использование спотовых узлов Amazon EC2 / Дмитрий Пушкарев (Molec...Эффективное использование спотовых узлов Amazon EC2 / Дмитрий Пушкарев (Molec...
Эффективное использование спотовых узлов Amazon EC2 / Дмитрий Пушкарев (Molec...
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
Autoscaling for fun and profit
Autoscaling for fun and profitAutoscaling for fun and profit
Autoscaling for fun and profit
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
 
OpenACC short review
OpenACC short reviewOpenACC short review
OpenACC short review
 
Денис Колодин: Low-latency и soft-realtime на Python
Денис Колодин: Low-latency и soft-realtime на PythonДенис Колодин: Low-latency и soft-realtime на Python
Денис Колодин: Low-latency и soft-realtime на Python
 
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
 
введение в Gpu
введение в Gpuвведение в Gpu
введение в Gpu
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
 
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...
 
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkDF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
 
Highload: специализированные высокопроизводительные индексы
Highload: специализированные высокопроизводительные индексыHighload: специализированные высокопроизводительные индексы
Highload: специализированные высокопроизводительные индексы
 
Apache spark
Apache sparkApache spark
Apache spark
 

Andere mochten auch

ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Alexey Paznikov
 
OpenCV 3.0 - Latest news and the Roadmap
OpenCV 3.0 - Latest news and the RoadmapOpenCV 3.0 - Latest news and the Roadmap
OpenCV 3.0 - Latest news and the RoadmapEugene Khvedchenya
 

Andere mochten auch (6)

ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
 
OpenCV 3.0 - Latest news and the Roadmap
OpenCV 3.0 - Latest news and the RoadmapOpenCV 3.0 - Latest news and the Roadmap
OpenCV 3.0 - Latest news and the Roadmap
 

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

Node.js and C++ #foss-sea.org.ua
Node.js and C++ #foss-sea.org.uaNode.js and C++ #foss-sea.org.ua
Node.js and C++ #foss-sea.org.uaEugene Khvedchenya
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один goBadoo Development
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееGetDev.NET
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализацияYandex
 
Wild Async .NET world: AID Kit for boy-scouts
Wild Async .NET world: AID Kit for boy-scoutsWild Async .NET world: AID Kit for boy-scouts
Wild Async .NET world: AID Kit for boy-scoutsHYS Enterprise
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к AnsibleIvan Grishaev
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Yandex
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Sigma Software
 
6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remotingKewpaN
 
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...Ontico
 

Ähnlich wie Дополненная Реальность в Облаке (20)

Node.js and C++ #foss-sea.org.ua
Node.js and C++ #foss-sea.org.uaNode.js and C++ #foss-sea.org.ua
Node.js and C++ #foss-sea.org.ua
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущее
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Wild Async .NET world: AID Kit for boy-scouts
Wild Async .NET world: AID Kit for boy-scoutsWild Async .NET world: AID Kit for boy-scouts
Wild Async .NET world: AID Kit for boy-scouts
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
 
UA Mobile 2012
UA Mobile 2012UA Mobile 2012
UA Mobile 2012
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting
 
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
 

Mehr von GeeksLab Odessa

DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...GeeksLab Odessa
 
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...GeeksLab Odessa
 
DataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский ВикторDataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский ВикторGeeksLab Odessa
 
DataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображениеDataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображениеGeeksLab Odessa
 
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...GeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладGeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладGeeksLab Odessa
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладGeeksLab Odessa
 
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...GeeksLab Odessa
 
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...GeeksLab Odessa
 
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко GeeksLab Odessa
 
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...GeeksLab Odessa
 
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...GeeksLab Odessa
 
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...GeeksLab Odessa
 
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...GeeksLab Odessa
 
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...GeeksLab Odessa
 
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...GeeksLab Odessa
 
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот GeeksLab Odessa
 
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...GeeksLab Odessa
 
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js GeeksLab Odessa
 

Mehr von GeeksLab Odessa (20)

DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
DataScience Lab2017_Коррекция геометрических искажений оптических спутниковых...
 
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
DataScience Lab 2017_Kappa Architecture: How to implement a real-time streami...
 
DataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский ВикторDataScience Lab 2017_Блиц-доклад_Турский Виктор
DataScience Lab 2017_Блиц-доклад_Турский Виктор
 
DataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображениеDataScience Lab 2017_Обзор методов детекции лиц на изображение
DataScience Lab 2017_Обзор методов детекции лиц на изображение
 
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
DataScienceLab2017_Сходство пациентов: вычистка дубликатов и предсказание про...
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
 
DataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-докладDataScienceLab2017_Блиц-доклад
DataScienceLab2017_Блиц-доклад
 
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
DataScienceLab2017_Cервинг моделей, построенных на больших данных с помощью A...
 
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
DataScienceLab2017_BioVec: Word2Vec в задачах анализа геномных данных и биоин...
 
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
DataScienceLab2017_Data Sciences и Big Data в Телекоме_Александр Саенко
 
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
DataScienceLab2017_Высокопроизводительные вычислительные возможности для сист...
 
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
DataScience Lab 2017_Мониторинг модных трендов с помощью глубокого обучения и...
 
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
DataScience Lab 2017_Кто здесь? Автоматическая разметка спикеров на телефонны...
 
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
DataScience Lab 2017_From bag of texts to bag of clusters_Терпиль Евгений / П...
 
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
DataScience Lab 2017_Графические вероятностные модели для принятия решений в ...
 
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
DataScienceLab2017_Оптимизация гиперпараметров машинного обучения при помощи ...
 
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
DataScienceLab2017_Как знать всё о покупателях (или почти всё)?_Дарина Перемот
 
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
JS Lab 2017_Mapbox GL: как работают современные интерактивные карты_Владимир ...
 
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
 

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

  • 1. Дополненная Реальность в Облаке NODE.JS И С++ ПОД ОДНОЙ КРЫШЕЙ Хведченя Евгений Computer Vision Talks
  • 2. Дополненная реальность Дополненная реальность (англ. augmented reality, 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);   }  
  • 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
  • 27. Спасибо за внимание! u  ekhvedchenya@gmail.com   u  @cvtalks   u  computer-­‐vision-­‐talks.com   u  cloudcv.io