The Khronos Group 18 ноября 2013 года представила предварительную спецификацию стандарта OpenVX 1.0 для компьютерного зрения. Поскольку Itseez был одним из инициаторов этой деятельности и активно участвовал в создании спецификации, мы решили рассказать про этот стандарт аудитории Хабрахабра.
Когда несколько лет назад инженеры Itseez начали заниматься компьютерным зрением на мобильных платформах, они были поражены тем, как медленно работают алгоритмы на процессорах мобильных телефонах по сравнению с настольными компьютерами, к которым тогда все привыкли. Простая функция изменения разрешения изображения (cv::resize) могла работать дольше 20 миллисекунд, почти не оставляя времени для обработки видео в реальном времени (функция, обрабатывающая 30 кадров в секунду, должна работать примерно 33 мс на кадр). Например, используя NEON оптимизацию, cv::resize можно ускорить более чем в 7 раз на ARM (см [1]). Стало очевидно, что необходимо более эффективное взаимодействие кода с SoC, причем не только с центральным процессором, а со всеми доступными ускорителями, включая GPU, DSP, ASIC, FPGA. Ни одна компания не будет решать такую задачу в одиночку, поэтому Itseez совместно с NVIDIA обратилась в Khronos Group с предложением создать стандарт для компьютерного зрения, представляющий из себя Hardware Abstraction Layer (HAL), то есть интерфейс, функции которого будут вызываться высокоуровневыми алгоритмами, а релизация будет оптимизирована под вычислительную архитектуру. Примеры стандартов от Khronos — OpenGL и OpenCL, — решают эту задачу для графики и общих вычислений соответственно. Предложение было поддержано большим количеством компаний, и была создана рабочая группа, председателем которой был избран сотрудник Itseez. В разработке стандарта принимают участие лидеры индустрии (см. ниже). С такой мощной поддержкой, которую получила идея OpenVX, можно действительно изменить индустрию, сделав разработку приложений компьютерного зрения как никогда простой!
Стандарт создан для того, чтобы ускорять алгоритмы компьютерного зрения прежде всего на мобильных и встроенных архитектурах.
OpenVX представляет из себя C API двух уровней: immediate mode и graph mode. Первый – это отдельные функции, по структуре очень похожие на примитивы из OpenCV. У всех функций есть эквивалент в OpenCV, по большей части в модуле imgproc.
Верхний уровень позволяет описать алгоритм компьютерного зрения в виде ориентированного графа, где каждый узел соответствует функции. Для каждой функции immediate mode существует эквивалентный узел графа. Граф полностью задается перед выполнением. Пользователь может определить свою функцию через C API callback и включить ее в граф (пользовательские узлы, см. user nodes в примере Stereo Machine Vision ниже). Оба уровня API работают с контейнерами для изображений, внутренняя структура которых не специфицирована, – пользователь оперирует с идентификаторами:
typedef uintptr_t vx_reference;
typedef vx_reference vx_image;
Таким образом, данные контейнеры являются непрозрачными (opaque), что дает большую свободу реализации. Распределение изображений и узлов графа по потокам и ускорителям почти никак не управляется стандартом, и, соответственно, остается на усмотрение разработчика, реализующего стандарт. В рамках этой архитектуры можно хранить изображения и исполнять функции OpenVX на ускорителях, что может сильно ускорить алгоритм или сделать его более энергоэффективным. Вообще, Graph API открывает большой простор для оптимизаций. Например, можно выполнять несколько операций паралелльно на разных ядрах или разных ускорителях. При определенных условиях можно исполнять два последовательных узла графа одновременно в одном потоке, выполняя вычисления на лету, или обрабатывать изображение по кускам (tiling), для того, чтобы повысить кэш-эффективность. Поддержка tiling для пользовательских узлов реализована при помощи расширения стандарта OpenVX 1.0 Tiling Extension — интерфейс, утвержденный группой OpenVX, но не обязательный к реализации для OpenVX 1.0. В дальнейшем, возможно, Tiling API станет обязательной частью следующих версий стандарта.
OpenVX с самого начала разрабатывался так, чтобы эффективно взаимодействовать с OpenCV: обмен данными по возможности без накладных расходов, очень близкие спецификации функций. Возможно, в дальнейшем, OpenCV будет использовать OpenVX для ускорения на ряде платформ. Но поскольку OpenVX 1.0 еще в разработке, да и OpenCV 3.0 будет архитектурно отличаться от предыдущих версий, описать модель взаимодействия сейчас сложно.
В течение работы над OpenVX мы получали много вопросов по поводу взаимодействия OpenVX и OpenCL. Например, почему OpenVX не может быть просто набором ядер (kernels) OpenCL? Мы решили сделать OpenVX не требующим зависимости от OpenCL, потому что есть ускорители, не поддерживающие OpenCL, но способные выполнять часть функций OpenVX. Тем не менее, OpenVX спроектирован так, чтобы сделать возможной реализацию OpenVX на OpenCL.
Очень многие разработчики технологий компьютерного зрения сейчас при работе ориентируются на одну платформу, выбирая алгоритм и оптимизируя его реализацию для одной системы. При условии широкой поддержки OpenVX для разных платформ, усилия по адаптации алгоритма для другой платформы будут минимальными. В ближайшем будущем это приведет к росту классных приложений компьютерного зрения для мобильных телефонов и планшетов. В более далекой перспективе OpenVX будет стимулировать производителей чипов к созданию ускорителей, ориентированных на OpenVX. Это приведет к радикальному ускорению технологий компьютерного зрения и создаст условия для более умных приложений, о которых сейчас никто даже не мечтает — такие, как измененная реальность на носимых устройствах (augmented reality on wearable devices) и функции безопасного вождения, доступные на автомобилях эконом-класса.
В настоящий момент опубликована предварительная версия спецификации (прямая ссылка на документ). Её цель – собрать отзывы сообщества и, по возможности, учесть их в финальной спецификации OpenVX 1.0, выпуск которой ожидается не позднее середины 2014 года. Сейчас можно оставить сообщения на форуме, в будущем откроется доступ к bugzilla. Мы призываем всех будущих пользователей OpenVX посмотреть на стандарт! И, конечно, всех энтузиастов компьютерного зрения мы приглашаем прислать свое резюме нам на адрес jobs@itseez.com!
Всем удачи и быстрых алгоритмов!
[1] Kari Pulli, Anatoly Baksheev, Kirill Kornyakov, Victor Eruhimov: Real-time computer vision with OpenCV. Commun. ACM (CACM) 55(6):61-69 (2012).
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.
Комментариев нет:
Отправить комментарий