Добро пожаловать в наш еженедельный блог с советами и рекомендациями по FiftyOne, где мы рассказываем об интересных рабочих процессах и функциях FiftyOne! На этой неделе мы рассмотрим полилинии. Мы стремимся охватить основы создания полилиний и то, как их можно использовать для создания специализированных меток.

Подождите, а что такое FiftyOne?

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

Хорошо, давайте углубимся в советы и рекомендации этой недели! Также подписывайтесь в нашем блокноте или на YouTube!

Что такое полилиния?

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

Создание полилиний в ваших образцах

import fiftyone as fo
import fiftyone.zoo as foz

dataset = foz.load_zoo_dataset(
    "quickstart",
    dataset_name="polylines"

)

session = fo.launch_app(dataset)

Используя приложение, я собираюсь пометить незанятое изображение для использования в примере. Для этого просто выберите изображение, щелкните изображение тега и добавьте «полилинии» к его образцам тегов.

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

example_view = dataset.match_tags("polylines")
sample = example_view.first()

Классические полилинии

Самая простая полилиния — это линия, определяемая своими точками. Оно может указывать направление траектории или просто быть обозначением границы между двумя областями интересов. Чтобы определить метку Polyline, предоставьте список точек в (x,y), ограниченных (0,1) для x и y. Мы также передаем аргумент closed=False, чтобы обозначить, что мы не закрываем ломаную линию, и filled=False, чтобы аналогичным образом выразить, что мы не хотим, чтобы полилиния была заполнена.

# A simple polyline
polyline1 = fo.Polyline(
   points=[[(0.3, 0.3), (0.7, 0.3), (0.7, 0.3)]],
   closed=False,
   filled=False,
)

Классический многоугольник с полилиниями

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

💡 Чтобы замкнуть фигуру, необходимы только вершины, и нет необходимости указывать первую вершину повторно.

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

# A closed, filled polygon with a label
polyline2 = fo.Polyline(
   label="triangle",
   points=[[(0.1, 0.1), (0.3, 0.1), (0.3, 0.3)]],
   closed=True,
   filled=True,
   kind="right",  # custom attribute
)
sample["polylines"] = fo.Polylines(polylines=[polyline1, polyline2])
sample.save()
example_view.save()
session.view = example_view

Кубоиды

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

Сегодня мы рассмотрим, как можно использовать полилинии для создания кубоидов на нашем 2D-изображении. FiftyOne поддерживает 3D-блоки для облаков точек, но об этом мы поговорим в другой раз.

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

   7------------ 6
  /|            /|
 / |          /  |
3--------  2     |
|  4-----  |---- 5
| /        |   /
|/         | /
0--------  1

Используя метод fo.Polyline.from_cuboid(), мы можем легко создать кубоид, имея 8 точек.

import numpy as np
def random_cuboid():
   x0, y0 = [0, 0.2] + 0.8 * np.random.rand(2)
   dx, dy = (min(0.8 - x0, y0 - 0.2)) * np.random.rand(2)
   x1, y1 = x0 + dx, y0 - dy
   w, h = (min(1 - x1, y1)) * np.random.rand(2)
   front = [(x0, y0), (x0 + w, y0), (x0 + w, y0 - h), (x0, y0 - h)]
   back = [(x1, y1), (x1 + w, y1), (x1 + w, y1 - h), (x1, y1 - h)]
   return fo.Polyline.from_cuboid(front + back, label="cuboid")
sample["polyline"] = random_cuboid()
sample.save()
example_view.save()
session.view = example_viewimport numpy as np def random_cuboid(): x0, y0 = [0, 0.2] + 0.8 * np.random.rand(2) dx, dy = (min(0.8 - x0, y0 - 0.2)) * np.random.rand(2) x1, y1 = x0 + dx, y0 - dy w, h = (min(1 - x1, y1)) * np.random.rand(2) front = [(x0, y0), (x0 + w, y0), (x0 + w, y0 - h), (x0, y0 - h)] back = [(x1, y1), (x1 + w, y1), (x1 + w, y1 - h), (x1, y1 - h)] return fo.Polyline.from_cuboid(front + back, label="cuboid") sample["polyline"] = random_cuboid() sample.save() example_view.save() session.view = example_view

Вот как может выглядеть готовый результат:

Повернутая ограничивающая рамка

Повернутые ограничивающие рамки необходимы для таких задач, как обнаружение, локализация и отслеживание объектов, особенно когда объекты не выровнены по стандартным горизонтальным и вертикальным осям. Они полезны в таких приложениях, как обнаружение текста на изображениях, распознавание текста сцены и локализация нестандартных объектов. Эти ограничивающие рамки более точно отображают ориентацию объектов, обеспечивая точное позиционирование и анализ в ситуациях, когда традиционных рамок, выровненных по осям, недостаточно. Чтобы использовать вращающуюся ограничивающую рамку в FiftyOne, мы можем использовать fo.Polyline.from_rotated_box(), где мы указываем центр рамки в xc,yc, а также ширину, высоту и угол, на который рамка поворачивается.

def random_rotated_box():
   xc, yc = 0.2 + 0.6 * np.random.rand(2)
   w, h = 1.5 * (min(xc, yc, 1 - xc, 1 - yc)) * np.random.rand(2)
   theta = 2 * np.pi * np.random.rand()
   return fo.Polyline.from_rotated_box(xc, yc, w, h, theta, label="box")
sample["polyline"] = random_rotated_box()
sample.save()
example_view.save()
session.view = example_view

Готовый результат, который я получил, был таким:

Заключение

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

Присоединяйтесь к сообществу FiftyOne!

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

Что дальше?

  • Если вам нравится то, что вы видите на GitHub, дайте проекту звезду.
  • "Начать!" Мы позаботились о том, чтобы начать работу за несколько минут.
  • Присоединяйтесь к Slack-сообществу FiftyOne, мы всегда рады помочь.

Оригинально опубликовано на сайте https://voxel51.com 22 сентября 2023 г.