Загрузка урока...
До этого мы говорили только про задачу классификации. Нам дают фотографию, а мы говорим что на ней показано из какого-то заранее определенного набора классов, на который тренировали свою модель. Но есть и более интересные задачи с картинками:
Детекция - мы хотим находить какой-то объект на изображении или видео. Давайте будем на картинке выделять рамками интересующие нас объекты, причем необязательно одного класса. Например, так можно посчитать количество людей или машин в кадре.
Сегментация - давайте теперь мы будем хотеть не просто рамки, а попиксельное выделение. Это может быть полезно, если мы хотим знать очень точно границы объектов и, например, считать их площадь.
Трекинг - задача похожая на детекцию, но теперь мы хотим делать это на видео и в конце иметь ещё и некий путь (track) объекта. Например, мы хотим нарисовать траекторию мячика по видео.
Pose estimation - очень популярная в последнее время задача. Мы хотим знать координаты разных точек тела человека (колени, стопы, кисти и так далее). Рисуем человечков из палочек, как в детстве. Применений этому масса, начиная от распознавания жестового языка и заканчивая анализом тренировок спортсменов.
Генерация изображений - наверное, самое популярное применение нейросетей в последнее время. Диффузионные модели, способные генерировать реалистичные изображения по заданному тексту буквально наполнили Интернет.

Картинка взята отсюда.
Отдельно стоит выделить 3D компьютерное зрение -- в нём множество своих задач, связанных с воссозданием сцены, генерацией 3D моделей объектов и так далее.

Картинка взята отсюда.
Это задача, в которой мы сначала находим прямоугольник, содержащий в себе интересующий нас объект, а потом мы классифицируем то, что оказалось внутри прямоугольника. Такой прямоугольник называется bounding box или, коротко, bbox.
Обычно модель выдает для некоторого класса k список прямоугольников с уверенностью. Уверенность тем выше, чем модель сильнее уверена в наличии объекта внутри прямоугольника и в его принадлежности классу k.

Картинка взята отсюда .
Как нетрудно догадаться, при таком подходе наша модель может научиться выдавать очень много похожих bbox в одном месте. Примерно так, как это выглядит ниже.

Картинка взята отсюда . Как это исправить?
Тут нам поможет принцип Non-max suppression (NMS). Его идея очень проста: мы сначала сортируем прямоугольники по уверенности, а потом удаляем все прямоугольники, которые пересекаются с нашим более чем на порог t. Для этого нам понадобится знать всего 5 чисел для каждого прямоугольника: 4 задают сам прямоугольник и уверенность. Реализацию этой функции в коде можно посмотреть по ссылке, ведущей на первоисточник картинки.
Отметим, что выходы модели могут быть в разных форматах:
Нормированы на размер изображения (то есть будут значения от 0 до 1, так, например, у YOLOv8)
Значения в пикселях (формат Pascal VOC, модель YOLOX)
Кроме того, сами прямоугольники тоже можно задавать по-разному:
Ширина, высота и две координаты для центра (например, YOLOv8)
Координаты левого верхнего и правого нижнего углов (формат Pascal VOC, модель YOLOX)
Поэтому Computer Vision (CV) специалистам нередко приходится пересчитывать одно в другое при экспериментах с моделями.

Одним из наиболее старых примеров сети для детекции является R-CNN. Как он работает? Давайте мы возьмем наше изображение и как-то вытянем из него наиболее интересные области. Как мы это сделаем? Обратимся к классическим алгоритмам (подробно в них влезать тут не будем, но можно почитать про Selective search и метод Felzenszwalb-Huttenlocher). Если совсем на пальцах, то давайте просто сгруппируем участки изображений на основе интенсивности пикселей, после чего склеим их в один, если они достаточно похожи.
Будем повторять этот алгоритм пока у нас либо будет нечего склеивать, либо не останется желаемое количество участков. Сделаем из полученных регионов прямоугольники (те самые bounding boxes), после чего передадим их в предобученную сеть AlexNet (для этого нам понадобится сделать Resize в размеры известного датасета ImageNet). Получаем вероятности классов датасета ImageNet, но если хотим свои, то можно просто заменить последние слои и учить отдельно.
Какие проблемы у такого подхода?
Не end-to-end: у нас несколько независимых блоков.
Генерация кандидатов bounding boxes полагается просто на интенсивность пикселей. Можно изменять алгоритмы на другие, но тогда генерация кандидатов будет очень сложной.
Сверточную сеть мы вовсе или практически не обучаем, поэтому качество вряд ли будет высокое.
Очень долго (много операций).
Можно ли улучшить этот подход? Конечно! В современной задачи детекции практически никогда не используют этот подход. Тем не менее, его мотивы можно встретить даже в самых современных разработках, о которых речь пойдет дальше.
В этом материале нет файлов для просмотра.