المرافق البسيطة
ال ultralytics
تأتي الحزمة مع عدد لا يحصى من الأدوات المساعدة التي يمكنها دعم سير العمل وتعزيزه وتسريعه. هناك العديد من الأشياء المتاحة ، ولكن إليك بعض الأشياء التي ستكون مفيدة لمعظم المطورين. إنها أيضا نقطة مرجعية رائعة لاستخدامها عند تعلم البرمجة.
شاهد: Ultralytics الأدوات المساعدة | التعليق التلقائي وواجهة برمجة تطبيقات المستكشف وتحويل مجموعة البيانات
بيانات
YOLO مستكشف البيانات
YOLO مستكشف تمت إضافته في 8.1.0
تحديث الذكرى السنوية وهي أداة قوية يمكنك استخدامها لفهم مجموعة البيانات الخاصة بك بشكل أفضل. واحدة من الوظائف الرئيسية التي YOLO يوفر Explorer ، القدرة على استخدام الاستعلامات النصية للعثور على مثيلات الكائن في مجموعة البيانات الخاصة بك.
وضع العلامات / التعليقات التوضيحية التلقائية
التعليقات التوضيحية لمجموعة البيانات هي عملية كثيفة الاستخدام للموارد وتستغرق وقتا طويلا. إذا كان لديك YOLO نموذج الكشف عن الكائنات المدربين على كمية معقولة من البيانات ، يمكنك استخدامه و SAM لإضافة تعليقات توضيحية تلقائية إلى بيانات إضافية (تنسيق التجزئة).
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",
)
-
لا شيء يعود من هذه الوظيفة
-
انظر قسم المراجع ل
annotator.auto_annotate
لمزيد من التبصر حول كيفية عمل الوظيفة. -
استخدم مع دالة
segments2boxes
لإنشاء مربعات محيطة للكشف عن الكائنات أيضا
تحويل 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,
)
- لا شيء يعود من هذه الوظيفة
للحصول على معلومات إضافية حول convert_coco
دالة قم بزيارة الصفحة المرجعية
احصل على أبعاد المربع المحيط
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()))
تحويل المربعات المحيطة إلى شرائح
مع القائمة 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"
)
- لا شيء يعود من هذه الوظيفة
قم بزيارة yolo_bbox2segment
الصفحة المرجعية لمزيد من المعلومات حول الوظيفة.
تحويل المقاطع إلى مربعات محيطة
إذا كانت لديك مجموعة بيانات تستخدم تنسيق مجموعة بيانات التجزئة يمكنك بسهولة تحويلها إلى مربعات محيطة يمين (أو أفقية) (x y w h
format) مع هذه الوظيفة.
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)!
- لا شيء يعود من هذه الوظيفة
التقسيم التلقائي لمجموعة البيانات
تقسيم مجموعة البيانات تلقائيا إلى 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
)
- لا شيء يعود من هذه الوظيفة
راجع صفحة المرجع للحصول على تفاصيل إضافية حول هذه الوظيفة.
مضلع المقطع إلى القناع الثنائي
تحويل مضلع واحد (كقائمة) إلى قناع ثنائي بحجم الصورة المحدد. مضلع في شكل [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
سيساعد الفصل في التحويل بين تنسيق إحداثيات المربع وأبعاد مربع القياس وحساب المناطق وتضمين الإزاحات والمزيد!
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]]
)
انظر 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,
)
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]]
)
- المربعات المحيطة التي تم تغيير حجمها لحجم الصورة الجديد
تحويلات تنسيق المربع المحيط
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)
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 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
راجع 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()
- يمكن استخدام الأسماء من
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"{names.get(int(c_idx))}"
ann.box_label(
obb,
label,
color=colors(c_idx, True),
rotated=True,
)
image_with_obb = ann.result()
انظر Annotator
الصفحة المرجعية لمزيد من التبصر.
متنوعه
التنميط رمز
تحقق من مدة تشغيل / معالجة التعليمات البرمجية إما باستخدام with
أو كديكور.
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 التنسيقات المدعومة
تريد أو تحتاج إلى استخدام تنسيقات الصور أو أنواع مقاطع الفيديو التي يدعمهاUltralytics برمجيا؟ استخدم هذه الثوابت إذا كنت بحاجة.
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')
جعل قابلة للقسمة
تحسب أقرب عدد صحيح إلى x
لجعلها قابلة للقسمة بالتساوي عند القسمة على y
.
from ultralytics.utils.ops import make_divisible
make_divisible(7, 3)
>>> 9
make_divisible(7, 2)
>>> 8
تم الإنشاء 2024-02-20، تم التحديث 2024-05-08
المؤلفون: RizwanMunawar (1)، Glenn-jocher (3)، Burhan-Q (2)