Тихая революция и новый дикий запад в ComputerVision

    Казалось бы, революция с Computer Vision уже была. В 2012 году выстрелили алгоритмы основанные на сверточных нейронных сетях. Года с 2014 они дошли до продакшна, а года с 2016 заполонили все. Но, в конце 2020 года прошел новый виток. На этот раз не за 4 года, а за один. Поговорим о Трансформерах в ComputerVision. В статье будет обзор новинок, которые появились в последний год. Если кому-то удобнее, то статья доступна в виде видео на youtube.

    Трансформеры - это такой тип нейронных сетей, созданных в 2017 году. Изначально, они использовались для переводов:

    Но, как оказалось, работали просто как универсальная модель языка. И пошло-поехало. Собственно, известная GPT-3 - порождение трансформеров.

    А что с ComputerVision?
    А вот тут все интересненько. Не сказать, что трансформеры хорошо подходят для таких задач. Все-таки временные ряды, да к тому же одномерные. Но уж больно хорошо работают в других задачах. В своем рассказе я пройдусь по наиболее ключевым работам, интересным местам их приложения. Постараюсь рассказать про разные варианты как трансформеры смогли запихать в CV.

    DETR

    На дворе 2020. Поперло. С чего? Тут сложно сказать. Но мне кажется, надо начать с DETR (End-to-End Object Detection with Transformers), который вышел в мае 2020 года. Тут Трансформеры применяются не к изображению, а к фичам выделенным сверточной сетью:

    В таком подходе нет особой новизны, ReInspect в 2015 делал что-то похожее, подавая выход BackBone сети на вход рекуррентной нейронной сети. Но на сколько рекуррентная сеть хуже чем Трансформер - настолько же ReInspect проигрывал Detr. Точность и удобство обучения для трансформеров выросло в разы. 

    Конечно, есть пара забавных штук, которых до DETR никто не делал (например как реализуется позиционное кодирование, которое необходимо для трансформера). Я описал свои впечатления тут.
    Могу лишь добавить, что DETR открыл путь к возможности использования трансформеров для ComputerVision. Использовали ли его на практике? Работает ли он сейчас? Не думаю:

    1. Основная его проблема - сложное обучение, большое время обучения.  Частично эту проблему решил Deformable DETR.

    2. DETR не универсальный. Есть задачи где работают лучше другие подходы. Например тот же iterdet. Но в каких-то задачах лидерство держит до сих пор (или его производные - https://paperswithcode.com/sota/panoptic-segmentation-on-coco-panoptic ).

    Сразу после DETR вышел Visual Transformer (статья + неплохой обзор) для классификации. Тут трансформеры тоже берут выходной Feature map с стандартного backbone:

    Я бы не назвал Visual Transformer большим шагом, но это характерная для тех времен мысль. Попробовать применить трансформер к тем или иным выделенным через backbone фичам. 

    VIT

    Поехали дальше. Следующий большой шаг это ViT:

    Он был опубликован в начале декабря 2020 года (реализация). И тут все уже по-взрослому. Трансформер как он есть. Картинка разбивается на мини-участки 16*16. Каждый участок подается в трансформер как “слово”, дополняясь позиционным энкодером. 

    И, внезапно, это все заработало. Не считая того что училось все долго (и точность не state-of-art). И на базах меньше 14 миллионов изображений работало как-то не топово.
    Но все эти проблемы решил аналог. На этот раз от FaceBook - Deit. Который сильно упрощал обучение и инференс.

    На больших датасетах этот подход до сих пор держит первые места почти на всех классификациях - https://paperswithcode.com/paper/going-deeper-with-image-transformers

    На практике мы как-то попробовали использовать в одной задаче. Но, с датасетом в ~2-3 тысячи картинок, все это не очень заработало. И классические ResNet  были куда стабильнее и лучше. 

    CLIP

    Пойдем дальше. CLIP. Это очень интересное применение трансформеров совсем с другой стороны. В CLIP задача переформулирована. Задача не в том чтобы распознать изображение, а найти максимально близкое текстовое описание для изображения. Здесь трансформер учит лингвистическую часть эмбединга, а сверточная сеть - визуальные эмбединги:

    Такая штука учится очень долго, зато получается универсальной. Он не деградирует при смене датасета. Сеть способна распознавать вещи которые видела совсем в другом виде:

    Иногда это работает даже слишком круто:

    Но, не смотря на то что это хорошо работает на некоторых датасетах - это не универсальный подход:

    Тут сравнение с линейным приближением ResNet50. Но надо понимать, что по части датасетов работает сильно хуже чем моделька обученная по 100 картинкам.

    Мы пробовали из интереса протестировать на нескольких задачах, например распознавание действий/одежды. И везде CLIP работает очень плохо. Вообще про CLIP можно рассказывать очень долго. На Хабре есть хорошая статья. А я делал видео, где говорил про него:

    Vision Transformers for Dense Prediction

    Следующая сетка, которая, на мой взгляд показательна - “Vision Transformers for Dense Prediction”, которая вышла месяц назад. В ней можно переключаться между подходами Vit/Detr. Можно для первого уровня использовать свертки, а можно трансформеры.

    При этом сетка используется не для детекции/классификации, а для сегментации/оценки глубины. Что дает State-of-art результат сразу по нескольким категориям, при этом в RealTime. Вообще очень печально что @AlexeyAB (автор Yolov4 и один из авторов статьи), не бахнул сюда публикацию отдельную про него. В целом сетка приятная, запускается из коробки, но пока нигде не пробовал. Если кому-то интересно, я делал более подробный обзор тут:

    ---------------------------------------

    В этом месте нужно немного переходнуть. Все что было выше - это самые яркие примеры основных подходов использования трансформеров:

    • Трансформеры используются для обработки выхода сверточной сети

    • Трансформеры используются для нахождения логики поверх выдачи сети

    • Трансформеры используются напрямую применяясь к изображению

    • Гибрид подходов 1-2

    Все что будет ниже - примеры того как те же самые трансформеры/подходы используются для других задач. Поехали.

    PoseFormer

    Pose3D. Трансформер можно применить и к явным фичам, выделенным уже готовой сетью, например к скелетам:

    В этой работе Трансформер используется для восстановления 3д модели человека по серии кадров. В CherryLabs мы делали такое (и более сложные реконструкции) ещё года 3 назад, только без трансформеров, с эмбедингами. Но, конечно, Трансформеры позволяют сделать это быстрее и стабильнее. Результат - вполне неплохое и стабильное 3D, без переобучения:

    Плюс трансформеров в данном случае - возможность работать с данными которые не обладают локальной корреляцией. В отличие от нейронных сетей (в особенности сверточных). Это позволяет Трансформеру обучаться на сложные и разнообразные примеры.

    Если что, идея пришла одновременно много кому. Вот ещё один подход/реализация той же идеи.

    TransPose

    Если посмотреть где сверточных сетей не хватает именно потому что присутствует вложенная внутренняя логика изображения, то сразу приходит на ум именно поза. TransPose - сетка которая распознает позу оптимизируя свертки:

    Сравните с классическими подходами в распознавании позы (достаточно старая версия OpenPose)

    И таких стейджей было в разных работах до десятка. Сейчас они заменены одним трансформером. Получается, конечно, сильно лучше чем у современных сетей:

    SWIN

    Выше мы уже упоминали одну сетку по сегментации на базе Трансформеров от Intel. SWIN от Microsoft показывает результаты лучше, но уже не в RealTime.По сути это улучшенный и расширенный VIT/Deit, переработанный под сегментацию:

    Это сказывается на скорости, зато внушительное качество, лидерство в множестве категорий - https://paperswithcode.com/paper/swin-transformer-hierarchical-vision

    LOFTR

    Есть задачи в которых сверточные сети вообще не очень работают. Например задача сопоставления двух изображений. Года полтора назад для такого зачастую использовали классический пайплайн через SIFT/SURF+RANSAK ( хороший гайд на эту тему + видео которое я записывал год назад ). Год назад появился SuperGlue- единственное крутое применение Graph Neural Network которые я видел в ComputerVision. При этом SuperGlue решал только задачу сопоставления. А теперь есть решение на трансформерах, LOFTR практически End-To-End:

    Сам я попользоваться не успел, но выглядит круто:

    Распознавание действий

    В целом, конечно, трансформеры хороши всюду где есть последовательности, сложная логическая структура или требуется их анализ. Уже есть несколько сетей где действия анализируются трансформерами: (Video Transformer Network, ActionBert). Обещают в ближайшее время добавить в MMAction.

    Трекинг

    Я уже писал год назад огромную статью на Хабре что работает в трекинге и как трекать объекты. Множество подходов, сложная логика. Прошел всего год, и по многим бенчмаркам есть безусловный лидер - STARK:

    Конечно, он не решает всех кейсов. И не во всех кейсах побеждают трансформеры. Но, скорее всего, это не надолго. Вот, например, трекинг глаз на трансформерах. Вот трекинг по типу сиамских сетей пару недельной давности. Вот трекинг BBOX + фичи один, а вот другой, с почти одинаковыми названиями

    TransTrack
    TransTrack
    TransT
    TransT

    И все имеют неплохие скоры.

    ReID

    Реиндентификацию можно вынести из трекинга, как вы помните.  20 дней назад вышел трансформер с распознаванием ReID - весьма неплохо может бустануть трекинг.

    Распознавания лиц через трансформеры недельной давности похоже тоже подошло:

    Медицина

    Если смотреть более конкретные применения тут тоже много интересного. VIT уже вовсю запихивают для анализа КТ и МРТ (1,2):

    И для сегментации (1,2):

    Удивительное

    Что меня удивляет - я не вижу хорошей реализации OCR на трансформерах. Есть несколько примеров, но по бенчмаркам они как-то на дне:

    Все state-of-art пока на классических подходах. Но люди пробуют. Даже сам что-то года 2 назад пробовал прикрутить. Но что-то результата это не дает.

    Ещё из интересного

    Никогда бы не подумал, но трансформеры уже применили для раскраски картинок. И, наверное, это правильно:

    Что дальше

    Мне кажется что трансформеры должны выйти в топ почти по всем категориям для ComputerVision. И, безусловно, для любой аналитики видео. 

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

    Ну а пока, смотрим на то как изменяется мир. Буквально каждый день. Когда материала накапливается достаточно - я обычно выкладываю большую статью на хабр. А про отдельные статьи/идеи обычно рассказываю у себя в канале - https://t.me/CVML_team (дублирую сюда https://vk.com/cvml_team ).

    А текущая статья, если кому удобнее, доступна на youtube:

    Recognitor
    Computer Vision and Machine Learning

    Похожие публикации

    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 22

      +2

      LoFTR выглядит круто. Должно быть хорошо для задач Visual SLAM.

        +8
        По поводу 5:45 youtu.be/xQFeeh5DqeY?t=345

        Да не сказать, чтобы Detr или Deformable-Detr прям рвал COCO:
        * Table-1 — DETR-DC5-R101 — 10 FPS — 44.9 AP% — 26 May 2020 arxiv.org/pdf/2005.12872.pdf
        * Table-1 — two-stage Deformable DETR — 19 FPS — 46.2% AP — 8 Oct 2020 arxiv.org/pdf/2010.04159v4.pdf
        * Table-2 — Cascade Mask R-CNN Swin-B — 11 FPS — 51.9% AP — arxiv.org/pdf/2103.14030v1.pdf
        * Table-2 — EfficientDet-D6 — 10 FPS — 52.6 AP% — 20 Nov 2019 arxiv.org/pdf/1911.09070.pdf
        * Table-11 — YOLOv4-P6 — 30 FPS — 54.5% AP — 16 Nov 2020 arxiv.org/pdf/2011.08036.pdf

        Тот же EfficientDet вышел и раньше, и точнее, и быстрее, чем Detr/Deformable DETR.

        Новый Swin Transformers для тех моделей где указан FPS, тоже не лучшее, чем EfficientDet. А для самых больших и медленных моделей, где FPS не указан — то превосходит EfficientDet по точности (58.0% AP с Test-time-data-augmentation Multi-scale-inference).

        Но в целом тренд есть, статей вышло много (CaiT,PiT,ViViT,ViL,CvT,CrossViT,Swin Transformer,STAM,DPT,DeepViT,CeiT,HVT,ConViT,PVT,CPVT,T2T-ViT) и трансформеры допилят до нужного состояния.

        1. Точность по датам выхода алгоритма: paperswithcode.com/sota/object-detection-on-coco


        2. Соотношение точности к времени задержки (V100, batch=1, no TensorRT, no TTA):
          0
          В детекции объектов на изображении на текущий момент получается лучше всего Slaled-YOLO4 использовать?
            0
            Пока что да, пока мы ещё чего то не выпустили )
            Есть нюансы, что некоторые модели лучше для очень маленьких или сильно перекрывающихся объектов, какие-то лучше для запуска на смартфонах. Я могу и Scaled-YOLOv4 для этих задач настроить и обучить, но пользователям проще другую модель выбрать.

            Как правильно в комментариях заметили, большинству компаний дешевле взять чужую сеть и увеличить точность за счет сбора хорошего датасета, чем за счет улучшения или разработки своей сети, особенно в таких высоко-конкурентных задачах как ImageNet Classification или MS COCO Object detection, где постоянно соревнуются Топ-10 IT компаний мира.
            0
            Алексей, можете пояснить, как специалист по обнаружению.
            Вот есть датасет COCO, по сути единственный адекватный для использования в бенчмарках для детекции.
            Но если посмотреть на него внимательно, то можно увидеть, что качество его разметки далеко неидеальное, независимо от выборок train/test/val — много неразмеченных объектов, много очень спорных аннотаций (например, ладонь человека крупным планом отмечена как «person»).
            Всё это приводит к неоднозначности при обучении.
            Справедливо ли вообще сравнивать различные архитектуры в таких условиях по метрике mAP?
              0
              Я вижу много недостатков в MS COCO датасете и метрике AP, но пока что это самый лучший из имеющихся способов для сравнения сетей. Если ты хочешь сравнивать сети друг с другом, то у тебя нет другого варианта, т.к. все самые большие компании Apple/Google/Facebook/Microsoft/Intel/Baidu для самых лучших нейронных сетей используют этот датасет и эту метрику.

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

              Минусы:
              * MSCOCO датасет — слишком много ошибок, например, много людей в датасете не размечено
              * метрика AP — усредняет по классам, т.е. если в датасете из 2х классов одна сеть нашла 100000 из 100000 человек и 0 из 1 сумок, а другая сеть нашла 0 из 100000 человек и 1 из 1 сумок, то у обеих сетей будет одинаковая точность 50%.

              Плюсы:
              * MSCOCO датасет — неизменен, т.е. новую сеть можно сравнить с сетями созданными 5 лет назад.
              * метрика AP — усредняет по Precision-Recall-кривой, т.е. не зависит от подбора confidence_threshold, т.е. можно успешно сравнивать сеть с большими TP и FP и сеть с малыми TP и FP

              Спорные моменты:
              * MSCOCO датасет — наличие ошибок в обучающем (но не в valid/test) некоторые считают хорошим тестом на возможность сети обходить взаимоисключающие ошибочные метки. Ошибки в реальных датасетах или RL-подходах будут всегда, и сеть должна эффективно их обходить.
              * метрика AP — усреднение по классам некоторые считают хорошим тестом на решение проблемы дисбаланса количества объектов разных классов (т.е. сеть может обучаться и на большом количестве изображений одного объекта, и на малом количестве изображений другого объекта)

              То что в датасете рука обозначена как человек (в датасете нет отдельного класса рука) — это не ошибка, человек там почти точно есть. Например, если автопилот или производственный робот видя торчащую из-за препятствия руку не среагирует должным образом, то могут быть серьёзные травмы.
            +6
            Хороший разбор всевозможных применений трансформеров. Как всегда в тренде )
            В целом, если сравнивать два конкретных стандартных решения Convolutional networks (ResNet50/152) и Visual Transformers (ViT-B/L-32), то:

            1. Convolutional networks (ResNet50/152) — дают лучшую точность на маленьких датасетах, за счет лучшей обобщающей способности из-за трансляционной инвариантности и наличия локальных корреляций, которые ты упомянул

            2. Visual Transformers (ViT-B/L-32) — дают лучшую точность для больших датасетов (или auto/meta/pseudo-labeling/distillation), за счет рационального использования емкости сети из-за внимания только к нужным деталям

            Page 6 — Figure 4: arxiv.org/pdf/2010.11929.pdf

              +1

              Как я понимаю, проблема даже не в самих алгоритмах, а в качественных датасетах.

                0

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

                  0

                  Через визуализацию слоев Attention можно, достаточно много есть на эту тему статей и примеров

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

                      Да, трансформеры знатно бомбанули, даже не верится, что с первых DETR'ов меньше года прошло, столько всего сделали за это время.


                      Про сегментацию и глубину — за пару дней до интела ещё вот такая статья выходила, где результаты нейросети выглядят едва ли не детальнее, чем GT :)

                        +1
                        У Интеловской DPT результаты ещё лучше по всем параметрам на обоих датасетах Kitti и NYU )

                        А вот за несколько месяцев до этого (28 Nov 2020) незаметно вышла ещё одна статья по mono-depth, тоже с использованием трансформеров — AdaBins arxiv.org/abs/2011.14141, и там результаты на Kitti лучше, но на NYU хуже, чем у Интеловской DPT arxiv.org/abs/2103.13413

                        Можно посмотреть прикольные примеры работы связки MiDaS+Inpainting: shihmengli.github.io/3D-Photo-Inpainting
                        После замены MiDaS на DPT, должно быть ещё намного лучше.
                          0

                          Да уж, уследить стало совершенно невозможно, если каждый день этим не заниматься, не смотришь пару месяцев на конкретную подзадачу, а там всё поменялось :) Уже кажется, что бесполезно самому пытаться что-то улучшать (если ты не работаешь в лабе по конкретному узкому направлению) — проще подождать полгода/год и результаты превзойдут все твои ожидания.

                            +2
                            Да, каждый год становится сложнее выжимать большую точность из нейронных сетей, больше компаний этим занимаются, больше денег вкладывается, исследования дорожают, другим компаниям остается только наблюдать за прогрессом на сайте paperswithcode.com/sota

                            Но, например, DPT-monodepth имеет намного лучшую zero-shot точность, чем любой другой алгоритм, и в реальных задачах zero-shot точность важнее, чем точность на конкретном датасете, но нет общепринятого теста для zero-shot, и соответственно нет такого раздела на paperswithcode.
                              +1
                              Хочу сказать спасибо за DPT, в нашей задаче раньше использовали Midas, попробывали DPT и результат шокировал, очень хорошее улучшение даже визуально. Осталось перенести ее на Tensorrt ) В процессе.
                                0
                                Пожалуйста ) А в какой задаче используете?
                        +1
                        Что меня удивляет — я не вижу хорошей реализации OCR на трансформерах.

                        Реализации нет, а статья интересная есть — http://arxiv.org/abs/2103.12731


                        Еще кажется интересная статья в тему про HaloNet — http://arxiv.org/abs/2103.12731
                        TLDR — путем трюков они добились качества и размера сеток на Imagenet, но ресурсов оно жрет все равно сильно больше.


                        Супер важная вещь, про которую все забывают в погоне за сенсациями — это стоимость обладания системы. Даже если она показывает лучше результат на 1%, но ее стоит в 10 раз больше ресурсов натренировать, полезно ли это (даже при таком же косте на инференсе и размере)?


                        Вообще мне кажется, что будущее в:


                        • использовании гибрида из сверток условно в первой трети сетки
                        • и какого-то простого способа кормить 2D feature-maps в трансформеры
                          +2
                          А вообще какие-нибудь публичные реализации OCR на новых технологиях есть? Такое впечатление, что всякие «раскрашивалки», «состаривалки», «морфилки» и прочее just for fun валятся стремительным домкратом, а такая, сугубо полезная и востребованная область, как OCR, остаётся там же, где была 10 лет назад… Отчего не случилось революции появления табуна софтин, уделывающих какой-нибудь условный FineReader как бык — овцу?
                          0
                          Спасибо за статью! Жаль что нет ничего про Attention, что находиться в основе всех трасформеров.

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

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