انتقل إلى المحتوى

المرافق البسيطة

رمز مع منظور

ال ultralytics تأتي الحزمة مع عدد لا يحصى من الأدوات المساعدة التي يمكنها دعم سير العمل وتعزيزه وتسريعه. هناك العديد من الأشياء المتاحة ، ولكن إليك بعض الأشياء التي ستكون مفيدة لمعظم المطورين. إنها أيضا نقطة مرجعية رائعة لاستخدامها عند تعلم البرمجة.



شاهد: Ultralytics الأدوات المساعدة | التعليق التلقائي وواجهة برمجة تطبيقات المستكشف وتحويل مجموعة البيانات

بيانات

وضع العلامات / التعليقات التوضيحية التلقائية

Dataset annotation is a very resource intensive and time-consuming process. If you have a YOLO object detection model trained on a reasonable amount of data, you can use it and SAM to auto-annotate additional data (segmentation format).

from ultralytics.data.annotator import auto_annotate

auto_annotate(  # (1)!
    data="path/to/new/data",
    det_model="yolo11n.pt",
    sam_model="mobile_sam.pt",
    device="cuda",
    output_dir="path/to/save_labels",
)
  1. لا شيء يعود من هذه الوظيفة

  2. انظر قسم المراجع ل annotator.auto_annotate لمزيد من التبصر حول كيفية عمل الوظيفة.

  3. استخدم مع دالة segments2boxes لإنشاء مربعات محيطة للكشف عن الكائنات أيضا

تحويل أقنعة التجزئة إلى تنسيق YOLO

أقنعة التجزئة إلى تنسيق YOLO

يُستخدم لتحويل مجموعة بيانات من صور قناع التجزئة إلى YOLO تنسيق التجزئة. تأخذ هذه الدالة الدليل الذي يحتوي على صور قناع التنسيق الثنائي وتحولها إلى تنسيق التجزئة YOLO .

سيتم حفظ الأقنعة المحولة في دليل الإخراج المحدد.

from ultralytics.data.converter import convert_segment_masks_to_yolo_seg

# The classes here is the total classes in the dataset, for COCO dataset we have 80 classes
convert_segment_masks_to_yolo_seg(masks_dir="path/to/masks_dir", output_dir="path/to/output_dir", classes=80)

تحويل COCO إلى YOLO تنسيق

يستخدم لتحويل التعليقات التوضيحية COCO JSON إلى تعليقات مناسبة YOLO تنسيق. بالنسبة لمجموعات بيانات اكتشاف الكائنات (المربع المحيط) ، use_segments و use_keypoints يجب أن يكون كلاهما False

from ultralytics.data.converter import convert_coco

convert_coco(  # (1)!
    "../datasets/coco/annotations/",
    use_segments=False,
    use_keypoints=False,
    cls91to80=True,
)
  1. لا شيء يعود من هذه الوظيفة

للحصول على معلومات إضافية حول convert_coco دالة قم بزيارة الصفحة المرجعية

Get Bounding Box Dimensions

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

model = YOLO('yolo11n.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()))

تحويل المربعات المحيطة إلى شرائح

مع القائمة x y w h بيانات المربع المحيط، قم بالتحويل إلى مقاطع باستخدام الزر yolo_bbox2segment دالة. يجب تنظيم ملفات الصور والتعليقات التوضيحية على النحو التالي:

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. لا شيء يعود من هذه الوظيفة

قم بزيارة yolo_bbox2segment الصفحة المرجعية لمزيد من المعلومات حول الوظيفة.

تحويل المقاطع إلى مربعات محيطة

إذا كانت لديك مجموعة بيانات تستخدم تنسيق مجموعة بيانات التجزئة يمكنك بسهولة تحويلها إلى مربعات محيطة يمين (أو أفقية) (x y w h format) مع هذه الوظيفة.

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

لفهم كيفية عمل هذه الوظيفة ، قم بزيارة الصفحة المرجعية

المرافق

ضغط الصور

يضغط ملف صورة واحد إلى حجم أصغر مع الحفاظ على نسبة العرض إلى الارتفاع وجودته. إذا كانت صورة الإدخال أصغر من الحد الأقصى للبعد، فلن يتم تغيير حجمها.

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. لا شيء يعود من هذه الوظيفة

التقسيم التلقائي لمجموعة البيانات

تقسيم مجموعة البيانات تلقائيا إلى train/val/test ينقسم ويحفظ الانقسامات الناتجة في autosplit_*.txt الملفات. ستستخدم هذه الوظيفة أخذ عينات عشوائية ، والتي لا يتم تضمينها عند استخدام fraction حجة للتدريب.

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. لا شيء يعود من هذه الوظيفة

راجع صفحة المرجع للحصول على تفاصيل إضافية حول هذه الوظيفة.

مضلع المقطع إلى القناع الثنائي

تحويل مضلع واحد (كقائمة) إلى قناع ثنائي بحجم الصورة المحدد. مضلع في شكل [N, 2] مع N حيث أن عدد (x, y) النقاط التي تحدد محيط المضلع.

تحذير

N يجب دائما كن متساويا.

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,
)

المربعات المحيطة

مثيلات المربع المحيط (الأفقي)

لإدارة بيانات المربع المحيط، Bboxes سيساعد الفصل في التحويل بين تنسيق إحداثيات المربع وأبعاد مربع القياس وحساب المناطق وتضمين الإزاحات والمزيد!

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]]
# )

انظر Bboxes قسم المراجع لمزيد من السمات والأساليب المتاحة.

بقشيش

يمكن الوصول إلى العديد من الوظائف التالية (والمزيد) باستخدام Bboxes فصل ولكن إذا كنت تفضل العمل مع الوظائف مباشرة ، فراجع الأقسام الفرعية التالية حول كيفية استيرادها بشكل مستقل.

مربعات التحجيم

عند القياس والصورة لأعلى أو لأسفل، يمكن قياس إحداثيات المربع المحيط المقابلة بشكل مناسب لتتطابق باستخدام 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. المربعات المحيطة التي تم تغيير حجمها لحجم الصورة الجديد

تحويلات تنسيق المربع المحيط

XYXY → XYWH

قم بتحويل إحداثيات المربع المحيط من تنسيق (x1 ، y1 ، x2 ، y2) إلى تنسيق (x ، y ، العرض ، الارتفاع) حيث (x1 ، y1) هي الزاوية العلوية اليسرى و (x2 ، y2) هي الزاوية اليمنى السفلية.

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]]
# )

جميع تحويلات المربع المحيط

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

راجع docstring لكل دالة أو قم بزيارة ultralytics.utils.ops الصفحة المرجعية لقراءة المزيد عن كل وظيفة.

التامر

رسم التعليقات التوضيحية

Ultralytics يتضمن فئة Annotator التي يمكن استخدامها للتعليق على أي نوع من البيانات. من الأسهل استخدامه مع المربعات المحيطة باكتشاف الكائنات ، والنقاط الرئيسية ، والمربعات المحيطة الموجهة.

المربعات المحيطة الأفقية

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. يمكن استخدام الأسماء من model.names متى العمل مع نتائج الكشف

المربعات المحيطة الموجهة (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()

Bounding Boxes Circle Annotation Circle Label

import cv2

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

model = YOLO("yolo11s.pt")
names = model.names
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)
    results = model.predict(im0)
    boxes = results[0].boxes.xyxy.cpu()
    clss = results[0].boxes.cls.cpu().tolist()

    for box, cls in zip(boxes, clss):
        annotator.circle_label(box, label=names[int(cls)])

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

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

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

Bounding Boxes Text Annotation Text Label

import cv2

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

model = YOLO("yolo11s.pt")
names = model.names
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)
    results = model.predict(im0)
    boxes = results[0].boxes.xyxy.cpu()
    clss = results[0].boxes.cls.cpu().tolist()

    for box, cls in zip(boxes, clss):
        annotator.text_label(box, label=names[int(cls)])

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

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

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

انظر Annotator الصفحة المرجعية لمزيد من التبصر.

متنوعه

التنميط رمز

تحقق من مدة تشغيل / معالجة التعليمات البرمجية إما باستخدام with أو كديكور.

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 التنسيقات المدعومة

تريد أو تحتاج إلى استخدام تنسيقات الصور أو أنواع مقاطع الفيديو التي يدعمهاUltralytics برمجيا؟ استخدم هذه الثوابت إذا كنت بحاجة.

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'}

جعل قابلة للقسمة

تحسب أقرب عدد صحيح إلى x لجعلها قابلة للقسمة بالتساوي عند القسمة على y.

from ultralytics.utils.ops import make_divisible

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

الأسئلة المتداولة

What utilities are included in the Ultralytics package to enhance machine learning workflows?

تتضمن الحزمة Ultralytics مجموعة متنوعة من الأدوات المساعدة المصممة لتبسيط وتحسين سير عمل التعلم الآلي. وتتضمن الأدوات المساعدة الرئيسية التعليق التلقائي لتسمية مجموعات البيانات، وتحويل تنسيق COCO إلى YOLO باستخدام convert_coco، وضغط الصور، والتقسيم التلقائي لمجموعة البيانات. تهدف هذه الأدوات إلى تقليل الجهد اليدوي وضمان الاتساق وتعزيز كفاءة معالجة البيانات.

كيف يمكنني استخدام Ultralytics لتسمية مجموعة بياناتي تلقائيًا؟

إذا كان لديك نموذج مُدرّب مسبقًا Ultralytics YOLO للكشف عن الكائنات ، يمكنك استخدامه مع SAM لتعليل مجموعة بياناتك تلقائيًا بتنسيق التجزئة. إليك مثال على ذلك:

from ultralytics.data.annotator import auto_annotate

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

للمزيد من التفاصيل، راجع القسم المرجعي للتدوين التلقائي.

كيف يمكنني تحويل شروح مجموعة بيانات COCO إلى تنسيق YOLO في Ultralytics ؟

لتحويل شروح COCO JSON التوضيحية إلى تنسيق YOLO للكشف عن الكائنات، يمكنك استخدام convert_coco أداة مساعدة. إليك نموذج لمقتطف من التعليمات البرمجية:

from ultralytics.data.converter import convert_coco

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

لمزيد من المعلومات، يرجى زيارة الصفحة المرجعية convert_coco.

ما هو الغرض من مستكشف البيانات YOLO في الحزمة Ultralytics ؟

ال YOLO مستكشف أداة قوية تم تقديمها في 8.1.0 تحديث لتحسين فهم مجموعة البيانات. تتيح لك استخدام الاستعلامات النصية للعثور على مثيلات الكائنات في مجموعة البيانات الخاصة بك، مما يسهل تحليل بياناتك وإدارتها. توفر هذه الأداة رؤى قيّمة حول تكوين مجموعة البيانات وتوزيعها، مما يساعد على تحسين تدريب النموذج وأدائه.

كيف يمكنني تحويل المربعات المحدودة إلى شرائح في Ultralytics ؟

لتحويل بيانات المربع المحدود الحالية (في x y w h ) إلى شرائح، يمكنك استخدام تنسيق yolo_bbox2segment الوظيفة. تأكد من تنظيم ملفاتك مع وجود دلائل منفصلة للصور والملصقات.

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

للمزيد من المعلومات، يرجى زيارة الصفحة المرجعيةyolo_bbox2segment.

📅 Created 9 months ago ✏️ Updated 1 month ago

التعليقات