Добре дошли в нашия седмичен блог за съвети и трикове на 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

Кубоиди

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

Днес ще разгледаме как можем да използваме полилинии, за да създадем кубоиди върху нашето 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

Крайният резултат, който пуснах, беше следният:

Заключение

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

Присъединете се към общността FiftyOne!

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

Какво следва?

  • Ако ви харесва това, което виждате в GitHub, дайте на проекта звезда.
  • "Първи стъпки!" Улеснихме стартирането и стартирането за няколко минути.
  • Присъединете се към FiftyOne Slack общността, винаги се радваме да помогнем.

Първоначално публикувано в https://voxel51.com на 22 септември 2023 г.