OpenCV — 20! Второй проект центра разработки Intel в России
Мы продолжаем рассказ о проектах и продуктах, неразрывно связанных с российским центром разработки Intel. И сегодня речь пойдет о проекте-ровеснике Intel в Нижнем Новгороде — он тоже в этом году отмечает двадцатилетие! Это хорошо известная и широко используемая (а также широко известная и хорошо используемая), без преувеличения великая библиотека компьютерного зрения OpenCV. Ее создатели поделились с нами своими воспоминаниями — как все начиналось и что из этого получилось.
Открытая библиотека для открытого сообщества
Хотя мы и говорим про двадцатилетие, но на самом деле жизнь OpenCV началась гораздо раньше.
Intel пришел в Россию в самом начале 90-х, сначала это был офис продаж в Москве, но быстро подтянулись и другие подразделения — посмотреть на имеющиеся в стране кадры. Пилотный проект по созданию математических подпрограмм был создан Intel при институте ВНИИЭФ (город Саров) в 1992 году. Легенды гласят, что некоторые процедуры в саровской программной реализации при той же точности оказались быстрее, чем аппаратная реализация в FPU i386. Это привело, при содействии существовавшей тогда комиссии Гор-Черномырдин (по вопросам российско-американского сотрудничества в области экономики и технологии), к заключению контракта между Intel и ВНИИЭФ на разработку оптимизированных математических библиотек. Вот он, именно тот случай, когда хотели как лучше, а получили, как еще лучше.
В рамках контракта в Сарове разрабатывалась библиотека оптимизированных математических ядер, получившая название Intel MKL (Math Kernel Library) и не изменившая его до сих пор. Чуть позднее добавились библиотеки обработки сигналов (Signal Processing Library, SPL), обработки изображений (Image Processing Library, IPL), примитивов распознавания речи и некоторые другие, требовавшие от своих создателей знания не только программирования и микроархитектуры x86, но и математики и физики.
Очень старый баннер OpenCV
Контракт развивался успешно, он оказался очень кстати для Intel, ведь только-только появилась технология векторных инструкций MMX, и библиотеки оптимизированных под нее функций, предназначенные для различных областей применения, были незаменимы для её продвижения.
Команда, участвовавшая в контракте, бурлила, кипела идеями, но режимные ограничения закрытого города Саров и работавшего на оборонную промышленность института ВНИИЭФ затрудняли общение с американскими коллегами. Взвесив все «за» и «против», часть команды решила отделится и переехать в Нижний Новгород. Так, в 1997 году появилась Нижегородская Программная Технологическая Лаборатория (NSTL), также сотрудничавшая по контракту с Intel.
Когда в России у Intel были уже две лаборатории, набор разрабатываемых библиотек расширился. Появились библиотека сжатия изображений (Intel JPEG Library, IJL), сжатия видео (Intel MPEG Library, MPL) и, наконец, она — библиотека компьютерного зрения (Intel Computer Vision Library, CVL), позднее ставшая OpenCV. Предполагалось, что CVL пополнит вышеописанное семейство библиотек и будет развиваться параллельно со старшими «сестрами». Но ее ждала более удивительная судьба.
Системные требования OpenCV начала 2000-х
Почему компьютерное зрение? Почему в Intel? Ответ на эти вопросы есть в выдержавшей уже три издания книге про OpenCV, написанной одним из главных инициаторов создания и открытия миру OpenCV — Гари Брадски (Gary Bradski).
А именно, посещая ведущие американские университеты, Гари заметил, что у студентов есть заметный интерес к исследованиям в области компьютерного зрения, есть и сами исследования, а вот универсального и быстро работающего решения для них нет — каждая группа была вынуждена изобретать свой собственный велосипед.
При этом, Intel всегда была важна степень вклада программных решений в успех компании на рынке. И если MKL и другие «солидные» библиотеки семейства пошли по проторенному в то время пути коммерческих продуктов с закрытым исходным кодом, предлагающих пользователю гарантированный уровень качества и поддержки, то для CVL это модель не годилась.
Было посчитано, что важнее заинтересовать большее количество энтузиастов в относительно молодой области алгоритмов компьютерного зрения, предложить им экосистему для экспериментов и инноваций, используя при этом технологические преимущества процессорных архитектур Intel. Так OpenCV пошла по пути свободно распространяемой библиотеки с открытым исходным кодом.
Сейчас, когда все крупные компании участвуют в разработке открытого кода и поддерживают проекты, разрабатываемые другими командами, это решение кажется очевидным. Но тогда, 20 лет назад, компании еще далеко не прониклись идеей, что программисты, которым они платят зарплату, будут отдавать код в открытый доступ. В этом смысле Intel показал себя как компания, способная принимать очень нестандартные решения. Но это было непросто.
Похоже, это действительно был первый open-source проект от Intel! До этого компания, скорее всего, уже вносила вклад в Linux и другие открытые проекты на этой платформе, но информации о собственных проектах Intel, сделанных до OpenCV найти не удалось.
Гари Брадски — великий и ужасный веселый
Выпустить библиотеку под открытой лицензией предложил все тот же Гари Брадски, взяв на вооружение принцип: «It’s easier to get forgiveness than permission» (проще получить прощение, чем разрешение). Конечно, библиотека была выпущена не пиратским способом, но, это был реальный пример использования корпоративного принципа Intel «risk taking» (рискуй!).
Окончательное решение о выпуске OpenCV конечно не обошлось без одобрения Ричарда Вирта (Richard Wirt), основателя и тогдашнего руководителя отдельного подразделения разработки софта в Intel, так много сделавшего для становления Intel в России.
В первое время отношение к этому решению было настороженное, причём и в российской части компании, но, поскольку после открытия OpenCV группа создателей из Intel продолжала управлять разработкой, инфраструктурой и политикой в проекте, а библиотека стала набирать популярность, все привыкли к такому положению дел, и оно стало новой нормой.
Итак, идея CVL, исходящая от Гари Брадски и еще одного сотрудника Intel США, Шинна Ли (Shinn Horng Lee), была с энтузиазмом и профессионализмом принята российской стороной во главе с Валерием Федоровичем Курякиным, руководившим исследовательскими проектами Intel.
И работа над OpenCV началась. Первая запись в логах библиотеки датируется мартом 1999 года.
За первый год была собрана определенная база алгоритмов классического компьютерного зрения, включавшая в себя:
- средства работы с изображениями и контурными представлениями объектов. Контурные алгоритмы были важны для быстродействия на процессорах того времени
- алгоритмы трекинга объектов и анализа движения, включающие в себя знаменитый алгоритм оптического потока Лукаса-Канаде, а также быстрый алгоритм трекинга цветных объектов CamShift, разработанный самим основателем библиотеки Гари Брадски.
- калибровка камер, портированная с пакета MATLAB авторства Жана-Ива Буге, в то время инженера Intel, впоследствии одного из основных разработчиков Google Street View
- простые (классические) алгоритмы распознавания лиц на базе собственных подпространств. Позже, в 2002 году, в библиотеку добавился один из самых популярных ее алгоритмов всех времен, детектор лиц на базе алгоритма Виолы-Джонса, улучшенного и расширенного инженером Intel Райнером Лейнартом.
- и так далее — всего примерно 100 функций
Уже с первого релиза очень важной и одной из популярнейших частей библиотеки, пережившей всё, и даже пришествие deep learning, стал модуль с необычным названием HighGUI, разработанный участником команды Виктором Ерухимовым. HighGUI позволял пользователям с помощью лишь нескольких строчек кода читать изображения из файлов, получать видео с камеры, отображать результаты работы алгоритмов на экране, добавлять слайдеры для контроля параметров в реальном времени, выделять точки и области на экране мышкой и т.д.
Эта функциональность сделала библиотеку чрезвычайно удобной и популярной в исследовательских кругах, а когда позднее, также при участии Виктора, в библиотеку была добавлена поддержка языка Python, причин не использовать OpenCV для экспериментов в компьютерном зрении просто не осталось. Таким образом, мечта Гари Брадски дать исследователям удобный и бесплатный инструмент стала осуществляться уже через два года после начала проекта.
Немного российского колорита OpenCV, иллюстрация из хабропоста про сборку OpenCV 4.0 для Raspbian
Как появилось название OpenCV? На этот счёт нет единого мнения. Одна версия — от пользователей библиотеки, предположительно из какого-то университета США. Вообще энтузиазм и активность из университетов, разных исследовательских групп были большими. И чем дальше — тем больше. Кстати, логотип библиотеки — тоже дело рук её пользователя — Adi Shavit. По другой версии, название OpenCV придумал всё тот же Гари Брадски, но, как бы то ни было, первая версия с названием OpenCV вышла в июне 2000 г.
Примечательно, что до 2006 года (!) OpenCV жила в статусе beta.
OpenCV и ее команда
Для работы над новой библиотекой была набрана небольшая, но интеллектуальная, амбициозная и творческая команда из молодых людей, незадолго до этого окончивших ННГУ. Лидером команды стал Вадим Писаревский, получивший впоследствии звание Intel Principal Engineer, — своим существованием, во многом, OpenCV обязана именно ему.
Причём, на момент начала работы над CVL в компании уже существовала компетенция в обработке и распознавании изображений (медицинских рентгенограмм, электронных плат), поддерживалась творческая связь с сотрудниками нижегородского университета и НИИ ПМК. Здесь в первую очередь следует вспомнить Бориса Модестовича Чудиновича, автора изобретений, эксперта по контурным алгоритмам, который щедро делился с сотрудниками и стажерами компании своим не просто многолетним, а многодесятилетним опытом. Но этого, конечно, было недостаточно.
Команда OpenCV Intel, 2019 год
Молодой была не только команда OpenCV, но и само компьютерное зрение — уже тогда, задолго до эпохи big data, оно активно развивалось. Как и остальные технологии в мире — программные и железные. Так что команде не хватало примерно всех знаний. Осваивали, как писать эффективный код на C++; как тестировать; как реализовывать на практике статьи из интернета, чтобы получить и подтвердить, а не случайно опровергнуть описанный в них результат; как работать с Linux, как работать с камерами и т.д.
У команды было несколько настольных книг: Trucco & Verri, Jähne и Faugeras, по которым и реализовывались классические алгоритмы. Эти книги тогда нельзя было купить в России, Гари Брадски привозил их с каждой командировкой в Нижний Новгород. Часть модулей (например, калибрация камеры) делалась по статьям и кодам MATLAB.
Тестирование на правильность реализации было большой проблемой, потому что данных почти не было. Иногда тесты на алгоритмы компьютерного зрения оказывались сложнее самих алгоритмов. OpenCV приходилось, в том числе, тестировать и на своих создателях. И ни один из них от этого не пострадал! Скорее, даже выиграл. На фото ниже — один из создателей OpenCV Валерий Черепенников, с 2013 по 2016 год занимавший пост генерального директора по исследованиям и разработкам Intel в России.
2001 год, тест Фильтра Калмана для объектного отслеживания
А вот опять Гари Брадски, показывающий работу алгоритма Motion Templates.
Качество картинкок характерно для цифровых камер 20 лет назад
Время развития
Между тем двадцать первый век все продолжал ускоряться — OpenCV пора было осваивать новые платформы. Как раз в это время Intel купила компанию StrongARM, и помимо традиционной уже к тому времени архитектуры x86 MMX/SSE OpenCV была оптимизирована и для ARM (XScale) WMMX — аппаратной платформы вымерших предков современных смартфонов под названием PocketPC.
Портативные компьютеры Pocket PC с Intel XScale. 2002 год, фото с сайта hpc.ru
Звонить они не умели, встроенной камеры и GPS у них не было, а в качестве ОС использовалась памятная многим Windows CE. Но это был настоящий компьютер, в революционно маленьком форм-факторе. А значит, мог и должен был что-то видеть! С помощью OpenCV, конечно.
В то время в процессорах начала появляться гипер-поточность (hyper-threading), уровень технологий уже позволял разместить на кристалле процессора два ядра, а затем и больше. Перед библиотеками встала задача параллелизации вычислений и алгоритмов. В OpenCV сначала применялась технология OpenMP, но позднее добавилось распараллеливание с помощью Intel Threading Building Blocks (TBB) и просто системными потоками.
Архитектура и интерфейс OpenCV также значительно менялись со временем. Вначале библиотека имела интерфейс С, как и остальные библиотеки высокопроизводительных функций, и базировалась на структурах и типах данных библиотеки IPL, воплощая идею иерархии уровней. Затем, как развитие этой идеи, был добавлен интерфейс С++ (ставший позднее основным), заменены структуры и типы данных закончившей свою жизнь библиотеки IPL на собственные.
Кстати, помните Шинна Ли, совместно с Гари Брадски, завезшего идею OpenCV в Россию? Впоследствии он стал евангелистом библиотеки Intel Performance Primitives (IPP), преемницы IPL и SPL, разработанной в Сарове под руководством Бориса Сабанина. Возможно, поэтому OpenCV и IPP так тесно связаны. Но тесно — не значит «жёстко». Связь OpenCV с библиотекой Intel IPP в разное время бывала более сильной, когда множество функций OpenCV вызывали внутри функции из IPP, и менее сильной, когда функции из IPP заменялись на собственную реализацию. При этом, хотя Intel IPP оставалась закрытой и платной, OpenCV могла автоматически обнаруживать присутствие IPP и использовать ее для ускорения.
Более того, начиная с версии OpenCV 3.0 функции IPP для работы с изображениями, использовавшиеся в OpenCV, выделены в отдельную библиотеку IPP-ICV, которая бесплатно распространяется вместе с OpenCV.
Справедливости ради надо отметить, что OpenCV способна автоматически обнаруживать и использовать для ускорения не только IPP, но и MKL, но случаев использования последней — на порядок меньше в силу специфики алгоритмов компьютерного зрения, чаще требующих обработки «маленьких» по меркам MKL ядер.
Книги по OpenCV — малая толика
На пике первой фазы развития, в 2002–2003 годах над библиотекой в Intel работало около 15 человек, потом ресурсы резко сократились. И кто знает, как бы сложилась дальнейшая судьба OpenCV, если бы не настойчивость и упорство Вадима Писаревского. Когда у библиотеки практически не было финансовой поддержки, Вадим несколько раз менял работу, сначала внутри компании, потом вне, чтобы продолжать работать над проектом.
В какой-то момент, после выхода OpenCV 2.0 в 2009 году, официальный проект Intel под названием «OpenCV» был прекращен — библиотека была, казалось бы, окончательно отпущена Intel в свободное плаванье.
Но, при этом, десятки групп внутри Intel продолжали использовать библиотеку в своей работе. На OpenCV проверялась производительность новых процессорных архитектур — от серверов до интернета вещей, с ее помощью создавались впечатляющие демо новых технологий. Более того, OpenCV в Intel не просто использовалась, а еще и развивалась! Всё это время сотрудники компании продолжали вносить свой вклад в код OpenCV. Так, в это время в OpenCV была добавлена существенная оптимизация с использованием векторных инструкций AVX2.
Без OpenCV тяжело представить использование камер Intel Real Sense…. Дроны? Гетерогенные системы? Беспилотные авто? Глубокое машинное обучение? Во всех этих случаях один из краеугольных компонентов успешного развития технологии — OpenCV.
Команда Itseez в 2015 году
Поэтому дальнейшее решение Intel было совершенно естественно и закономерно. На новом витке развития в 2016 году Intel купил основанную бывшими сотрудниками Intel и известную, прежде всего, своей ключевой ролью в развитии библиотеки OpenCV компанию Itseez.
Итак, с 2016 года Intel снова стоит во главе развития OpenCV.
OpenCV сегодня в цифрах и ссылках
Что же представляет из себя OpenCV сейчас? Для ее пользователей это, прежде всего, репозиторий на GitHub, причем не один, а три:
На странице основного проекта по звездам можно приближенно судить о минимальном количестве пользователей-разработчиков с GitHub — 45.2k. Количество контрибьюторов также солидное — 1151 (около 95% это внешние по отношению к Intel контрибьюторы).
Разработчики очень любят считать строчки кода в своих проектах — в OpenCV их сейчас около миллиона. Естественно, это число постоянно увеличивается — только за 2019 год было принято более 1000 патчей.
Судя по статистике SourceForge, с сентября 2001 года по январь 2019 OpenCV была скачана немногим менее 19 миллионов раз, а официальные пакеты OpenCV за май месяц 2020 скачали более 140 тысяч раз.
Но есть еще и неофициальные. Скажем, неофициальный пакет OpenCV для Python, существующий с сентября 2016 года, за последний месяц имеет более 2.5 миллионов скачиваний.
Как уже говорилось, OpenCV написана на C++. Однако существует большое количество привязок (bindings) для множества популярных языков и платформ.
- Официальная поддержка: Python, Java, JavaScript.
- Поддержка коммьюнити: Node.JS, Matlab, C# и .Net, D, Go, Haskell, R, Rust
- Новые внедрения: Swift, Julia
- Наверняка вы можете пополнить этот список.
В компании работой над OpenCV занята большая (значительно больше футбольной) опытная команда. Ежегодно летом к ней присоединяются студенты Летних Школ Intel, реализующие интересные дополнения и улучшения OpenCV. Так, летом 2020 студентам предложена задача добавления в библиотеку компьютерного зрения OpenCV функциональности работы… со звуком. Более того, OpenCV продолжает участвовать в Google Summer of Code.
Пользуясь случаем, команда OpenCV благодарит все комьюнити проекта за неоценимую помощь — без усилий множества людей было бы просто невозможно добиться таких успехов и такого многообразия.
OpenCV продолжает активное развитие, впереди пятая версия и множество новых фич!
В заключение новость последних дней: OpenCV переходит с лицензии BSD на лицензию Apache2.
Начиная работать над OpenCV в 1999 г., и ничего не зная про компьютерное зрение в тот момент, не ожидал, что проект получится таким долгоиграющим, и что я задержусь в нем так надолго. Но через него прошло так много замечательных людей, и с еще большим числом замечательных людей из сообщества я познакомился и работал вместе, так что даже ради этого стоило им заниматься. Сообщество, кстати, библиотеку с самого начала, а особенно с 2012 года, когда мы переехали на github, активно поддерживало, и добрым словом, и баг репортами и патчами. Иногда были очень забавные случаи, например, один парень из Германии прислал нам некую новую функциональность, очень аккуратно сделанную, мы ее интегрировали, написали про нее в анонсе очередного релиза, и потом через некоторое время он написал, что благодаря такой наглядной демонстрации своих скиллов он сумел поменять нелюбимую работу на работу, связанную с компьютерным зрением — то, чем он всегда хотел заниматься. Что еще раз наглядно подтверждает поговорку «везёт тому кто везёт».
Вадим Писаревский, в настоящее время сотрудник Shenzhen Institute of Artificial Intelligence and Robotics for Society
Из впечатляющих для меня успехов OpenCV вспомнился проект в ННГУ с 5–7 студентами, которые никогда распознаванием и даже обработкой изображений не занимались, да и в программировании были не экспертами. Проект был конкурсным для европейских университетов, мы подали заявку, нас приняли, прислали базу данных изображений и видео, на которых мы должны были обнаруживать тревожные ситуации типа человек в метро, в переходе или на улице оставляет сумку, а сам уходит. Были зафиксированы условия, задачи, требования, критерии. На все давалось ограниченное время. Группа заняла место в середине списка, даже чуть повыше, вначале я огорчился, но потом узнал, что две-три команды, которые оторвались от нас заметно, занимались этой тематикой уже годы, это было их специализацией, а мы вот так с лету, без подготовки и опыта обошли большинство принявших участие в состязании университетов, а было их где-то около 20-ти. Надо ли упоминать, что основным инструментом разработки была OpenCV? Без нее в такие ограниченные сроки ничего путного не получилось бы. Так что «глаза боятся, руки делают» — что-то такое я студентом и говорил, и они это сделали.
Валерий Федорович Курякин, на момент появления OpenCV — руководитель исследовательских проектов Intel
Мне кажется, успех OpenCV в начале 2000-х был связан с тем, что библиотека решала стандартные задачи компьютерного зрения, которые были нужны всем в этой области: от работы с вебкамерой до функции калибрации камеры и стереопары. Исследователи тогда, в основном, работали на матлабе (computer vision toolbox появился намного позднее) с разрозненными наборами скриптов, было очень неудобно. Поскольку код был открыт, можно было адаптировать его для своих задач, а BSD лицензия позволяла коммерческое использование.
Мне очень приятно, что OpenCV стала практически необходимым элементом для решений, использующих компьютерное зрение. Как многие другие популярные проекты с открытым кодом, OpenCV прошла путь от одноуровневой библиотеки, созданной небольшой командой, до масштабного продукта, который разрабатывается всем сообществом. 20 лет для программного проекта, особенно в области, где все быстро меняется, — это очень много. Здорово, что библиотека по-прежнему популярна и широко используется для решения самых разных задач.
Виктор Ерухимов, в настоящее время CEO Itseez3D Inc., OpenCV.org board member
Строго говоря, изначально я напрямую в проекте OpenCV не участвовал. Когда все только начиналось, я работал в проектах IPL, IPP, где вырос от инженера до руководителя проекта. Тем не менее, OpenCV, конечно, сыграла определенную роль и в моей жизни. В частности, когда стало понятно, что нужно разделить библиотеки по уровням детализации, т.е. высокоуровневые вроде IPL, а впоследствии и OpenCV и низкоуровневые (вычислительные ядра) как IPP, и мы сфокусировались на низкоуровневых библиотеках, через некоторое время стал ощущаться отрыв от знания, в каких условиях должны работать наши низкоуровневые вычислительные ядра. Пришло понимание, что нужно также смотреть и на уровень алгоритмов, с тем, чтобы отбирать правильные части для реализации в качестве вычислительных ядер. Что значит правильные? Значит, достаточно общие, чтобы быть переиспользованными в разных алгоритмах, но все-таки достаточно узконаправленные, содержащие плотные вычисления, чтобы эффективно применять низкоуровневую оптимизацию. И в этом плане OpenCV, алгоритмы, реализованные в ней, служили источником для обсуждений и выбора интерфейса и самих низкоуровневых функций для IPP. Могу сказать, что такого рода анализ помог мне в расширении кругозора.
Владимир Дудник, с 2019 г. руководитель OpenCV команды в Intel