company_banner

OpenVX: стандарт компьютерного зрения

    Автор: Виктор Ерухимов, исполнительный директор Itseez, председатель рабочей группы OpenVX

    The Khronos Group 18 ноября 2013 года представила предварительную спецификацию стандарта OpenVX 1.0 для компьютерного зрения. Поскольку Itseez был одним из инициаторов этой деятельности и активно участвовал в создании спецификации, мы решили рассказать про этот стандарт аудитории Хабрахабра.


    Зачем нужен OpenVX


    Когда несколько лет назад инженеры 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


    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 и другие инструменты Open-две-заглавные-буквы


    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 будет стимулировать производителей чипов к созданию ускорителей, ориентированных на OpenVX. Это приведет к радикальному ускорению технологий компьютерного зрения и создаст условия для более умных приложений, о которых сейчас никто даже не мечтает — такие, как измененная реальность на носимых устройствах (augmented reality on wearable devices) и функции безопасного вождения, доступные на автомобилях эконом-класса.

    Как я могу повлиять на OpenVX?


    В настоящий момент опубликована предварительная версия спецификации (прямая ссылка на документ). Её цель – собрать отзывы сообщества и, по возможности, учесть их в финальной спецификации 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).
    Intel 199,04
    Компания
    Поделиться публикацией
    Похожие публикации
    Комментарии 19
    • +4
      Я уже ранее немного ознакомился со стандартом. Пока, по моему сугубо личному мнению, перспективы OpenVX в ближайшей время довольно туманные — пол года до его выхода и еще не известно сколько до поддержки в различных устройствах (вспоминаем как со скрипом продвигалась поддержка OpenCL). Тем не менее в отдаленной перспективе вполне возможно его широкое распространение, так что вы делаете безусловно весьма полезное дело. За что вам большое спасибо!
      • +3
        Спасибо за интерес к OpenVX! Вы совершенно правы, что до широкого распространения еще надо дожить, но OpenVX для реализации несколько (а, чаще всего, намного) проще, чем OpenCL, поскольку это просто C API. Так что есть надежда, что OpenVX будет распространяться быстрее.
      • +2
        Правильное дело делаете, надеюсь все получится и станет популярным.
      • 0
        Любопытно. При программировании на OpenCL основная часть времени тратиться на перекачку в видеопамять и обратно. Если это время сравнимо с временем, за которое всё можно обработать на проце — смысла ускорять через видюху нет. На мобильных устройствах как я понимаю одна пямять. Значит ли это, что там можно будет напрямую вызывать распараллеливание без перекачки данных?
        • 0
          Проблему перекачки данных они попытались решить при помощи графов — довольно элегантное решение.
          • 0
            При корректной реализации OpenCL накладные расходы на копирование связаны с архитектурой памяти, а не с OpenCL. То есть если вы запускаете ваш OpenCL код на архитектуре с общей памятью для CPU и GPU, накладные расходы на копирование могут быть намного меньше, чем для систем с раздельной памятью. То есть решение о том, делать вычисления на CPU или GPU, зависят от архитектуры. OpenVX с graph API предоставляет абстракцию, благодаря которой вы о таких деталях не думаете, а решение о том, где делать вычисления, принимает алгоритм, реализующий вычисление графа, который для архитектуры с общей памятью примет одно решение, а для раздельной памяти — другое.
          • 0
            Молодцы! Восхищаюсь тем, что вы развиваете систему OpenCV и более того — осваиваете новые направления, типа OpenVX подтягивая к данному процессу производителей «железа».
          • –1
            Похвальная инициатива, но вот только объясните мне глупому зачем строить видео-аналитику на архитектуре ARM/ASIC/DSP/FPGA?
            Я конечно понимаю, что некоторые компании разрабатывают камеры со встроенной видео-аналитикой и строя камеру на ARM/ASIC/DSP/FPGA ускорение операций анализа видео-потока дает выйгрышь, но лично мне кажется, что это утопичная идея — чтобы камера занималась поиском номеров машин в видео-потоке или распознаванием лиц, это приведет к росту цены такой камеры, причем к значительному, гораздо проще производить обработку потока на серверах, их мощности гораздо проще нарастить.
            Да, Вы конечно можете сказать, что грядет эра умных роботов и машин которые будут ездить без водителя и там без ARM не обойтись и для этого все это и делается, но пардон, все это звучит как минимум смешно, если до сих пор нет программы поиска и определения номерных знаков или дорожных знаком для смартфона (а может я плохо искал и она есть? ткните пальцем, буду примного благодарен).
            • +1
              Данная технология является самым современным направлением и без нее невозможно построить качественные пассивные системы распознавания образов трехмерного мира. Можно, конечно делать активные системы типа Microsoft Kinect или LIDAR, но это однопользовательские системы — два таких прибора не смогут работать в одной комнате по одному и тому же объекту — таким образом, это системы «пустышки», которые имеют крайне ограниченное применение и изначально созданы в целях запудривания мозгов массам. Смартфоны имея карту глубины изображения смогут распознавать окружающие предметы и можно будеть говорить о дополненной реальности, а это следующее поколение информационных систем и огромный рынок потребления для софтверных компаний и для производителей смартфонного «железа». Вот поэтому организовалась инициативная группа и в нее по «быстрому» вошли все ведущие компании. Стоять в сторонке и смотреть как делят самый перспективный рынок ни кому не охота. Самое интересное, что фирмы Philips и LG скромно сидят на данной технологии со своими 3D телевизорами и не сильно то афишируют свои достижения, а они умеют переводить в объем видеопоток и есть у меня смутные подозрения, что могут переводить в объем даже статичные картинки.
              Мало того, на Тайване появилась фирма, которая уже как пол года производит специализированный процессор для дополненной реальности — правда только инженерные образцы, но мы скоро увидим их в ноутбуках (3D web камера), а может и в смартфонах то же.
              1) Система поиска и распознавания дорожных знаков — самый неудачный пример применения который только можно было придумать для смартфона. Эти системы давным давно есть в люкс версиях автомобилей типа Mercedes Benz S500.
              2) Распознавание лиц уже несколько лет встроено в ОС Андроид как одна из возможностей разблокировки экрана смартфона (можно жестами, можно паролем).
              • 0
                Столько внимания мобильным системам уделяется потому, что именно они сейчас предоставляют основной источник данных для компьютерного зрения, и с ними связаны наиболее актуальные задачи. Для мобильного телефона в первую очередь это даже не augmented reality, а улучшение снимков и видео (computational photography — HDR, intelligent focus and white balance, video stabilization и тп). Для автомобиля — детектирование пешеходов, детектирование смены ряда, предупреждение о столкновении с автомобилем впереди. Конечно, все такие системы имеют смысл только при интеграции с системой управления автомобилем — при пересечении границы ряда без включенного поворотника будет, например, дрожать руль, а при угрозе столкновения с пешеходом или автомобилем будет включаться торможение. Все такие задачи должны решаться на устройстве (мобильный телефон, автомобиль), потому что никакой пропускной способности сети не хватит, чтобы передавать данные на сервер, и обеспечить отсутствие задержек при ответе (latency).
                На ARM сейчас действительно сложно что-то сделать, хотя наша система распознавания дорожных знаков как раз работает на мощном смартфоне в реальном времени. Давайте посмотрим немного с другой стороны. Почему на мобильных телефонах есть приложения с достаточно сложной компьютерной графикой (игры, конечно, в первую очередь)? Потому что к моменту, когда смартфоны начали производить массово, уже был OpenGL, была создана его мобильная версия, и все производители графических карт знали, что нужно программистам. Были сделаны графические карты и драйверы к ним, реализующие OpenGL. Вот мы хотим, чтобы такая же ситуация была с компьютерным зрением — основные операции должны быть стандартизированы, тогда появятся ускорители (они, кстати, уже появляются), и программисты смогут создавать сложные программы.

                Определение номерных знаков — это нишевая задача, я не могу придумать, зачем ее программировать на мобильном телефоне. Распознавание дорожных знаков мы делаем для автомобилей, а на смартфон портировали просто для того, чтобы было проще демонстрировать потенциальным клиентам. Тем более, что железки, которые стоят в автомобиле, похожи на смартфон (иногда несколько мощнее, иногда слабее). К слову, распознавание знаков реализовано не только в Mercedes, а во вполне бюджетном Ford Focus 3 (link).
              • –2
                Извините, но я не алигарх и у меня нет столько денег чтобы купить автомобиль типа Mercedes Benz S500, я вот неск. тыс. рублей на программу опред. знаков для смартфона я бы выделил.

                И покажите ка мне эту встроенную в андроид систему распознавания лиц, а? Разблокировки экрана по графическому паролю это даже не работа с жестами, вы что то путаете.

                Преобразование 2D в 3D ну да это круто, в моём LG TV это есть, а толку то, за пол года его эксплуатации я ни разу не воспользовался этой функцией, как и многие другие облодатели таких TV. Так что данный функционал просто не востребован, хотя и был включён в стоимость TV.

                Лучше бы производители железа и софта объединились инаписали открытую систему офлайн распознавания голоса — она как раз более востребована на рынке. Только не говорите что такая система уже есть, да есть но она закрыта и работает только на андроиде.
                • +1
                  Android face unlock — www.android.com/about/ice-cream-sandwich/ (см Face Unlock). Так же гуглятся пользовательские отзывы — что система неидеальна, но работает достаточно неплохо, и является полезной.
                • 0
                  Гигаспасибо за пост. Я буду теперь отсылать к нему всех интересующихся OpenVX, а таких немало.

                  У меня только мелкая придирка (я, помимо прочего, главред блога Intel на хабре, т.е. по работе постоянно придираюсь к текстам разных авторов, так что можете не обращать внимания, если не хотите ). А именно, я не понимаю, что тут делает фраза «Например, используя NEON оптимизацию, cv::resize можно ускорить более чем в 7 раз на ARM (см [1]).»? Векторизация пропрционально ускоряет любой исходный код, независимо от того, медленный он или быстрый, так что это знание ничего не дает. Кроме того, если ускорить в 7 раз, то по числам получается, что и на одном CPU все будет работать нормально (3мс на ф-ю), но оттуда делается вывод «Стало очевидно, что необходимо более эффективное взаимодействие кода с SoC,....GPU...». В общем, без этой фразы про NEON я понимаю все, с ней — ничего :) Поясни, плииз.
                  • 0
                    Вика, привет! Тут ускорение было на одном потоке продемонстрировано, распараллеливания не было. В целом, я согласен, что логика хромает — я старался писать лаконично. Но, я думаю, общая идея понятна: есть функции, которые очень хорошо ускоряются с использованием NEON, а есть другие функции, которые лучше ускоряются на GPU, а есть специальные ускорители, вычисляющие оптический поток. И хочется иметь единый способ взаимодействия со всем этим многообразием. Хотя такая логика — это тоже сильное упрощение реального мира :-)
                  • 0
                    Вика, привет! Тут ускорение было на одном потоке продемонстрировано, распараллеливания не было. В целом, я согласен, что логика хромает — я старался писать лаконично. Но, я думаю, общая идея понятна: есть функции, которые очень хорошо ускоряются с использованием NEON, а есть другие функции, которые лучше ускоряются на GPU, а есть специальные ускорители, вычисляющие оптический поток. И хочется иметь единый способ взаимодействия со всем этим многообразием. Хотя такая логика — это тоже сильное упрощение реального мира :-)
                    • 0
                      Отличная инициатива, а как обстоят дела со внедрением этой технологии через 2 с небольшим года?
                      • 0

                        Ох, как быстро время пролетело :-)


                        Мы (рабочая группа OpenVX) выпустили первую версию спецификации (OpenVX 1.0) в 2014 году, а в 2015 было выпущено обновление 1.0.1 с рядом улучшений, в основном, инфраструктурных функций. Стандарт включает не только спецификацию, но и conformance tests, которые проверяют реализацию стандарта на соответствие спецификации. В настоящее время ряд компаний публично заявили о создании реализации OpenVX, вся информация доступна в новостях https://www.khronos.org/news/categories/category/openvx. Информация о последней версии спецификации доступна здесь https://www.khronos.org/openvx/. Следите за новостями!

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое