İçeriğe geç

Basit Yardımcı Programlar

perspektifli kod

Bu ultralytics paketi, iş akışlarınızı destekleyebilecek, geliştirebilecek ve hızlandırabilecek sayısız yardımcı programla birlikte gelir. Çok daha fazlası mevcut, ancak burada çoğu geliştirici için yararlı olacak bazıları var. Bunlar ayrıca programlamayı öğrenirken kullanmak için harika bir referans noktasıdır.



İzle: Ultralytics Yardımcı Programlar | Otomatik Ek Açıklama, Explorer API ve Veri Kümesi Dönüştürme

Veri

YOLO Veri Gezgini

YOLO Kaşif eklenmiştir. 8.1.0 yıldönümü güncellemesi ve veri setinizi daha iyi anlamak için kullanabileceğiniz güçlü bir araçtır. YOLO Explorer'ın sağladığı temel işlevlerden biri, veri kümenizdeki nesne örneklerini bulmak için metin sorgularını kullanma becerisidir.

Otomatik Etiketleme / Ek Açıklamalar

Veri kümesine açıklama eklemek çok yoğun kaynak gerektiren ve zaman alan bir süreçtir. Makul miktarda veri üzerinde eğitilmiş bir YOLO nesne algılama modeliniz varsa, bunu kullanabilir ve SAM ek verileri (segmentasyon formatı) otomatik olarak tanımlamak için.

from ultralytics.data.annotator import auto_annotate

auto_annotate(#(1)!
    data='path/to/new/data',
    det_model='yolov8n.pt',
    sam_model='mobile_sam.pt',
    device="cuda",
    output_dir="path/to/save_labels",
)
  1. Bu fonksiyondan hiçbir şey dönmez

  2. Referans bölümüne bakınız annotator.auto_annotate işlevin nasıl çalıştığı hakkında daha fazla bilgi için.

  3. ile birlikte kullanın. fonksiyon segments2boxes nesne algılama sınırlayıcı kutularını da oluşturmak için

COCO YOLO Formatına Dönüştür

COCO JSON ek açıklamalarını uygun YOLO biçimine dönüştürmek için kullanın. Nesne algılama (sınırlayıcı kutu) veri kümeleri için, use_segments ve use_keypoints her ikisi de False

from ultralytics.data.converter import convert_coco

convert_coco(#(1)!
    '../datasets/coco/annotations/',
    use_segments=False, 
    use_keypoints=False,
    cls91to80=True,
)
  1. Bu fonksiyondan hiçbir şey dönmez

Hakkında ek bilgi için convert_coco fonksiyon, referans sayfasını ziyaret edin

Sınırlayıcı Kutu Boyutlarını Al

from ultralytics.utils.plotting import Annotator
from ultralytics import YOLO
import cv2

model = YOLO('yolov8n.pt')  # Load pretrain or fine-tune model

# Process the image
source = cv2.imread('path/to/image.jpg')
results = model(source)

# Extract results
annotator = Annotator(source, example=model.names)

for box in results[0].boxes.xyxy.cpu():
    width, height, area = annotator.get_bbox_dimension(box)
    print("Bounding Box Width {}, Height {}, Area {}".format(
        width.item(), height.item(), area.item()))

Sınırlayıcı Kutuları Segmentlere Dönüştürme

Mevcut ile x y w h sınırlayıcı kutu verilerini kullanarak segmentlere dönüştürün yolo_bbox2segment işlev. Resimler ve ek açıklamalar için dosyaların bu şekilde düzenlenmesi gerekir:

data
|__ images
    ├─ 001.jpg
    ├─ 002.jpg
    ├─ ..
    └─ NNN.jpg
|__ labels
    ├─ 001.txt
    ├─ 002.txt
    ├─ ..
    └─ NNN.txt
from ultralytics.data.converter import yolo_bbox2segment

yolo_bbox2segment(#(1)!
    im_dir="path/to/images",
    save_dir=None, # saved to "labels-segment" in images directory
    sam_model="sam_b.pt"
)
  1. Bu fonksiyondan hiçbir şey dönmez

Ziyaret edin yolo_bbox2segment referans sayfası işlev hakkında daha fazla bilgi için.

Segmentleri Sınırlayıcı Kutulara Dönüştürme

kullanan bir veri kümeniz varsa segmentasyon veri kümesi formatı bunları kolayca yukarı-sağ (veya yatay) sınırlayıcı kutulara dönüştürebilirsiniz (x y w h biçimi) bu işlev ile.

from ultralytics.utils.ops import segments2boxes

segments = np.array(
    [[805, 392, 797, 400, ..., 808, 714, 808, 392],
     [115, 398, 113, 400, ..., 150, 400, 149, 298],
     [267, 412, 265, 413, ..., 300, 413, 299, 412],
    ]
)

segments2boxes([s.reshape(-1,2) for s in segments])
>>> array([[ 741.66, 631.12, 133.31, 479.25],
           [ 146.81, 649.69, 185.62, 502.88],
           [ 281.81, 636.19, 118.12, 448.88]],
           dtype=float32) # xywh bounding boxes

Bu işlevin nasıl çalıştığını anlamak için referans sayfasını ziyaret edin

Yardımcı Programlar

Görüntü Sıkıştırma

En boy oranını ve kalitesini koruyarak tek bir görüntü dosyasını küçültülmüş boyuta sıkıştırır. Giriş görüntüsü maksimum boyuttan daha küçükse, yeniden boyutlandırılmaz.

from pathlib import Path
from ultralytics.data.utils import compress_one_image

for f in Path('path/to/dataset').rglob('*.jpg'):
    compress_one_image(f)#(1)!
  1. Bu fonksiyondan hiçbir şey dönmez

Otomatik Bölünmüş Veri Kümesi

Bir veri kümesini otomatik olarak train/val/test böler ve elde edilen bölmeleri autosplit_*.txt dosyalar. Bu işlev rastgele örnekleme kullanacaktır, bu da fraction eğitim için argüman.

from ultralytics.data.utils import autosplit

autosplit( #(1)!
    path="path/to/images",
    weights=(0.9, 0.1, 0.0), # (train, validation, test) fractional splits
    annotated_only=False     # split only images with annotation file when True
)
  1. Bu fonksiyondan hiçbir şey dönmez

Bu işlev hakkında daha fazla bilgi için Referans sayfasına bakın.

Segment-poligondan İkili Maskeye

Tek bir çokgeni (liste olarak) belirtilen görüntü boyutunda bir ikili maskeye dönüştürür. Çokgen biçiminde [N, 2] ile N sayısı olarak (x, y) poligon konturunu tanımlayan noktalar.

Uyarı

N her zaman eşit olsun.

import numpy as np
from ultralytics.data.utils import polygon2mask

imgsz = (1080, 810)
polygon = np.array(
    [805, 392, 797, 400, ..., 808, 714, 808, 392], # (238, 2)
)

mask = polygon2mask(
    imgsz,     # tuple
    [polygon], # input as list
    color=255, # 8-bit binary
    downsample_ratio=1
) 

Sınırlayıcı Kutular

Sınırlayıcı Kutu (yatay) Örnekleri

Sınırlayıcı kutu verilerini yönetmek için Bboxes sınıfı, kutu koordinat biçimlendirmesi arasında dönüştürme yapmaya, kutu boyutlarını ölçeklendirmeye, alanları hesaplamaya, ofsetleri dahil etmeye ve daha fazlasına yardımcı olacaktır!

from ultralytics.utils.instance import Bboxes

boxes = Bboxes(
    bboxes=np.array(
        [[  22.878,  231.27,  804.98,  756.83,],
         [  48.552,  398.56,  245.35,  902.71,],
         [  669.47,  392.19,  809.72,  877.04,],
         [  221.52,   405.8,  344.98,  857.54,],
         [       0,  550.53,   63.01,  873.44,],
         [  0.0584,  254.46,  32.561,  324.87,]]
    ),
    format="xyxy",
)

boxes.areas()
>>> array([ 4.1104e+05,       99216,       68000,       55772,       20347,      2288.5])
boxes.convert("xywh")
boxes.bboxes
>>> array(
    [[ 413.93, 494.05,  782.1, 525.56],
     [ 146.95, 650.63,  196.8, 504.15],
     [  739.6, 634.62, 140.25, 484.85],
     [ 283.25, 631.67, 123.46, 451.74],
     [ 31.505, 711.99,  63.01, 322.91],
     [  16.31, 289.67, 32.503,  70.41]]
)

Bkz. Bboxes referans bölümü daha fazla nitelik ve yöntem için kullanılabilir.

İpucu

Aşağıdaki işlevlerin çoğuna (ve daha fazlasına) Bboxes sınıf ancak fonksiyonlarla doğrudan çalışmayı tercih ederseniz, bunları bağımsız olarak nasıl içe aktaracağınıza ilişkin sonraki alt bölümlere bakın.

Ölçeklendirme Kutuları

Görüntüyü yukarı veya aşağı ölçeklendirirken, karşılık gelen sınırlayıcı kutu koordinatları uygun şekilde ölçeklendirilebilir. ultralytics.utils.ops.scale_boxes.

import cv2 as cv
import numpy as np
from ultralytics.utils.ops import scale_boxes

image = cv.imread("ultralytics/assets/bus.jpg")
*(h, w), c = image.shape
resized = cv.resize(image, None, (), fx=1.2, fy=1.2)
*(new_h, new_w), _ = resized.shape

xyxy_boxes = np.array(
    [[  22.878,  231.27,  804.98,  756.83,],
    [   48.552,  398.56,  245.35,  902.71,],
    [   669.47,  392.19,  809.72,  877.04,],
    [   221.52,   405.8,  344.98,  857.54,],
    [        0,  550.53,   63.01,  873.44,],
    [   0.0584,  254.46,  32.561,  324.87,]]
)

new_boxes = scale_boxes(
    img1_shape=(h, w),          # original image dimensions
    boxes=xyxy_boxes,           # boxes from original image
    img0_shape=(new_h, new_w),  # resized image dimensions (scale to)
    ratio_pad=None,
    padding=False,
    xywh=False,
)

new_boxes#(1)!
>>> array(
    [[  27.454,  277.52,  965.98,   908.2],
    [   58.262,  478.27,  294.42,  1083.3],
    [   803.36,  470.63,  971.66,  1052.4],
    [   265.82,  486.96,  413.98,    1029],
    [        0,  660.64,  75.612,  1048.1],
    [   0.0701,  305.35,  39.073,  389.84]]
)
  1. Yeni görüntü boyutu için ölçeklendirilmiş sınırlayıcı kutular

Sınırlayıcı Kutu Biçim Dönüşümleri

XYXY → XYWH

Sınırlayıcı kutu koordinatlarını (x1, y1, x2, y2) biçiminden (x, y, genişlik, yükseklik) biçimine dönüştürün; burada (x1, y1) sol üst köşe ve (x2, y2) sağ alt köşedir.

import numpy as np
from ultralytics.utils.ops import xyxy2xywh

xyxy_boxes = np.array(
    [[  22.878,  231.27,  804.98,  756.83,],
    [   48.552,  398.56,  245.35,  902.71,],
    [   669.47,  392.19,  809.72,  877.04,],
    [   221.52,   405.8,  344.98,  857.54,],
    [        0,  550.53,   63.01,  873.44,],
    [   0.0584,  254.46,  32.561,  324.87,]]
)
xywh = xyxy2xywh(xyxy_boxes)

xywh
>>> array(
    [[ 413.93,  494.05,   782.1, 525.56],
    [  146.95,  650.63,   196.8, 504.15],
    [   739.6,  634.62,  140.25, 484.85],
    [  283.25,  631.67,  123.46, 451.74],
    [  31.505,  711.99,   63.01, 322.91],
    [   16.31,  289.67,  32.503,  70.41]]
)

Tüm Sınırlayıcı Kutu Dönüşümleri

from ultralytics.utils.ops import xywh2xyxy
from ultralytics.utils.ops import xywhn2xyxy # normalized → pixel
from ultralytics.utils.ops import xyxy2xywhn # pixel → normalized
from ultralytics.utils.ops import xywh2ltwh  # xywh → top-left corner, w, h
from ultralytics.utils.ops import xyxy2ltwh  # xyxy → top-left corner, w, h
from ultralytics.utils.ops import ltwh2xywh
from ultralytics.utils.ops import ltwh2xyxy

Her işlev için doküman dizinine bakın veya ultralytics.utils.ops referans sayfası her bir işlev hakkında daha fazla bilgi edinmek için.

Çizim

Ek Açıklamalar Çizme

Ultralytics her türlü veriye açıklama eklemek için kullanılabilen bir Annotator sınıfı içerir. Nesne algılama sınırlama kutuları, poz anahtar noktaları ve yönlendirilmiş sınırlama kutuları ile kullanımı en kolay olanıdır.

Yatay Sınırlayıcı Kutular

import cv2 as cv
import numpy as np
from ultralytics.utils.plotting import Annotator, colors

names { #(1)!
     0: "person",
     5: "bus",
    11: "stop sign",
}

image = cv.imread("ultralytics/assets/bus.jpg")
ann = Annotator(
    image,
    line_width=None,  # default auto-size
    font_size=None,   # default auto-size
    font="Arial.ttf", # must be ImageFont compatible
    pil=False,        # use PIL, otherwise uses OpenCV
)

xyxy_boxes = np.array(
    [[ 5,   22.878,  231.27,  804.98,  756.83,], # class-idx x1 y1 x2 y2
     [ 0,   48.552,  398.56,  245.35,  902.71,],
     [ 0,   669.47,  392.19,  809.72,  877.04,],
     [ 0,   221.52,   405.8,  344.98,  857.54,],
     [ 0,        0,  550.53,   63.01,  873.44,],
     [11,   0.0584,  254.46,  32.561,  324.87,]]
)

for nb, box in enumerate(xyxy_boxes):
    c_idx, *box = box
    label = f"{str(nb).zfill(2)}:{names.get(int(c_idx))}"
    ann.box_label(box, label, color=colors(c_idx, bgr=True))

image_with_bboxes = ann.result()
  1. İsimler şuradan kullanılabilir model.names ne zaman tespit sonuçları ile çalışma

Yönlendirilmiş Sınırlayıcı Kutular (OBB)

import cv2 as cv
import numpy as np
from ultralytics.utils.plotting import Annotator, colors

obb_names = {10: "small vehicle"}
obb_image = cv.imread("datasets/dota8/images/train/P1142__1024__0___824.jpg")
obb_boxes = np.array(
    [[ 0, 635, 560, 919, 719, 1087, 420, 803,  261,], # class-idx x1 y1 x2 y2 x3 y2 x4 y4
     [ 0, 331,  19, 493, 260, 776,   70, 613, -171,],
     [ 9, 869, 161, 886, 147, 851,  101, 833,  115,]
    ]
)
ann = Annotator(
    obb_image,
    line_width=None,  # default auto-size
    font_size=None,   # default auto-size
    font="Arial.ttf", # must be ImageFont compatible
    pil=False,        # use PIL, otherwise uses OpenCV
)
for obb in obb_boxes:
    c_idx, *obb = obb
    obb = np.array(obb).reshape(-1, 4, 2).squeeze()
    label = f"{names.get(int(c_idx))}"
    ann.box_label(
        obb,
        label,
        color=colors(c_idx, True),
        rotated=True,
    )

image_with_obb = ann.result()

Bkz. Annotator Referans Sayfası daha fazla bilgi için.

Çeşitli

Kod Profili Oluşturma

Kodun çalışma/işlenme süresini kontrol etmek için with ya da dekoratör olarak.

from ultralytics.utils.ops import Profile

with Profile(device=device) as dt:
    pass  # operation to measure

print(dt)
>>> "Elapsed time is 9.5367431640625e-07 s"

Ultralytics Desteklenen Formatlar

Ultralytics tarafından desteklenen resim veya video türlerinin biçimlerini programlı olarak kullanmak istiyor veya buna ihtiyaç duyuyor musunuz? İhtiyacınız varsa bu sabitleri kullanın.

from ultralytics.data.utils import IMG_FORMATS
from ultralytics.data.utils import VID_FORMATS

print(IMG_FORMATS)
>>> ('bmp', 'dng', 'jpeg', 'jpg', 'mpo', 'png', 'tif', 'tiff', 'webp', 'pfm')

Bölünebilir Yap

En yakın tam sayıyı hesaplar x ile bölündüğünde eşit olarak bölünebilir hale getirmek için y.

from ultralytics.utils.ops import make_divisible

make_divisible(7, 3)
>>> 9
make_divisible(7, 2)
>>> 8


Oluşturuldu 2024-02-20, Güncellendi 2024-05-08
Yazarlar: RizwanMunawar (1), glenn-jocher (3), Burhan-Q (2)

Yorumlar