Русский
Русский
English
Статистика
Реклама

20 лет - 20 проектов

3D Говорящие Головы. Третий проект центра разработки Intel в России

23.07.2020 10:06:27 | Автор: admin

Согласно известной шутке все мемуары в книжных магазинах должны располагаться в разделе Фантастика. Но в моём случае это и правда так! Давным-давно в далёкой-далёкой галактике в российском центре разработки Intel мне довелось участвовать в реально фантастическом проекте. Проекте настолько удивительном, что я хочу воспользоваться своим служебным положением редактора блога Intel в личных целях, и в рамках цикла 20 лет 20 проектов рассказать про эту работу.
3D Talking Heads (Трехмерные Говорящие Головы) это показывающий язык и подмигивающий бронзовый бюст Макса Планка; обезьянка, в реальном времени копирующая вашу мимику; это 3D модель вполне узнаваемой головы вице-президента Intel, созданная полностью автоматически по видео с его участием, и еще много всего Но обо всём по порядку.

Синтетическое видео: MPEG-4 совместимые 3D Говорящие Головы полное название проекта, осуществленного в Нижегородском Центре Исследований и Разработки Intel в 2000-2003 годах. Разработка представляла собой набор трёх основных технологий, которые можно использовать как совместно, так и по отдельности во многих приложениях, связанных с созданием и анимацией синтетических трехмерных говорящих персонажей.

  1. Автоматическое распознавание и слежение за мимикой и движениями головы человека на видео последовательности. При этом оцениваются не только углы поворота и наклона головы во всех плоскостях, но и внешние и внутренние контуры губ и зубов при разговоре, положение бровей, степень прикрытия глаз и даже направление взгляда.
  2. Автоматическая анимация в реальном времени практически произвольных трехмерных моделей голов в соответствии c параметрами анимации, полученными как при помощи алгоритмов распознавания и трекинга из первого пункта так из любых других источников.
  3. Автоматическое создание фотореалистичной 3D модели головы конкретного человека с использованием либо двух фотографий прототипа (вид спереди и сбоку), либо видео последовательности, на которой человек поворачивает голову от одного плеча к другому.

И еще бонусом технологии, а, точнее, некоторые хитрости реалистичного рендеринга говорящих голов в реальном времени с учетом существовавших в начале 2000-х ограничений производительности железа и возможностей софта.

А связующим звеном между этими тремя с половиной пунктами, а также привязкой к Intel служат четыре буквы и одна цифра: MPEG-4.

MPEG-4


Немногие знают, что появившийся в 1998 году стандарт MPEG-4 помимо кодирования обычных, реальных видео и аудио потоков предусматривает кодирование информации о синтетических объектах и их анимации так называемое синтетическое видео. Одним из таких объектов и является человеческое лицо, точнее голова, заданная в виде триангулированной поверхности сетки в 3D пространстве. MPEG-4 определяет на лице человека 84 особые точки Feature Points (FP): уголки и середины губ, глаз, бровей, кончик носа и т.д.

К этим особым точкам (или ко всей модели в целом в случае поворотов и наклонов) и применяются анимационные параметры Facial Animation Parameters (FAP), описывающие изменение положения и выражения лица по сравнению с нейтральным состоянием.


Иллюстрация из спецификации MPEG-4. Особые точки модели. Как видите, модель может шмыгать носом и шевелить ушами.

То есть, описание каждого кадра синтетического видео, показывающего говорящего персонажа, выглядит как небольшой набор параметров, по которым MPEG-4 декодер должен анимировать модель.

Какую модель? В MPEG-4 есть два варианта. Либо модель создается энкодером и передается декодеру один раз в начале последовательности, либо у декодера есть своя, проприетарная модель, которая и используется в анимации.

При этом, единственные требования MPEG-4 к модели: хранение в VRML-формате и наличие особых точек. То есть, моделью может служить как фотореалистичная копия человека, чьи FAP используются для анимации, так и модель любого другого человека, и даже говорящий чайник главное, чтобы у него, помимо носика, были рот и глаза.


Одна из наших MPEG-4 совместимых моделей самая улыбчивая

Помимо основного объекта лицо, MPEG-4 описывает независимые объекты верхняя челюсть, нижняя челюсть, язык, глаза, на которых также задаются особые точки. Но если у какой-то модели этих объектов нет, то соответствующие им FAP просто не используются декодером.


Модель, модель, а почему у тебя такие большие глаза и зубы? Чтобы лучше себя анимировать!

Откуда берутся персонализированные модели для анимации? Как получить FAP? И, наконец, как осуществить реалистичную анимацию и визуализацию на основе этих FAP? На все эти вопросы MPEG-4 не даёт никаких ответов так же, как и любой стандарт сжатия видео ничего не говорит о процессе съёмки и содержании кодируемых им фильмов.

До чего дошел прогресс? До невиданных чудес!


Конечно же, и модель и анимацию могут создать вручную профессиональные художники, потратив на это десятки часов и получив десятки сотен долларов. Но это значительно сужает область использования технологии, делает её неприменимой в промышленных масштабах. А потенциальных применений у технологии, фактически сжимающей кадры видео высокого разрешения до нескольких байт (ох, жаль, что не любого видео) существует масса. Прежде всего, сетевых игры, образование и общение (видеоконференции) при помощи синтетических персонажей.

Особенно актуальны подобные применения были 20 лет тому назад, когда в интернет еще выходили с помощью модемов, а гигабитный безлимитный интернет казался чем-то вроде телепортации. Но, как показывает жизнь, и в 2020 году пропускная способность интернет-каналов во многих случаях всё еще остается проблемой. И даже если такой проблемы нет, скажем, речь идет о локальном использовании, синтетические персонажи способны на многое. Скажем, воскресить в фильме знаменитого актёра прошлого века, или дать возможность посмотреть в глаза популярным сейчас и до сих пор бесплотным голосовым помощникам. Но сначала процесс перехода от реального видео говорящего человека к синтетическому должен стать автоматическим, или хотя бы, обходиться минимальным участием человека.

Именно это и было реализовано в нижегородском Intel. Идея возникла сперва как часть реализации библиотеки MPEG Processing Library, разрабатываемой в свое время в Intel, а потом выросла не просто в полноценный spin-off, а в настоящий фантастический блокбастер.


Синтетический Валерий Федорович Курякин, продюсер, режиссер-постановщик, автор сценария, а местами и каскадёр проекта в то время руководитель группы разработчиков Intel.

Во-первых, фантастической была комбинация столь разных технологий в рамках одного небольшого проекта, над которым одновременно работало всего лишь от трёх до семи человек. В те годы в мире уже существовал как минимум, десяток компаний, занимавшихся как распознаванием и слежением за лицом, так и созданием и анимацией говорящих голов. У всех них, безусловно, были достижения в некоторых областях: у кого-то отличного качества модели, кто-то показывал очень реалистичную анимацию, кто-то достиг успехов в распознавании и слежении. Но ни одна компания не смогла предложить весь набор технологий, позволяющий полностью автоматически создать синтетическое видео, на котором модель, очень похожая на свой прототип, хорошо копирует его мимику и движения.


Конвейер проекта по производству синтетических клонов образца 2003 года

Во-вторых, фантастическим было сочетание существовавшего в то время железа и реализованных в проекте технологических решений, а также планов по их использованию. Так, на момент начала проекта в моем кармане лежала Нокия 3310, на рабочем столе стоял Pentium III-500MHz, а особо критичные к производительности алгоритмы для работы в реальном времени тестировались на сервере Pentium 4-1.7GHz со 128 Mb оперативной памяти.

При этом мы рассчитывали на то, что в скором времени наши модели будут работать в мобильных устройствах, а качество будет не хуже, чем у героев вышедшего на экраны в то время (2001 год) фотореалистичного компьютерного анимационного фильма "Последняя Фантазия"


$137 миллионов составили затраты на фильм, созданный на рендер-ферме из ~1000 компьютеров Pentium III. Постер с сайта www.thefinalfantasy.com

Но давайте посмотрим, что же получилось у нас.

Распознавание и отслеживание лица, получение FAP.


Эта технология была представлена в двух вариантах:

  • режим реального времени (25 кадров в секунду на уже упомянутом процессоре Pentium 4-1.7GHz), когда отслеживается человек, непосредственно стоящий перед видеокамерой, соединенной с компьютером;
  • оффлайн режим (со скоростью 1 кадр в секунду на том же компьютере), когда распознавание и трекинг происходят по предварительно записанному видеофрагменту.

При этом, в реальном времени отслеживалась динамика изменения положения/состояния человеческого лица мы могли приблизительно оценить углы поворота и наклона головы во всех плоскостях, примерную степень открывания и растяжения рта и поднятия бровей, распознать моргание. Для некоторых приложений такой приблизительной оценки достаточно, но, если нужно точно отследить мимику человека, то необходимы более сложные алгоритмы, а значит, более медленные.

В режиме оффлайн наша технология позволяла оценить не только положение головы в целом, но абсолютно точно распознать и отследить внешние и внутренние контуры губ и зубов при разговоре, положение бровей, степень прикрытия глаз, и даже смещение зрачков направление взгляда.

Для распознавания и слежения была использована комбинация общеизвестных алгоритмов компьютерного зрения, часть из которых к тому моменту была уже реализована в только что выпущенной библиотеке OpenCV - например, Optical Flow, а также собственных оригинальных методов, основанных на априорных знаниях о форме соответствующих объектов. В частности на нашей усовершенствованной версии метода деформируемых темплейтов, на которую участники проекта получили патент.
Технология была реализована в виде библиотеки функций, принимавших на вход видеокадры с лицом человека, и выдающих соответствующие этим кадрам FAP.


Качество распознавания и отслеживания FP образца 2003 года

Конечно, технология была несовершенна. Распознавание и отслеживание сбоили, если у человека в кадре были усы, очки или глубокие морщины. Но за три года работы качество значительно повысилось. Если в первых версиях для распознавания движения моделям при съемках видео приходилось наклеивать на соответствующие FP точки лица особые метки белые бумажные кружки, полученные при помощи офисного дырокола, то в финале проекта ничего подобного, конечно же не требовалось. Более того, нам удалось достаточно устойчиво отслеживать положение зубов и направление взгляда и это на разрешении видео с вебкамер того времени, где такие детали были едва различимы!


Это не ветрянка, а кадры из детства технологии распознавания. Intel Principle Engineer, а в то время начинающий сотрудник Intel Александр Бовырин учит синтетическую модель читать стихи

Анимация


Как уже было неоднократно сказано, анимация модели в MPEG-4 полностью определяется FAP. И всё было бы просто, если бы не пара проблем.
Во-первых, тот факт, что FAP из видео последовательности извлекаются в 2D, а модель трёхмерная, и требуется как-то достраивать третью координату. То есть, радушная улыбка в профиль (а у пользователей должна быть возможность этот профиль увидеть, иначе смысла в 3D немного) не должна превращаться в зловещую ухмылку.
Во-вторых, как тоже было сказано, FAP описывают движение особых точек, которых в модели около восьмидесяти, в то время как хоть сколько-нибудь реалистичная модель в целом состоит из нескольких тысяч вершин (в нашем случае от четырех до восьми тысяч), и нужны алгоритмы, вычисляющие смещение всех остальных точек модели на основе смещений FP.

То есть, понятно, что при повороте головы на равный угол повернутся все точки, но при улыбке, даже если она до ушей, возмущение от сдвига уголка рта должно, постепенно затухая, двигать щеку, но не уши. Более того, это должно происходить автоматически и реалистично для любых моделей с любой шириной рта и геометрией сетки вокруг него. Для решения этих задач в проекте были созданы алгоритмы анимации. Они основывались на псевдомускульной модели, упрощенно описывающей мышцы, управляющие мимикой лица.

А далее для каждой модели и каждого FAP предварительно автоматически определялась зона влияния вовлеченные в соответствующее действие вершины, движения которых и рассчитывались с учётом анатомии и геометрии сохранения гладкости и связности поверхности. То есть, анимация состояла из двух частей предварительной, выполняемой оффлайн, где создавались и заносились в таблицу определённые коэффициенты для вершин сетки, и онлайн, где с учетом данных из таблицы анимация в реальном времени применялась к модели.


Улыбка непростое дело для 3D модели и её создателей

Создание 3D модели конкретного человека.


В общем случае задача реконструкции трёхмерного объекта по его двумерным изображениям очень сложна. То есть, алгоритмы её решения человечеству давно известны, но на практике из за многих факторов получаемый результат далек от желаемого. И особенно это заметно в случае реконструкции формы лица человека здесь можно вспомнить наши первые модели с глазами в форме восьмёрки (неудачно легла тень от ресниц на исходных фото) или лёгким раздвоением носа (причину за давностью лет уже не восстановить).

Но в случае MPEG-4 говорящих голов задача сильно упрощается, ведь набор черт человеческого лица (нос, рот, глаза, и т.д.) одинаков для всех людей, а внешние различия, по которым мы все (и программы компьютерного зрения) отличаем людей друг от друга геометрические размеры\пропорции и расположение этих черт и фактурные цвета и рельеф. Поэтому один из профилей синтетического видео MPEG-4, калибровочный (calibration), который и был реализован в проекте, предполагает, что у декодера имеется обобщенная модель абстрактного человека, которая персонализируется под конкретного человека по фото или видео-последовательности.


Наш сферический человек в вакууме модель для персонализации

То есть, происходят глобальная и локальная деформации 3D сетки для соответствия пропорциям черт лица прототипа, выделенным на его фото\видео, после чего на модель накладывается фактура прототипа то есть, текстура, созданная из тех же входных изображений. В результате и получается синтетическая модель. Делается это один раз для каждой модели, конечно же, оффлайн, и конечно же, не так просто.

Прежде всего, требуется регистрация или ректификация входных изображений приведение их к одной системе координат, совпадающей с системой координат 3D модели. Далее на входных изображениях необходимо детектировать особые точки, и на основе их расположения деформировать 3D модель, например, при помощи метода радиальных базисных функций, после чего, используя алгоритмы сшивки панорам, сгенерировать текстуру из двух или нескольких входных изображений, то есть, смешать их в правильной пропорции для получения максимальной визуальной информации, а также компенсировать разницу в освещении и тоне, всегда присутствующую даже в фото, сделанных с одинаковыми настройками камеры (что далеко не всегда так), и очень заметную при совмещении этих фото.


Это не кадр из фильмов ужасов, а текстура 3D-модели Pat Gelsinger, созданной с его разрешения при демонстрации проекта на Intel Developer Forum в 2003 году

Первоначальная версия технологий персонализации модели по двум фото была реализована самими участниками проекта в Intel. Но по достижении определённого уровня качества и осознании ограниченности своих возможностей, было решено передать эту часть работы исследовательской группе Московского Государственного Университета, имевшей опыт в данной области. Результатом работы исследователей из МГУ под руководством Дениса Иванова стало приложение Head Calibration Environment, выполнявшее все вышеописанные операции по созданию персонализированной модели человека по его фото в анфас и профиль.

Единственный тонкий момент приложение не было интегрировано с описанным выше разработанным в нашем проекте блоком распознавания лица, так что необходимые для работы алгоритмов особые точки на фото требовалось отмечать вручную. Конечно, не все 84, а только основные, а с учётом того, что у приложения имелся соответствующий пользовательский интерфейс, на эту операцию требовалось всего несколько секунд.

Также была реализована полностью автоматическая версия реконструкции модели по видео последовательности, на которой человек поворачивает голову от одного плеча к другому. Но, как нетрудно догадаться, качество текстуры, извлеченной из видео было значительно хуже, чем у текстуры, созданной с фотографий цифровых камер того времени с разрешением ~4K (3-5 мегапикселей), а значит, менее привлекательно выглядела и полученная модель. Поэтому существовал и промежуточный вариант с использованием нескольких фото разного угла поворота головы.


Верхний ряд виртуальные люди, нижний реальные.

Насколько хорошим был достигнутый результат? Качество полученной модели надо оценивать не в статике, а непосредственно на синтетическом видео по сходству с соответствующим видео оригинала. Но термины похоже и не похоже не математические, они зависят от восприятия конкретного человека, и понять, насколько наша синтетическая модель и ее анимация отличаются от прототипа сложно. Кому-то нравится, кому-то нет. Но итогом трёхлетней работы стало то, что при демонстрации результатов на различных выставках зрителям приходилось пояснять, в каком окне перед ними реальное видео, а в каком синтетическое.

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


Для демонстрации результатов работы всех вышеописанных технологий был создан специальный плеер MPEG-4 синтетического видео. На вход плеер принимал VRML файл с моделью, поток (или файл) с FAP, а также потоки (файлы) с реальным видео и аудио для синхронизированного показа с синтетическим видео с поддержкой режима картинка в картинке. При демонстрации синтетического видео пользователю давалась возможность приблизить модель, а также посмотреть на неё со всех сторон, просто повернув мышью под произвольным углом.



Хотя плеер и был написан для Windows, но с учетом возможного портирования в будущем на другие OS, в том числе мобильные. Поэтому в качестве 3D библиотеки была выбрана классическая OpenGL 1.1 безо всяких расширений.

При этом плеер не просто показывал модель, но и пытался её улучшить, но только не ретушировать, как это принято сейчас у фотомоделей, а наоборот, сделать как можно реалистичнее. А именно, оставаясь в рамках простейшего освещения Фонга и не имея никаких шейдеров, зато имея строгие требования к производительности, блок визуализации плеера автоматически создавал синтетическим моделям: мимические морщины, ресницы, способные реалистично сужаться и расширяться зрачки; надевал на модели очки подходящего размера; а также при помощи простейшей трассировки лучей рассчитывал освещение (затенение) языка и зубов при разговоре.

Конечно, сейчас такие методы уже неактуальны, но вспомнить их достаточно интересно. Так, для синтеза мимических морщин, то есть, небольших изгибов рельефа кожи на лице, видимых во время сокращения лицевых мышц, относительно крупные размеры треугольников сетки модели не позволяли создать настоящие складки. Поэтому была применена разновидность технологии наложения рельефа (bump mapping) normal mapping. Вместо изменений геометрии модели происходило изменение направления нормалей к поверхности в нужных местах, а зависимость диффузной компоненты освещенности в каждой точке от нормали создавала нужный эффект.


Такой он, синтетический реализм.

Но плеером дело не ограничилось. Для удобства использования технологий и передачи их во внешний мир была создана объектная библиотека Intel Facial Animation Library, содержащая функции для анимации (3D трансформации) и визуализации модели, так что любой желающий (и имеющий источник FAP) вызовами нескольких функций СоздатьСцену, СоздатьАктера, Анимировать мог оживить и показать свою модель в своем приложении.

Итоги


Что дало участие в этом проекте лично мне? Конечно же, возможность совместной работы с замечательными людьми над интересными технологиями. В проект меня взяли за знание методов и библиотек рендеринга 3D моделей и оптимизации производительности под х86. Но, естественно, ограничиться 3D не удалось, пришлось пойти в другие измерения. Для написания плеера понадобилось разобраться с парсингом VRML (готовых библиотек для этой цели не имелось), освоить нативную работу с потоками в Windows, обеспечив совместную работу нескольких тредов с синхронизацией 25 раз в секунду, не забыв про взаимодействие с пользователем, и даже продумать и реализовать интерфейс. Позже к этому списку добавилось участие в улучшении алгоритмов отслеживания лица. А необходимость постоянно интегрировать и просто сочетать с плеером написанные другими членами команды компоненты, а также представлять проект во внешнем мире значительно прокачала мои навыки коммуникации и координации.

Что дало участие в этом проекте Intel? В результате нашей командой был создан продукт, способный служить хорошим тестом и демонстрацией возможностей платформ и продуктов Intel. Причем, как железа CPU и GPU, так и программного обеспечения наши головы (и реальные и синтетические) внесли свой вклад в улучшение библиотеки OpenCV.

Кроме этого, можно смело утверждать, что проект оставил видимый след в истории по итогам работы его участниками были написаны статьи и представлены доклады на профильные конференции по компьютерному зрению и компьютерной графике, российские (GraphiCon), и международные.
А демонстрационные приложения 3D Talking Heads показаны Intel на десятках выставок, форумов и конгрессов по всему мирy.

За прошедшее время технологии, конечно, сильно продвинулись, соответственно, упростив автоматическое создание и анимацию синтетических персонажей. Появились Intel Real Sense камеры с определением глубины, а нейронные сети на основе больших данных научились генерировать реалистичные изображения даже несуществующих людей.
Но, всё же, размещенные в публичном доступе наработки проекта 3D Talking Heads продолжают просматривать до сих пор.
Посмотрите на нашего юного, почти двадцатилетнего, синтетического говорящего MPEG-4 героя и вы:

Подробнее..

Проекты Центра разработки Intel в России. Intel Integrated Performance Primitives

22.09.2020 10:23:41 | Автор: admin
Наш рассказ об очередном проекте Intel, сделанном в России. Это библиотека Intel Integrated Performance Primitives набор готовых к употреблению, высоко оптимизированных под различные архитектуры Intel, к тому же совершенно бесплатных базовых функций для работы с изображениями, сигналами и произвольными данными. Каким образом зародился этот проект, как развивался, что происходит в Intel IPP сейчас в статье под катом. А начнем мы, как это принято в резюме, с современности.

На КДПВ вход на этаж IPP в офисе Intel в Нижнем Новгороде

Что такое Intel IPP сейчас


Итак, Intel IPP это кирпичики функциональных примитивов, позволяющие существенно ускорить работу ПО, обрабатывающего медиа и данные, за счет специфичных для конкретных микроархитектур и платформ Intel оптимизаций, а также максимально широкого использования наборов векторных инструкций Intel SSE и Intel AVX всех версий.
Функции IPP покрывают четыре больших домена:

  • Обработка изображений;
  • Сжатие данных;
  • Обработка сигналов;
  • Криптография.

Текущая версия Intel IPP 2020 Update 2 содержит более 2 500 примитивов обработки изображений, 1 300 примитивов обработки сигналов, 500 компьютерного зрения и 300 криптографии.

Библиотека постоянно совершенствуется оптимизируется под новые платформы, добавляется новая функциональность и неизбежно удаляется старая, малоиспользуемая.
Intel IPP работает на любом устройстве с х86 архитектурой под управлением Linux, macOS, Windows и Android. То есть, поддерживаются процессоры не только Intel, но и других производителей, причём, работает IPP на них быстро, хотя, конечно, и не так супербыстро, как на устройствах Intel.

При этом пользователям IPP не требуется глубоких знаний о платформе исполнения их кода, использующего IPP, и связанных с этим действий нужная версия оптимизаций будет вызвана автоматически.

IPP написана на языке Си с использованием так называемых интринсик-функций компилятора. Для разных моделей применения библиотеки имеются различные ее версии: однопоточная для вызовов из разных потоков внешних приложений и многопоточная, использующая эффективное внутреннее распараллеливание.

Для интересующихся скоростью работы на Intel Xeon и Core некоторые бенчмарки.

В настоящее время IPP доступна в составе Intel Parallel Studio XE, Intel System Studio, и просто сама по себе. И абсолютно бесплатно для персонального и коммерческого использования.

Интересно, что наиболее закрытая область нашей жизни криптография, в случае IPP сейчас является наиболее открытой это проект с открытым кодом, доступный на Github.

Тот задел, подход и API, что принёс IPP при своем появлении в обработку сигналов и изображений, сейчас можно назвать негласным стандартом то же самое касается и криптографии.

Все компоненты библиотеки используются миллионами пользователей в сотнях тысяч приложений по всему миру. В том числе и внутри самой компании в различных подразделениях Intel. Intel IPP обеспечивает значительное ускорение работы библиотеки OpenCV. Кстати, специальная сборка Intel IPP c функциями, используемыми OpenCV, выпущенная в 2015 году, стала первой бесплатной свободно распространяемой версией IPP.

Intel IPP можно встретить в приложениях для распознавания и улучшения изображений во всех областях, включая медицину; принтерах, в том числе и 3D; цифровом видеонаблюдении; автономных автомобилях; распознавании и синтезе речи; сжатии данных; телекоммуникации и играх. IPP работает везде от серверов до носимых устройств. Можно утверждать, что если бы была изобретена машина времени, то ее софт обязательно использовал бы Intel IPP.

История IPP


Начиналось всё с библиотек Intel по обработке сигналов (SPL) и обработки изображений (IPL), разрабатывавшихся по заказу Intel в федеральном ядерном центре ВНИИЭФ в Сарове (мы писали про это в рассказе про OpenCV).

В 1996 (или 1997 году по свидетельствам разных очевидцев) в головном офисе Intel Санта Клара прошло совещание по поводу дальнейших планов развития SPL и IPL с участием американских кураторов проекта и приглашенных специалистов из Сарова, среди которых был будущий архитектор, вдохновитель и руководитель команды IPP Борис Сабанин, а также Сергей Кириллов, в настоящее время возглавляющий работу над IPP-криптографией.

Саровская команда привезла свой список предложений, и одним из них было открытие для пользователей интерфейсов низкоуровневых функций IPL и SPL, так как они все равно уже были реализованы и оптимизированы, меж тем некоторым пользователям форматы данных IPL были неудобны, у них в готовых продуктах уже были свои сложившиеся форматы изображений. Предлагаемый прототип интерфейса IPP, использующий более простые в сравнении с IPL/ISL структуры, был создан Борисом Сабаниным в ходе обсуждения буквально на салфетке. Но в то время предложение российской стороны хотя и не было отвергнуто, но и не получило особой поддержки оно оказалось в середине списка с малым приоритетом. Но через пару лет кто-то в Intel вспомнил об этом (скорее всего, Шин Ли, впоследствии ставший евангелистом Intel IPP) и планы поменялись.


Книга про Intel IPP, написанная в 2004 Stewart Taylor, участником исторического совещания по созданию IPP (в то время только что нанятым в Intel бакалавром Стэнфорда)

Так началась работа над библиотеками Intel Performance Primitives, которые позднее были переименованы в Integrated Performance Primitives.

Внутренний вариант IPP, назовем его 1.0, был создан в 1999 году. Это был скорее Proof of Concept, прототип для подтверждения жизнеспособности концепции. Он не выпускался как продукт, но позволил определить и уточнить концепцию, архитектуру и спецификации IPP. Первая публичная версия сразу носила номер 2.0 и вышла в апреле 2002 года.

Основная часть работ над библиотеками IPP до 2009 года проходила под руководством Бориса Сабанина, которого по праву можно считать крестным отцом и душой IPP. Он вложил в проект много сил, выстроил команду разносторонних специалистов но, к сожалению, немного не дожил до двадцатилетия Intel IPP.


Картина Мост к саровской башне авторства Бориса Сабанина, известного не только IPP (здесь можно посмотреть другие картины Сабанина, в том числе его автопортрет)

Но наследием IPL/ISL дело не ограничилось. Практически сразу появились примитивы для криптографии и компрессии данных. Начались эксперименты в области Computer Vision, которые позже переросли в проект с OpenCV, использующий ускорение алгоритмов с помощью примитивов в ippCV домене.

Конечно же, это был не единственный эксперимент и ответвление в истории создания библиотек. IPP шли в ногу со всем Intel. Соответственно, например, пятая версия IPP помимо x86 поддерживала и процессор Intel XScale (ARM архитектура) и Intel Itanium (IA-64)! В разные годы IPP включали такие компоненты как трассировка лучей (realistic rendering), операции с небольшими матрицами (small matrix operations), проверка целостности данных (data integrity), видео и аудио кодеки.

Эту функциональность при желании можно использовать и сейчас с помощью пакета IPP Legacy Libraries, доступного для скачивания.

Более того, видеокодеки IPP в дальнейшем послужили основой другого известного продукта Intel Intel Media SDK, а трассировка лучей была реализована в проекте с открытом кодом Intel Embree.

Из интересных технологических опытов в области IPP-строения можно отметить пример Windows-драйвера для демонстрации возможности работы IPP в режиме ядра, а также версию IPP для работы на интегрированных Intel GPU, написанную на C for Metal.

Любопытно, что номера версий IPP сначала шли по порядку от 1 до 9, а потом начали обозначаться годом выхода 2017-2020.


Команда разработчиков Intel IPP в 2003 году

За время существования семейства библиотек IPP в работе над ними принимало участие более 100 человек в Сарове, Нижнем Новгороде и Москве. Сейчас штаб-квартира IPP находится в Нижнем Новгороде и выглядит очень привлекательно!


Оформление этажа IPP в Intel

IPP совсем не примитивная библиотека!


Хотя в названии Intel IPP и есть слово примитив, да и на первый взгляд, никаких принципиальных сложностей в наборе деталей конструктора для создания производительных программ, которым по сути является IPP, быть не может, устройство этих библиотек совсем не тривиально. Для обеспечения максимальной производительности и удобства использования IPP применены интересные технологические решения.

Как уже было сказано, в IPP содержатся тысячи функций (а каждая функция имеет несколько версий, оптимизированных под конкретную архитектуру), что приводит к огромным размерам готовых библиотек, что вовсе не является пунктом в списке преимуществ для пользователей IPP.
Поэтому IPP собирается особым образом. Исходные файлы, включающие большое количество простых функций, перед компиляцией разрезаются специальным скриптом на много мелких, по одной функции на файл. И потом эти мини-файлы компилируются. Причем компилируются не один раз, а несколько под разные архитектуры с соответствующими флагами. В результате получается несколько огромных статических библиотек на каждый IPP домен. Но эти статические библиотеки склеены из очень небольших объектных файлов. Поэтому когда IPP линкуется статически к приложению, размер приложения увеличивается практически ровно на размер используемых из IPP функций, ни байтом больше.

Также в IPP имеется механизм генерации специализированных (custom) библиотек на базе существующих инструментов без необходимости открывать пользователям исходный код. А именно, из заголовочных файлов пользователь выбирает список интересующих его функций, после чего из огромных статических библиотек автоматически скриптом создается небольшая динамическая библиотека только с нужными функциями и их зависимостями. Более того, для дальнейшего сокращения размера эта динамическая библиотека может включать в себя варианты сборки указанных функций не под все варианты железа, а исключительно под заданный пользователем список платформ.

В ситуации, когда каждый дополнительный процент производительности библиотек IPP имеет значение, очень важным становится решение, на каком уровне осуществлять параллелизацию кода: внутри функций библиотеки, что хорошо для вызовов IPP из одного пользовательского потока, либо снаружи, на уровне пользовательских приложений, что хорошо для многопоточных приложений, самостоятельно разделяющих работу и данные для IPP.

Поскольку приложения бывают разные, и IPP сделаны тоже разные. А именно, в комплект поставки IPP входят по два набора библиотек в 32 и 64-битной версиях: одна чисто однопоточная внутри, а вторая с внутренним распараллеливанием значительного количества функций при помощи OpenMP (точный список функций прилагается в сопроводительных документах). Кроме того, для библиотек обработки изображения есть и еще одна версия мнопоточный слой (Threading Layer), представляющая собой надстройку над однопоточной IPP и использующая либо OpenMP либо Intel TBB для внешнего распараллеливания работы над изображениями, разделяемыми для этого на фрагменты (тайлы). Исходные коды IPP Threading Layer доступны в пакете IPP и нужны тем, кто хочет получить максимально возможный контроль над параллельной работой своего кода.

Почти с самого возникновения IPP разработчикам пришлось озаботиться проблемой того, что конвейеры обработки изображений и сигналов, состоящие из отдельных функций IPP, работают медленнее, чем хотелось бы. Объясняется это просто: при вызове IPP-функций происходит как правило загрузка-выгрузка из кеша или даже из памяти, а эта операция может оказаться заметно дороже собственно вычислений. Этот эффект особенно заметен при обработке больших данных не тех, что называют big data, а например, изображений формата FullHD (не говоря уже о 4К).

Решение объединить несколько функций внутри IPP в одну в этом случае не подходит тогда вместо примитивов-кирпичиков мы получим причудливые детали из игры тетрис, вставить которые в пользовательские приложения будет проблематично, а разнообразие таких возможных объединений превысит все разумные пределы.

В результате была реализована C++ надстройка над IPP, которая строила графы конвейеров, нарезала картинки на кусочки, и потом запускала параллельный цикл, который в каждом потоке выполнял не одну операцию, а весь IPP конвейер на отдельном тайле. В конце, конечно результаты склеивались. Сначала был сделан прототип, он показал приличное ускорение. Потом была создана настройка под названием DMIP (deferred-mode image processing). Далее, в 2011 году на одном из первых заседаний комитета стандартизации OpenVX в Khronos, DMIP был упомянут и горячо поддержан комитетом с учетом популярности графов у разработчиков железа. Так стандарт OpenVX получился основанным на графовой технологии. Стандарт OpenVX по разным причинам не получил достаточной популярности, но зато сейчас графовую парадигму поддерживает и развивает технологию команда Intel Graph API. А так как Graph API входит в OpenCV, OpenVINO, Movidius SDK, то налицо прямое влияние технологий IPP на стандарты компьютерного зрения и современные API.

IPP полезные ссылки


Еще раз приведем самые главные ссылки из этой статьи.


Intel IPP от первого лица


Предоставим слово людям, в разные годы сыгравшим важную роль в судьбе Intel Performance Primitives.

Владимир Дудник, руководитель команды Intel IPP в 2009-2011 годах
По-моему, у IPP по прежнему очень сильная концепция предоставить индустрии легкий, достаточно низкоуровневый слой абстракции от различий разных аппаратных платформ. Несмотря на существенный прогресс в развитии компиляторов, по-прежнему нет возможности из описания на языке высокого уровня получить оптимальный по размеру и производительности машинный код для функций преобразования Фурье, фильтров разного рода и т.п. Это означает что у IPP по-прежнему есть ниша, где она нужна и действительно полезна для ускорения разработки кросс-платформенных высокопроизводительных программ.
Думается, есть потенциальная возможность присмотреться к потребностям разных фреймворков глубокого обучения, там много достаточно стандартных, относительно простых операций, которые могут быть ускорены SIMD инструкциями. Часть из них, как правило многомерные свертки, покрываются библиотекой MKL, но и для IPP возможность применения можно найти.

Вадим Писаревский, лидер проекта OpenCV, участник команды IPPCV в 2006-2008 годах
Если говорить про IPP в целом, то, конечно, скорость у библиотеки выдающаяся. Особенно флагманские функции типа FFT. Ядра чистый изумруд! К счастью, у меня была возможность немного поизучать исходники IPP в свое время, и местами это был просто учебник, как надо писать эффективный код.
В свое время команду IPP очень сильно заинтересовала проблема автогенерации кода, в частности, на OCaml, и впечатлили успехи проекта Spiral, который сумел автоматически сгенерировать ядра FFT и родственных преобразований на уровне или даже обходивших по скорости реализованные в IPP. Часть этих ядер потом была включена в IPP. А меня, в свою очередь, эта тема зацепила настолько, что мой текущий проект, 13-14 лет спустя, с этой темой связан.

Павел Бердников, руководитель команды IPP QA в 2011-2015 годах, руководитель команды IPP в 2017-2020 годах
Работу в IPP я начал в QA команде в Сарове в 2000г. с написания тестов, позже создав единую билдовую систему для такого сложного проекта, автоматизированный процесс построения и тестирования.
А 17 лет спустя в Нижнем Новгороде стал руководителем всей команды IPP. Пришлось знакомиться с партнёрами внутри Intel и пользователями за его пределами. Изменить способы планирования и разработки кода от старых waterfall & development к современным agile & DevOps. Пересмотреть стратегии проекта и придумать новые. Так проект больше сосредоточился на криптографии и компрессии данных, появились интересные направления работы и новые области развития.
Реалистичные планы по развитию проекта развивать что есть и смотреть в смежные области. Фантастические планы, которые были ранее в мечтах, разбились о понимание мировых трендов и нужд наших пользователей. Пришло осознание, что бесконечные ресурсы, которые всегда очень хочется получить чтобы сделать больше и глубже, не дадут ожидаемого результата. Наверное, если бы я получил полную свободу действий и ресурсы, я бы пошёл дальше в область исследований новых алгоритмов, в область университетов и работы с ними.

Валентин Кубарев, руководитель команды Image & Signal Processing проекта Intel IPP, 2020 год настоящее время
Работу в IPP я начал в качестве SW инженера в 2011 году, когда проект только переехал из Сарова в Нижний Новгород. Меня всегда интересовала работа, связанная с математикой и оптимизацией. Знакомство с IPP я начал с функциональности изменения размера изображения, после чего долгое время отвечал за поддержку, разработку и оптимизацию геометрических преобразований, таких как Resize, WarpAffine, WarpPerspective и т. д. C 2017 года активно участвовал в задачах связанных с криптографией, и, в итоге, в 2018 мы смогли открыть код IPP Crypto и выложить проект на GitHub. С конца 2018 года работал в другом проекте, в 2020 году снова вернулся в IPP, но уже как руководитель Image & Signal Processing домена. Считаю, что в данный момент данная часть проекта недооценена, поэтому активно работаю с пользователями продукта IPP и нашими партнёрами внутри компании Intel, чтобы вывести проект на новый уровень.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru