İç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.

import numpy as np

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!

import numpy as np

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")
print(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,
)

print(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)

print(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 (
    ltwh2xywh,
    ltwh2xyxy,
    xywh2ltwh,  # xywh → top-left corner, w, h
    xywh2xyxy,
    xywhn2xyxy,  # normalized → pixel
    xyxy2ltwh,  # xyxy → top-left corner, w, h
    xyxy2xywhn,  # pixel → normalized
)

for func in (ltwh2xywh, ltwh2xyxy, xywh2ltwh, xywh2xyxy, xywhn2xyxy, xyxy2ltwh, xyxy2xywhn):
    print(help(func))  # print function docstrings

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"{obb_names.get(int(c_idx))}"
    ann.box_label(
        obb,
        label,
        color=colors(c_idx, True),
        rotated=True,
    )

image_with_obb = ann.result()

Sınırlayıcı Kutular Daire Ek Açıklaması(Daire Etiketi)

import cv2

from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")

w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
writer = cv2.VideoWriter("Ultralytics circle annotation.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

while True:
    ret, im0 = cap.read()
    if not ret:
        break

    annotator = Annotator(im0, line_width=2)

    results = model.predict(im0)
    boxes = results[0].boxes.xyxy.cpu()
    clss = results[0].boxes.cls.cpu().tolist()

    for box, cls in zip(boxes, clss):
        x1, y1 = int((box[0] + box[2]) // 2), int((box[1] + box[3]) // 2)
        annotator.circle_label(box, label=model.names[int(cls)], color=colors(int(cls), True))

    writer.write(im0)
    cv2.imshow("Ultralytics circle annotation", im0)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

writer.release()
cap.release()
cv2.destroyAllWindows()

Sınırlayıcı Kutular Metin Açıklaması(Metin Etiketi)

import cv2

from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors

model = YOLO("yolov8s.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")

w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
writer = cv2.VideoWriter("Ultralytics text annotation.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

while True:
    ret, im0 = cap.read()
    if not ret:
        break

    annotator = Annotator(im0, line_width=2)

    results = model.predict(im0)
    boxes = results[0].boxes.xyxy.cpu()
    clss = results[0].boxes.cls.cpu().tolist()

    for box, cls in zip(boxes, clss):
        x1, y1 = int((box[0] + box[2]) // 2), int((box[1] + box[3]) // 2)
        annotator.text_label(box, label=model.names[int(cls)], color=colors(int(cls), True))

    writer.write(im0)
    cv2.imshow("Ultralytics text annotation", im0)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

writer.release()
cap.release()
cv2.destroyAllWindows()

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="cuda:0") 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, VID_FORMATS

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

print(VID_FORMATS)
# {'avi', 'mpg', 'wmv', 'mpeg', 'm4v', 'mov', 'mp4', 'asf', 'mkv', 'ts', 'gif', 'webm'}

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

SSS

Makine öğrenimi iş akışlarını geliştirmek için Ultralytics paketinde hangi yardımcı programlar yer alıyor?

Ultralytics paketi, makine öğrenimi iş akışlarını kolaylaştırmak ve optimize etmek için tasarlanmış çeşitli yardımcı programlar içerir. Temel yardımcı programlar arasında veri kümelerini etiketlemek için otomatik açıklama, convert_coco ile COCO'yu YOLO formatına dönüştürme, görüntüleri sıkıştırma ve veri kümesini otomatik bölme yer alır. Bu araçlar manuel çabayı azaltmayı, tutarlılığı sağlamayı ve veri işleme verimliliğini artırmayı amaçlamaktadır.

Veri kümemi otomatik etiketlemek için Ultralytics adresini nasıl kullanabilirim?

Önceden eğitilmiş bir Ultralytics YOLO nesne algılama modeliniz varsa, bunu SAM modelini kullanarak veri kümenizi segmentasyon biçiminde otomatik olarak tanımlayabilirsiniz. İşte bir örnek:

from ultralytics.data.annotator import auto_annotate

auto_annotate(
    data="path/to/new/data",
    det_model="yolov8n.pt",
    sam_model="mobile_sam.pt",
    device="cuda",
    output_dir="path/to/save_labels",
)

Daha fazla ayrıntı için auto_annotate referans bölümüne bakın.

COCO veri seti ek açıklamalarını Ultralytics adresinde YOLO formatına nasıl dönüştürebilirim?

COCO JSON ek açıklamalarını nesne algılama amacıyla YOLO biçimine dönüştürmek için convert_coco yardımcı program. İşte örnek bir kod parçacığı:

from ultralytics.data.converter import convert_coco

convert_coco(
    "../datasets/coco/annotations/",
    use_segments=False,
    use_keypoints=False,
    cls91to80=True,
)

Daha fazla bilgi için convert_coco referans sayfasını ziyaret edin.

Ultralytics paketindeki YOLO Veri Gezgini'nin amacı nedir?

Bu YOLO Kaşif 'de tanıtılan güçlü bir araçtır. 8.1.0 veri kümesi anlayışını geliştirmek için güncelleyin. Veri kümenizdeki nesne örneklerini bulmak için metin sorguları kullanmanıza olanak tanıyarak verilerinizi analiz etmenizi ve yönetmenizi kolaylaştırır. Bu araç, veri kümesi kompozisyonu ve dağılımı hakkında değerli bilgiler sağlayarak model eğitimini ve performansını iyileştirmeye yardımcı olur.

Sınırlayıcı kutuları Ultralytics adresinde segmentlere nasıl dönüştürebilirim?

Mevcut sınırlayıcı kutu verilerini dönüştürmek için (içinde x y w h biçiminde) segmentlere dönüştürmek için yolo_bbox2segment işlev. Dosyalarınızın resimler ve etiketler için ayrı dizinlerle düzenlendiğinden emin olun.

from ultralytics.data.converter import yolo_bbox2segment

yolo_bbox2segment(
    im_dir="path/to/images",
    save_dir=None,  # saved to "labels-segment" in the images directory
    sam_model="sam_b.pt",
)

Daha fazla bilgi için yolo_bbox2segment referans sayfasını ziyaret edin.



Oluşturma 2024-02-20, Güncelleme 2024-07-04
Yazarlar: glenn-jocher (9), ambitious-octopus (1), IvorZhu331 (1), RizwanMunawar (1), Burhan-Q (2)

Yorumlar