Недавно я описывал, благодаря чему роботы завтра начнут НАМНОГО лучше соображать (пост про аппаратное ускорение нейросетей). Сегодня разберем, почему роботы скоро будут НАМНОГО лучше видеть. В ряде ситуаций намного лучше человека.
Речь пойдет про камеры глубины, которые снимают видео, в каждом пикселе которого хранится не цвет, а расстояние до объекта в этой точке. Такие камеры существуют уже больше 20 лет, однако в последние годы скорость их развития выросла многократно и уже можно говорить про революцию. Причем многовекторную. Бурное развитие идет по следующим направлениям:
- Structured Light камеры, или камеры структурного света, когда есть проектор (часто инфракрасный) и камера, снимающая структурный свет проектора;
- Time of Flight камеры, или камеры, основанные на измерении задержки отраженного света;
- Depth from Stereo камеры — классическое и, пожалуй, наиболее известное направление построения глубины из стерео;
- Light Field Camera — они же камеры светового поля или пленоптические камеры, про которые был отдельный подробный пост;
- И, наконец, камеры, основанные на Lidar-технологиях, особенно свежие Solid State Lidars, которые работают без отказа примерно в 100 раз дольше обычных лидаров и выдают привычную прямоугольную картинку.
Кому интересно, как это будет выглядеть, а также сравнение разных подходов и их текущее и завтрашнее применение — добро пожаловать под кат!
Итак! Разберем основные направления развития камер глубины или фактически разные принципы измерения глубины. С их плюсами и минусами.
Начнем, пожалуй, с одного из самых простых, старых и относительно дешевых способов измерения глубины — структурированного света. Этот метод появился по сути сразу, как только появились цифровые фотоаппараты, т.е. более 40 лет назад и сильно упростился чуть позднее, с появлением цифровых проекторов.
Основная идея крайне проста. Ставим рядом проектор, который создает, например, горизонтальные (а потом вертикальные) полоски и рядом камеру, которая снимает картину с полосками, как это изображено на этом рисунке:
Источник: Autodesk: Structured Light 3D Scanning
Поскольку камера и проектор смещены друг относительно друга, то и полоски также будут смещаться пропорционально расстоянию до объекта. Измеряя это смещение мы можем рассчитывать расстояние до объекта:
Источник: http://www.vision-systems.com/
По сути, с самым дешевым проектором (а их цена начинается с 3000 рублей) и смартфоном можно измерять глубину статических сцен в темной комнате:
Источник: Autodesk: Structured Light 3D Scanning
Понятно, что при этом придется решить целую пачку задач — это калибровка проектора, калибровка камеры телефона, распознавание сдвига полос и так далее, но все эти задачи вполне по силам даже изучающим программирование продвинутым школьникам старших классов.
Наиболее широко известен этот принцип измерения глубины стал, когда в 2010 году компания Microsoft выпустила сенсор глубины MS Kinect по цене 150$, что на тот момент было революционно дешево.
Источник: Partially Occluded Object Reconstruction using Multiple Kinect Sensors
При том, что помимо собственно измерения глубины с ИК-проектором и ИК-камерой Kinect также снимал обычное RGB видео, имел четыре микрофона с функцией подавления шумов и мог сам настраиваться на человека по высоте, автоматически наклоняясь вверх или вниз, тут же внутри была встроена обработка данных, которая выдавала на консоль сразу готовую карту глубины:
Источник: Implementation of natural user interface buttons using Kinect
Всего было продано порядка 35 миллионов устройств, что сделало Kinect первой массовой камерой глубины в истории. И если учесть, что до нее камеры глубины конечно были, но продавались обычно максимум сотнями и стоили минимум на порядок дороже — это была революция, обеспечившая большие вложения в эту область.
Важной причиной успеха было то, что к моменту выхода у Microsoft на Xbox 360 уже было несколько игр, которые активно использовали Kinect как сенсор. Взлет был стремителен:
Более того, Kinect даже умудрился войти в книгу рекордов Гиннеса как самый быстро продаваемые гаджет в истории. Правда Apple вскоре потеснила Microsoft с этого места, но тем не менее. Для нового экспериментального сенсора, который работает в дополнение к основному устройству стать самым быстро продаваемым электронным устройством в истории, это просто великолепное достижение:
При чтении лекций мне нравится спрашивать аудиторию, откуда взялись все эти миллионы покупателей? Кто были все эти люди?
Как правило, никто не угадывает, но иногда, особенно если в аудитории люди постарше и поопытнее — дают правильный ответ: продажи двигали американские родители, которые с восторгом увидели, что их дети могут играть на приставке и при этом не сидеть толстой попой на диване, а скакать перед телевизором. Это был прорыв!!! Миллионы мам и пап кинулись заказывать девайс для своих чад.
Вообще, когда заходит речь о распознавании жестов, то обычно люди наивно полагают, что просто данных с 2D-камеры достаточно. Ведь они видели много красивых демок! Реальность намного более сурова. Точность распознавания жестов от 2D видеопотока с камеры и точность распознавания жестов с камеры глубины отличаются на порядок. С камеры глубины, а точнее — с RGB камеры, совмещенной с камерой глубины (последнее важно), можно намного точнее и с меньшими затратами распознавать жесты (даже если в комнате темно) и ровно это принесло успех первой массовой камере глубины.
Про Kinect на Хабре в свое время писали очень много, поэтому совсем кратко как это работает.
Инфракрасный проектор дает в пространстве псевдослучайный набор точек, по смещению которых определяется глубина в данном пикселе:
Источник: Depth Sensing Planar Structures: Detection of Office Furniture Configurations
Разрешение камеры заявлено как 640х480, однако реально там где-то примерно 320x240 с довольно сильной фильтрацией и картинка на реальных примерах выглядит так (то есть довольно страшна):
Источник: Partially Occluded Object Reconstruction using Multiple Kinect Sensors
Хорошо видны «тени» от объектов, поскольку камера и проектор разнесены довольно далеко. Видно, что для предсказания глубины берутся сдвиги нескольких точек проектора. Кроме того, идет (жесткая) фильтрация по непосредственным соседям, но все равно карта глубины достаточно шумная, особенно на границах. Это приводит к достаточно заметному шуму на поверхности получающихся объектов, который необходимо дополнительно и нетривиально сглаживать:
Источник: J4K Java Library for the Microsoft's Kinect SDK
И тем не менее всего 150$ (сегодня уже 69$, хотя лучше ближе к 200$, конечно) — и вы «видите» глубину! Серийных продуктов реально много.
Кстати, в феврале этого года был анонсирован новый Azure Kinect:
Источник: Microsoft announces Azure Kinect, available for pre-order now
Его поставки разработчикам в США и Китае должны начаться 27 июня, т.е. буквально прямо сейчас. Из возможностей, помимо заметно лучшего разрешения RGB и лучшего качества depth камер (обещают 1024x1024 на 15 FPS и 512х512 на 30 FPS и более высокое качество хорошо на глаз видно по демо, камера ToF) заявлена поддержка совместной работы нескольких устройств из коробки, меньшая засветка на солнце, ошибка менее 1 см на расстоянии 4 метров и 1-2 мм на расстоянии менее 1 метра, что звучит КРАЙНЕ интересно, так что ждем, ждем:
Источник: Introducing Azure Kinect DK
Следующим же массовым продуктом, где была реализована камера глубины на структурированном свете была не игровая консоль, а… (барабанная дробь) правильно — iPhone X!
Его технология Face ID — это типичная камера глубины с типичным инфракрасным Dot projector и инфракрасной камерой (кстати, теперь вы понимаете, почему они находятся на краях «челки», разнесенные максимально далеко друг от друга — это стереобаза):
Разрешение карты глубины даже меньше, чем у Kinect — около 150х200. Понятно, что если сказать: «Наше разрешение примерно 150х200 пикселей или 0,03 мегапиксела», народ скажет кратко и ёмко: «Отстой!». А если сказать «Dot projector: More than 30,000 invisible dots are projected onto your face», пипл скажет: «Вау, 30 тысяч невидимых точек, круто!». Некоторые блондинки поинтересуются, не появятся ли от невидимых точек веснушки? И тема пойдет в массы! Поэтому в рекламе был дальновидно выбран второй вариант. Разрешение невелико по трем причинам: во-первых, требования миниатюрности, во-вторых, энергопотребления, а в-третьих, цены.
Тем не менее это очередная камера глубины на структурированном свете, ушедшая в серию миллионными тиражами и уже повторенная другими производителями смартфонов, например, (сюрприз-сюрприз!) Huawei (который обошел Apple по продажам смартфонов в прошлом году). Только у Huawei камера справа, а проектор — слева, но тоже, разумеется, по краям «челки»:
Источник: Huawei Mate 20 Pro update lets users add a second face for face unlock
При этом заявляется 300.000 точек, то есть в 10 раз больше, чем у Apple, и фронтальная камера получше, и шрифт крупнее. Есть ли преувеличение касательно 300 тысяч — сказать сложно, но Huawei демонстрирует весьма неплохое 3D сканирование объектов с фронтальной камерой. Независимые тесты более страшны, но это явно самое начало темы и младенчество технологии миниатюрных энергоэффективных камер глубины и анонсы камер буквально на конец этого года уже заметно лучше по характеристикам.
При этом понятно, почему технологию идентификации лиц использовали в телефонах. Во-первых, теперь нельзя обмануть детектор, показав фото лица (или видео с планшета). Во-вторых, лицо сильно меняется при изменении освещения, а его форма — нет, что позволяет вместе с данными с RGB камеры точнее идентифицировать человека:
Источник: фото одного и того же лица из материалов TI
Очевидно, что у инфракрасного сенсора есть врожденные проблемы. Во-первых, солнце нам на раз-два засвечивает наш относительно слабый проектор, поэтому на улице такие камеры не работают. Даже в тени, если рядом белая стена здания освещена солнцем, у вас могут быть большие проблемы с Face ID. Уровень шумов в Kinect также зашкаливает, даже когда солнце закрыто тучами:
Источник: эта и две следующие картинки — материалы Basler AG
Другая большая проблема — это отражения и переотражения. Поскольку инфракрасный свет также отражается, то заснять дорогой чайник из нержавейки, стол с лаковым покрытием или стеклянный плафон с Kinect будет проблематично:
И, наконец, две камеры, снимающие один объект могут мешать друг-другу. Интересно, что в случае структурированного света можно заставить проектор мерцать и понимать где наши точки, а где нет, но это отдельная и достаточно непростая история:
Теперь вы знаете, как сломать FaceID…
Впрочем, для мобильных устройств структурированный свет выглядит наиболее разумным компромиссом на сегодня:
Источник: Smartphone Companies Scrambling to Match Apple 3D Camera Performance and Cost
Для структурированного света дешевизна обычного сенсора такова, что его использование в большинстве случаев более, чем оправдано. Что вызвало к жизни большое количество стартапов, действующих по формуле: дешевый сенсор + сложный софт = вполне приемлемый результат.
Например, наш бывший аспирант Максим Федюков, занимавшийся 3D реконструкцией с 2004 года, создал компанию Texel, основной продукт которой — платформа с 4 камерами Kinect и программное обеспечение, которое за 30 секунд превращает человека в потенциальный памятник. Ну или настольную статуэтку. Это у кого на сколько денег хватит. Или можно дешево и сердито друзьям фото своей 3D модели отправить (пока почему-то наиболее востребованный кейс). Сейчас они отправляют свои платформы и софт за рубеж от Великобритании до Австралии:
Источник: Создание 3D модели человека за 30 секунд
Как балерина красиво стоять я не могу, поэтому лишь задумчиво смотрю на плавник проплывающей мимо акулы:
Источник: материалы автора
Вообще, новый вид сенсоров породил новые арт-проекты. Зимой видел довольно любопытный VR фильм, снятый с Kinect. Ниже интересная визуализация танца, тоже сделанная с Kinect (похоже, использовалось 4 камеры), причем в отличие от предыдущего примера с шумами никак не боролись, они скорее добавляли забавной специфики:
Источник: A Dance Performance Captured With a Kinect Sensor and Visualized With 3D Software
Какие тренды можно наблюдать в области:
- Как известно цифровые сенсоры современных камер чувствительны к инфракрасному излучению, поэтому приходится применять специальные блокирующие фильтры, чтобы инфракрасный шум не портил картинку (появилось даже направление художественной съемки в инфракрасном диапазоне, в том числе когда удаляют фильтр с сенсора). Это означает, что вкладываются огромные средства в миниатюризацию, повышение разрешения и удешевление сенсоров, которые можно использовать, как инфракрасные (со специальным фильтром).
- Аналогично, сейчас быстро совершенствуются алгоритмы обработки карт глубины, в том числе методы так называемой кросс-фильтрации, когда данные с RGB сенсора и зашумленные данные по глубине позволяют вместе получить очень неплохое видео глубины. При этом с использованием нейросетевых подходов появляется возможность кардинально поднять скорость получения хорошего результата.
- В этой области работают все топовые компании, особенно производители смартфонов.
Как следствие:
- Можно ожидать кардинального повышения разрешения и точности съемки Structured Light камер глубины в ближайшие 5 лет.
- Будет идти (правда медленнее) снижение энергопотребления мобильных сенсоров, что упростит использование сенсоров следующих поколений в смартфонах, планшетах и прочих мобильных устройствах.
В любом случае, то, что мы наблюдаем сейчас — младенчество технологии. Первые массовые изделия, на которых только-только идет отладка производства и использования нового непривычного типа данных — видео с глубиной.
Следующий способ получения глубины интереснее. Он основан на измерении round-trip задержки света (ToF — Time-of-Flight). Как известно скорость современных процессоров высока, а скорость света мала. За один такт процессора на 3 ГГц свет успевает пролететь всего 10 сантиметров. Или 10 тактов на метр. Масса времени, если кто низкоуровневой оптимизацией занимался. Соответственно устанавливаем импульсный источник света и специальную камеру:
Источник: The Basler Time-of-Flight (ToF) Camera
Фактически нам нужно измерить задержку, с которой свет возвращается в каждую точку:
Источник: The Basler Time-of-Flight (ToF) Camera
Либо, если у нас несколько сенсоров с разным временем накопления заряда, то, зная сдвиг по времени относительно источника для каждого сенсора и снятой яркости вспышки, мы можем рассчитать сдвиг и, соответственно, расстояние до объекта, причем увеличивая количество сенсоров — увеличиваем точность:
Источник: Larry Li «Time-of-Flight Camera – An Introduction»
В итоге получается такая схема работы камеры со светодиодной или, реже, лазерной (VCSEL) инфракрасной подсветкой:
Источник: очень годное описание работы ToF на allaboutcircuits.com
Картинка при этом получается достаточно низкого разрешения (ведь нам нужно расположить рядом несколько сенсоров с разным временем опроса), но потенциально с высоким FPS. И проблемы в основном на границах объектов (что характерно для всех камер глубины). Зато без «теней», типичных для структурированного света:
Источник: видео Basler AG
В частности, именно камеры такого типа (ToF) в свое время активно тестировал Google в проекте Google Tango, хорошо представленном в этом видео. Смысл был прост — объединить данные гироскопа, акселерометра, RGB камеры и камеры глубины, построив трехмерную сцену перед смартфоном:
Источник: Google's Project Tango Is Now Sized for Smartphones
Сам проект не пошел (мое мнение — из-за того, что несколько опередил свое время), но создал важные предпосылки в создании волны интереса к AR — дополненной реальности — и, соответственно, разработке сенсоров, которые могут с ней работать. Сейчас все его наработки влиты в ARCore от Google.
Вообще, объем рынка ToF камер растет примерно на 30% каждые 3 года, что вполне себе экспоненциальный рост, причем так быстро растут мало какие рынки:
Источник: Potential of Time-of-Flight Cameras & Market Penetration
Серьезным драйвером рынка на сегодня является бурное (и также экспоненциальное) развитие промышленных роботов, для которых ToF камеры — идеальное решение. Например, если у вас робот упаковывает коробки, то с обычной 2D камерой определить, что вы начинаете заминать картон, — это крайне нетривиальная задача. А для ToF камеры это тривиально как «увидеть», так и обработать. Причем очень быстро. Как следствие, мы наблюдаем бум промышленных ToF камер:
Естественно, к появлению домашних продуктов с использованием камер глубины это тоже приводит. Вот, например, охранная камера с блоком ночного видео и ToF камерой глубины от немецкой PMD Technologies, которая разрабатывает 3D камеры уже больше 20 лет:
Источник: 3D Time-of-Flight Depth Sensing Brings Magic to the New Lighthouse Smart Home Camera
Помните плащ-невидимку, под которым прятался Гарри Поттер?
Источник: Harry Potter’s Invisibility Cloak Gets an Origin Story and May Soon Exist in Real Life
Боюсь, что немецкая камера его на раз-два обнаружит. И экран с картинкой поставить перед такой камерой будет затруднительно (это вам не отвлекающийся охранник):
Источник: Фрагмент фильма «Миссия невыполнима: протокол Фантом»
Похоже, что для новых камер видеонаблюдения потребуется недетская магия Хогвартса, чтобы обмануть их ToF камеру глубины, способную и в полной темноте снять такое видео:
Прикинуться стенкой, экраном и прочими способами защититься от того, что комбинированная ToF+RGB камера засечет посторонний объект, становится технически кардинально сложнее.
Другое массовое мирное применение камер глубины — распознавание жестов. В ближайшее время можно ожидать телевизоров, приставок и роботов-пылесосов, которые будут в состоянии воспринимать не только голосовые команды, как умные колонки, но и небрежное «убери там!» со взмахом руки. Тогда пульт дистанционного управления (он же ленивчик) к смарт телевизору станет окончательно не нужен, и фантастика войдет в жизнь. В итоге то, что было фантастичным в 2002 году, стало экспериментальным в 2013, и, наконец, серийным в 2019 (при этом пипл не будет знать, что внутри камера глубины, какая разница, как работает эта магия?):
Источник: статья, эксперименты и продукт
А полная линейка применений еще шире, разумеется:
Источник: видео сенсоров глубины от Terabee (кстати, а что за мыши у них бегают по полу на 2 и 3 видео? Видите их? Шучу, это пыль в воздухе — плата за малый размер сенсора и близкое расположение источника света к сенсору)
Кстати — в знаменитых «магазинах без кассиров» Amazon Go под потолком тоже много камер:
Источник: Inside Amazon’s surveillance-powered, no-checkout convenience store
Причем, как пишет TechCrunch: «They’re augmented by separate depth-sensing cameras (using a time-of-flight technique, or so I understood from Kumar) that blend into the background like the rest, all matte black.» То есть чудо определения, с какой именно полки взят йогурт, обеспечивают в том числе таинственные черные матовые ToF камеры (хороший вопрос, они ли на фото):
К сожалению, часто прямую информацию найти сложно. Зато есть косвенная. Например, была такая компания Softkinetic, которая с 2007 года разрабатывала ToF камеры. 8 лет спустя их купила Sony (которая, к слову, готова покорять новые рынки под брендом Sony Depthsensing). Так один из топовых сотрудников Softkinetic сейчас работает как раз на Amazon Go. Такое вот совпадение! В течении пары лет, когда доведут технологию и подадут основные патенты, детали скорее всего раскроют.
Ну и как обычно зажигают китайцы. Компания Pico Zense, например, представила на CES 2019 весьма впечатляющую линейку ToF камер, в том числе для уличного применения:
Они обещают революцию везде. Фуры будут загружаться плотнее за счет автоматизированной загрузки, банкоматы станут безопаснее, за счет камер глубины в каждом, навигация роботов станет проще и точнее, людей (и, главное, детей!) будут считать в потоке на порядок лучше, появятся новые фитнес-тренажеры c возможностью контролировать правильность выполнения упражнений без инструктора и так далее, и тому подобное. Естественно, дешевые китайские камеры глубины нового поколения для всего этого великолепия уже готовы. Берите и встраивайте!
Интересно, что свежайший серийный Huawei P30 Pro имеет ToF сенсор рядом с основными камерами, т.е. многострадальный Huawei умеет лучше Apple делать фронтальные structured light сенсоры и, похоже, удачнее Google (Project Tango, который был закрыт) внедрил рядом с основными камерами ToF камеру:
Источник: обзор новых технологий Huawei от Ars Technica на конец марта 2019
Подробности использования, естественно, не раскрываются, но помимо ускорения наведения фокуса (что актуально для трех основных камер с разными объективами) этот сенсор можно использовать для увеличения качества размытия фона фотографий (имитация малой ГРИП).
Также очевидно, что уже следующее поколение сенсоров глубины рядом с основными камерами будет использоваться в AR приложениях, что позволит поднять точность AR с текущего «прикольно, но часто глючит» до массово работающего уровня. И, очевидно, в свете успехов китайцев большой вопрос — насколько Google захочет поддержать в ARCore революционное китайское железо. Патентные войны могут заметно замедлить выход технологий на рынок. Развитие этой драматической истории мы увидим буквально в ближайшие два года.
Примерно 25 лет назад, когда только появились первые автоматические двери, лично наблюдал, как вполне солидные дядьки периодически перед такими дверями ускорялись. Успеет открыться или не успеет? Она же большая, тяжелая, стеклянная! Примерно то же самое я наблюдал во время экскурсии вполне себе солидных профессоров на автоматическом заводе в Китае недавно. Они чуть отставали от группы, чтобы посмотреть что будет, если встать у робота, мирно перевозящего детали и играющего тихую приятную мелодию, на пути. Я тоже, каюсь, не удержался… Вы знаете, останавливается! Может плавно. Может, как вкопанный. Работают сенсоры глубины-то!
Источник: Inside Huawei Technology's New Campus
В отеле тоже работали роботы-уборщики, которые выглядели примерно так:
При этом над ними издевались сильнее, чем над роботами на заводе. Не так жестко, как в бесчеловечном во всех смыслах Bosstown Dynamics, конечно. Но лично наблюдал, как у них вставали на дороге, робот пытался объехать человека, человек смещался, перекрывая дорогу… Этакие кошки-мышки. В общем, похоже, что когда беспилотные автомобили появятся на дорогах, первое время их будут подрезать чаще обычного… Эх, люди-люди… Мда-м… Впрочем, мы отвлеклись.
Резюмируя ключевые моменты:
- В силу другого принципа работы, мы можем располагать источник света в ToF камере максимально близко к сенсору (даже под той же линзой). Кроме того, у многих промышленных моделей светодиоды располагаются вокруг сенсора. Как следствие, кардинально уменьшаются, а то и вообще пропадают «тени» на карте глубины. Т.е. упрощается работа со сложными по геометрии объектами, что важно для промышленных роботов.
- Поскольку импульсная подсветка остается, как правило, инфракрасной — сохраняются все изложенные в прошлом разделе минусы инфракрасной камеры: засветка на солнце, сложности при работе двух камер рядом и т.д. Впрочем, промышленные роботы часто работают в помещениях, а камеры с лазерной подсветкой разрабатываются.
- Увы, ToF сенсорам сложнее «сесть на хвост» общему улучшению сенсоров RGB камер, поэтому их развитие идет медленнее, но на удивление уверенно и новостей про внедрение ToF камер ОЧЕНЬ много и чего (кого) там только нет (только в смартфонах проанонсировали интеграцию сенсоров и Samsung, и Google Pixel, и Sony Xperia...).
- У новой Sony обещают, что 2 камеры из 8 камер телефона (!!!) будут ToF камерами глубины (!), т.е. камеры глубины будут с обеих сторон телефона:
Источник: Hexa-cam Sony phone gets camera specs revealed - Как следствие, нас ждет много интересного в этой области даже в ближайший год! А в следующем году до 20% новых телефонов будут с камерами глубины (Structured Light + ToF). Если учесть, что в 2017 на рынке был только Apple в гордом одиночестве с «30 тысячами точек», а сейчас меньше 300 тысяч и не ставят, тема явно хорошо пошла:
Источник: Limited Smartphone 3D Sensing Market Growth in 2019; Apple to be Key Promoter of Growth in 2020
Вы еще сомневаетесь в идущей революции?
Это была первая часть! Общее сравнение будет во второй.
В следующей серии ждите:
- Способ 3, классический: глубина из стерео;
- Способ 4, новомодный: глубина из пленоптики;
- Способ 5, быстрорастущий: лидары, в том числе Solid State Lidars;
- Некоторые проблемы обработки видео с глубиной;
- И, наконец, краткое сравнение всех 5 способов и общие выводы.
Карфаген должен быть разру… Всё видео до конца века станет трехмерным!
Stay tuned! (Если хватит времени — до конца года опишу новые камеры, в том числе тесты свежего Kinect.)
- Лабораторию Компьютерной Графики ВМК МГУ им. М.В.Ломоносова за вклад в развитие компьютерной графики в России в целом и работы с камерами глубины в частности,
- компании Microsoft, Apple, Huawei и Amazon за отличные продукты на базе камер глубины,
- компанию Texel за развитие высокотехнологичных русских продуктов с камерами глубины,
- персонально Константина Кожемякова, который сделал очень много для того, чтобы эта статья стала лучше и нагляднее,
- и, наконец, огромное спасибо Роману Казанцеву, Евгению Ляпустину, Егору Склярову, Михаилу Федюкову, Николаю Оплачко и Ивану Молодецких за большое количество дельных замечаний и правок, сделавших этот текст намного лучше!
Комментариев нет:
Отправить комментарий