Приветствую, Хабр! Меня зовут Дмитрий. На момент написания этой статьи я являюсь магистрантом второго курса в ИТМО. Компьютерным зрением начал заниматься четыре года назад. В этой статье я хочу рассказать вам о Kornia.   Kornia это open source библиотека для решения задач компьютерного зрения. Она   использует PyTorch в качестве основного бэкенда и состоит из набора дифференцируемых процедур и модулей. Создатели библиотеки вдохновлялись OpenCV, и поэтому Kornia является его аналогом, но при этом в некоторых моментах превосходит. Основным преимуществом Kornia по сравнению с тем же OpenCV, scikit-image или с Albumentations является возможность обрабатывать изображения батчами, а не по одному изображению и возможность обрабатывать данные на GPU. Об этом даже упоминал один из создателей библиотеки Albumentations в своей статье, вот ссылка на неё. Также из любопытного, например, команда из Sber AI для ускорения своего пайплайна  в задаче faceswap добавляла обработку кадров батчами и переписывала часть функций на Kornia, вот ссылка на их статью.   Помимо Kornia есть и другие инструменты для решения задач, связанных с компьютерным зрением: OpenCV Scikit-Image Torchvision Tensorflow.image Albumentations Создатели Kornia в своей статье приводят таблицу сравнения нескольких библиотек для задач компьютерного зрения. Как видим, по всем заявленным в таблице пунктам с Kornia может сравниться только Tensorflow.image. Кроме того, создатели Kornia отдельно проводили замеры скорости аугментаций производимых с помощью разных библиотек. Libraries TorchVision Albumentations Kornia (GPU) Batch Size 1 1 1 32 128 RandomPerspective 4.88±1.82 4.68±3.60   4.74±2.84   0.37±2.67   0.20±27.00 ColorJiggle   4.40±2.88   3.58±3.66   4.14±3.85   0.90±24.68   0.83±12.96   RandomAffine   3.12±5.80   2.43±7.11   3.01±7.80   0.30±4.39   0.18±6.30 RandomVerticalFlip   0.32±0.08   0.34±0.16   0.35±0.82   0.02±0.13   0.01±0.35   RandomHorizontalFlip   0.32±0.08   0.34±0.18   0.31±0.59   0.01±0.26   0.01±0.37   RandomRotate   1.82±4.70   1.59±4.33   1.58±4.44   0.25±2.09   0.17±5.69   RandomCrop   4.09±3.41   4.03±4.94   3.84±3.07   0.16±1.17 0.08±9.42   RandomErasing   2.31±1.47   1.89±1.08   2.32±3.31   0.44±2.82   0.57±9.74   RandomGrayscale   0.41±0.18   0.43±0.60   0.45±1.20 0.03±0.11   0.03±7.10   RandomResizedCrop   4.23±2.86   3.80±3.61   4.07±2.67   0.23±5.27   0.13±8.04   CenterCrop   2.93±1.29   2.81±1.38   2.88±2.34   0.13±2.20   0.07±9.41   Таблица показывает, что Kornia делает аугментации быстрее только если обрабатывать изображения батчами. Если делать это по одной картинке, то большой разницы по скорости нет. Рассмотрим какие модули входят в состав Kornia. Модули Kornia: kornia.augmentation - модуль для аугментации данных. kornia.color - модуль для преобразования цветового пространства (rgb to grayscale, rgb to bgr и т.д.). kornia.contrib - экспериментальные модули. Есть модули для классификации изображений, сегментации, детекции. Например есть MobileViT, TinyViT. kornia.enhance - инструменты для изменения яркости, контрастности, резкости и т.д. Есть выравнивание гистограммы, в том числе CLAHE. kornia.feature - инструменты для детекции признаков, нахождения углов, линий и т.д. на изображениях. kornia.filters - инструменты для размытия изображения и нахождения границ (Canny, Sobel и т.д.).  kornia.geometry - инструменты для геометрических преобразований: вращение, сдвиг, отражение и т.д. kornia.sensors - экспериментальный модуль для работы с видео камерами. kornia.io - модуль для загрузки и сохранения изображений. Для работы требует установки kornia_rs, который написан на Rust. Работает только на Linux. kornia.image - инструменты модуля позволяют получать информацию об изображении: количество каналов, формат пикселей, позволяет клонировать изображение, загружать из файла, переводить в torch tensor из numpy array и обратно и т.д.  kornia.losses - модуль содержит имплементации различных функций ошибок. kornia.metrics - имплементация различных метрик (accuracy, mean_iou и т.д.). kornia.morphology - инструменты для морфологических операций: сужение (erosion), расширение (dilation), открытие (opening), закрытие (closing) и т.д.. kornia.tracking  модуль для отслеживания целевого объекта по локальным признакам в последовательности кадров. kornia.testing - модуль содержит утилиты для тестирования (сейчас их там всего три). kornia.utils - инструменты для отрисовки линий, прямоугольников, выпуклых многоугольников, сохранения и загрузки облаков точек и т.д.  kornia.x - экспериментальное  API для обучения моделей в Kornia. Позволяет учить модели для классификации изображений, семантической сегментации и детекции объектов.  Kornia обладает очень обширным функционалом и практически по каждому её модулю можно писать отдельную и очень большую статью. Рассказать обо всём в рамках одной статьи не представляется возможным. Поэтому рассмотрим примеры лишь некоторых возможностей Kornia. Установка Для установки нужно выполнить : Либо, если будете устанавливать через репозиторий гитхаба:  Если будете использовать kornia.io для загрузки/сохранения изображений, то нужно будет установить kornia_rs, который реализован на языке Rust. Но работает kornia_rs только на Linux. Кроме того, если планируете использовать экспериментальный Training API, то нужно ещё установить kornia[x]. Рассмотрим сначала более простые возможности Kornia, а потом уже перейдём к более сложным примерам. Так выглядит исходное изображение к которому мы будем применять некоторые базовые преобразования. kornia.color Сначала попробуем поменять цветовую схему изображения. Сделаем его серым. После выполнения кода получаем следующее. Применим к исходному изображению фильтр Sepia. Получаем такой результат. kornia.enhance Теперь попробуем изменить контраст.  После выполнения кода получается следующее изображение. Применим адаптивное выравнивание гистограммы с помощью фильтра CLAHE. Получаем следующий результат. kornia.filters Теперь найдем на изображении границы с помощью алгоритма Canny. Получаем следующее. А теперь попробуем размытие Гаусса. Получаем размытое изображение. kornia.losses Отдельно хочу заострить внимание на том, что в Kornia есть имплементация пары десятков функций ошибок. Например, для задачи семантической сегментации предложено шесть лосс-функций. Я их перечислю. binary_focal_loss_with_logits focal_loss dice_loss tversky_loss   lovasz_hinge_loss lovasz_softmax_loss Конечно можно написать функцию ошибки самому, но если есть готовая реализация и она подходит, зачем изобретать велосипед? kornia.utils Kornia позволяет рисовать на изображениях линии и прямоугольники. Нарисуем прямоугольник. А теперь нарисуем линию. kornia.morphology Теперь применим к изображению морфологические операции: градиент, открытие, закрытие. Есть две базовых морфологических операции: эрозия и дилатация. Градиент, открытие и закрытие являются их линейными комбинациями. kornia.augmentation Применим к исходному изображению некоторые аугментации доступные в Kornia. В качестве примера возьмём ColorJitter, RandomAffine, RandomPerspective. После применения аугментаций получается такое изображение. kornia.geometry Рассмотрим пару примеров геометрических преобразований: зеркальное отражение и поворот.  После выполнения кода получаем следующее. После выполнения кода получаем вот это. Теперь рассмотрим более сложные примеры возможностей Kornia. Face Detection В Kornia встроен детектор лиц, использующий модель YuNet. Давайте посмотрим, как он работает. Допустим, у нас есть такое изображение. Попробуем найти на нём лицо.  После выполнения кода получаем следующее.  Видим, что не только Терминатор смог что-то обнаружить на фото)). Image matching Теперь попробуем найти похожие точки на двух следующих изображениях с помощью метода LoFTR: Detector-Free Local Feature Matching with Transformers  доступного в Kornia.  После выполнения кода получается такое изображение. Точки на изображениях, которые алгоритм посчитал схожими соединены линиями. Синие точки это то, что дополнительно фильтровал метод findFundamentalMat. Image Stitching Kornia также позволяет объединить несколько изображений имеющих пересекающиеся области чтобы получить одно общее изображение. На сайте НАСА я нашёл фото сделанные марсоходом Perseverance около кратера Езеро (Jezero). Давайте потренируемся на них.  . Вот, что мы получим после выполнения кода. Похоже, что каким-то подобным образом снимки, сделанные марсоходами, объединяют чтобы получить панорамные изображения Марса. Теперь мы умеем делать что-то наподобие). Visual Prompting  Visual Prompting представляет собой использование так называемых визуальных подсказок - ключевых точек или ограничивающих рамок, которые вместе с искомым изображением передаются в предобученную модель, например в визуальный трансформер. И модель пытается по этим подсказкам произвести, например, сегментацию области, точки которой похожи на те ключевые точки, что мы передали модели в качестве примера. В качестве модели будем использовать предобученный визуальный трансформер  ViT-H SAM. Дальше будет много кода, но большая его часть это вспомогательные функции для отрисовки ключевых точек и вывода изображения на экран. Сначала загружаем VisualPrompter. По умолчанию это будет ViT-H SAM, который весит почти 2,5 гигабайта. Но можно загрузить ViT-L SAM он весит в два раза меньше, либо ViT-B SAM -он весит 348 мегабайт. Потом передаём в загруженную модель наше изображение. Теперь создаем визуальные подсказки - ключевые точки по которым модель будет пытаться сегментировать области. Первые четыре ключевых точки это точки относящиеся только к воде, и на финальном изображении они будут отмечены зелёными крестиками. Остальные четыре точки относятся к небу, облакам, солнцу и на финальном изображении они будут отмечены красными крестиками. Дальше создаём метки 0 и 1. За единицу возьмём точки относящиеся к воде, остальные будут нулём. Теперь запускаем модель, передав ей ключевые точки и метки.  Дальше идут вспомогательные функции для отображения маски, ключевых точек и вывода результата на экран. Код вывода результата на экран. Получаем изображение с найденной маской. По четырём ключевым точкам, относящимся к воде модель сегментировала всю воду на исходной фотографии. Дополнительно на фото отрисованы использованные ключевые точками (зелёные и красные крестики). Посмотреть другие примеры использования визуальных подсказок можно по этой ссылке. В этой статье мы рассмотрели далеко не весь перечень возможностей Kornia. Их гораздо больше. Создатели Kornia обещали в будущем добавить алгоритмы для следующих областей: Super Resolution, Deep Edge detection, Stereo and Optical flow and camera calibration, Neural Rendering. Что же, ждём. А пока, скажем им спасибо за то, что уже есть. Получить более подробную информацию о Kornia можно по следующим ссылкам. Ссылки: Репозиторий Kornia Официальная документация по Kornia Туториал Код и изображения из этой статьи доступны в ноутбуках по ссылке. Большое спасибо, что прочитали! Если вы уже знакомы с Kornia, поделитесь пожалуйста своими впечатлениями или опытом использования в комментариях.