أدوات مساعدة بسيطة#
توفر الحزمة ultralytics مجموعة متنوعة من الأدوات المساعدة لدعم سير عملك وتحسينه وتسريعه. ورغم توفر العديد من الأدوات الأخرى، يسلط هذا الدليل الضوء على بعض الأدوات الأكثر فائدة للمطورين، ليكون مرجعًا عمليًا للبرمجة باستخدام أدوات Ultralytics.
شاهد: أدوات Ultralytics المساعدة | التعليق التوضيحي التلقائي وExplorer API وتحويل مجموعات البيانات
البيانات#
وضع التسميات التلقائي / التعليقات التوضيحية#
تُعد التعليقات التوضيحية لمجموعة البيانات عملية كثيفة الموارد وتستغرق وقتًا طويلًا. إذا كان لديك نموذج Ultralytics YOLO لكشف الكائنات مدرّب على كمية معقولة من البيانات، فيمكنك استخدامه مع SAM لإضافة تعليقات توضيحية تلقائيًا إلى بيانات إضافية بتنسيق التجزئة.
from ultralytics.data.annotator import auto_annotate
auto_annotate(
data="path/to/new/data",
det_model="yolo26n.pt",
sam_model="mobile_sam.pt",
device="cuda",
output_dir="path/to/save_labels",
)لا تُرجع هذه الدالة أي قيمة. لمزيد من التفاصيل:
- اطّلع على قسم المرجع الخاص بـ
annotator.auto_annotateلمعرفة المزيد عن آلية عمل الدالة. - استخدمها مع الدالة
segments2boxesلإنشاء مربعات إحاطة لكشف الكائنات أيضًا.
تصوير التعليقات التوضيحية لمجموعة البيانات#
تصوّر هذه الدالة تعليقات YOLO التوضيحية على صورة قبل التدريب، مما يساعد على تحديد أي تعليقات توضيحية خاطئة وتصحيحها، إذ قد تؤدي إلى نتائج كشف غير صحيحة. وترسم مربعات الإحاطة، وتضع تسميات للكائنات بأسماء الفئات، وتعدّل لون النص استنادًا إلى سطوع الخلفية لتحسين سهولة القراءة.
from ultralytics.data.utils import visualize_image_annotations
label_map = { # عرّف خريطة التسميات التي تضم جميع تسميات الفئات المشروحة.
0: "person",
1: "car",
}
# Visualize
visualize_image_annotations(
"path/to/image.jpg", # مسار صورة الإدخال.
"path/to/annotations.txt", # مسار ملف التعليقات التوضيحية للصورة.
label_map,
)تحويل أقنعة التجزئة إلى تنسيق YOLO#

استخدم هذا لتحويل مجموعة بيانات من صور أقنعة التجزئة إلى تنسيق التجزئة الخاص بـ Ultralytics YOLO. تأخذ هذه الدالة المجلد الذي يحتوي على صور الأقنعة بالتنسيق الثنائي وتحولها إلى تنسيق تجزئة YOLO.
ستُحفظ الأقنعة المحوّلة في مجلد الإخراج المحدد.
from ultralytics.data.converter import convert_segment_masks_to_yolo_seg
# `classes` هو العدد الإجمالي للفئات في مجموعة البيانات.
# تضم مجموعة بيانات COCO 80 فئة.
convert_segment_masks_to_yolo_seg(masks_dir="path/to/masks_dir", output_dir="path/to/output_dir", classes=80)تحويل COCO إلى تنسيق YOLO#
استخدم هذا لتحويل التعليقات التوضيحية بصيغة JSON من COCO إلى تنسيق YOLO. بالنسبة إلى مجموعات بيانات كشف الكائنات (مربعات الإحاطة)، عيّن كلاً من use_segments وuse_keypoints إلى False.
from ultralytics.data.converter import convert_coco
convert_coco(
"coco/annotations/",
use_segments=False,
use_keypoints=False,
cls91to80=True,
)لمزيد من المعلومات عن الدالة convert_coco، زُر صفحة المرجع.
الحصول على أبعاد مربع الإحاطة#
import cv2
from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator
model = YOLO("yolo26n.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(f"Bounding Box Width {width.item()}, Height {height.item()}, Area {area.item()}")تحويل مربعات الإحاطة إلى مقاطع#
باستخدام بيانات مربعات الإحاطة الحالية x y w h، حوّلها إلى مقاطع باستخدام الدالة yolo_bbox2segment. نظّم ملفات الصور والتعليقات التوضيحية كما يلي:
data
|__ images
├─ 001.jpg
├─ 002.jpg
├─ ..
└─ NNN.jpg
|__ labels
├─ 001.txt
├─ 002.txt
├─ ..
└─ NNN.txtfrom ultralytics.data.converter import yolo_bbox2segment
yolo_bbox2segment(
im_dir="path/to/images",
save_dir=None, # محفوظ في "labels-segment" بجوار مجلد الصور
sam_model="sam_b.pt",
)زُر صفحة المرجع الخاصة بـ yolo_bbox2segment لمزيد من المعلومات عن الدالة.
تحويل المقاطع إلى مربعات إحاطة#
إذا كانت لديك مجموعة بيانات تستخدم تنسيق مجموعة بيانات التجزئة، فيمكنك بسهولة تحويلها إلى مربعات إحاطة قائمة (أو أفقية) بتنسيق x y w h باستخدام هذه الدالة.
import numpy as np
from ultralytics.utils.ops import segments2boxes
segments = np.array(
[
[805, 392, 797, 400, 812, 402, 808, 714, 808, 392],
[115, 398, 113, 400, 150, 410, 150, 400, 149, 298],
[267, 412, 265, 413, 300, 420, 300, 413, 299, 412],
],
dtype=np.float32,
)
segments2boxes([s.reshape(-1, 2) for s in segments])
# >>> array([[804.5, 553. , 15. , 322. ],
# [131.5, 354. , 37. , 112. ],
# [282.5, 416. , 35. , 8. ]],
# dtype=float32) # مربعات إحاطة xywhلفهم آلية عمل هذه الدالة، زُر صفحة المرجع.
أدوات مساعدة#
ضغط الصور#
اضغط ملف صورة واحدًا لتقليل حجمه مع الحفاظ على نسبة العرض إلى الارتفاع والجودة. إذا كان حجم صورة الإدخال أصغر من الحد الأقصى للأبعاد، فلن يُعاد تغيير حجمها.
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)تقسيم مجموعة البيانات تلقائيًا#
قسّم مجموعة البيانات تلقائيًا إلى أقسام train/val/test واحفظ الأقسام الناتجة في ملفات autosplit_*.txt. تنشئ هذه الأداة ملفات تقسيم دائمة؛ أما وسيطة التدريب fraction فتختار مجموعة فرعية قابلة لإعادة الإنتاج لعملية تشغيل.
from ultralytics.data.split import autosplit
autosplit(
path="path/to/images",
weights=(0.9, 0.1, 0.0), # (التدريب، والتحقق، والاختبار) تقسيمات نسبية
annotated_only=False, # قسّم الصور التي لها ملف تعليقات توضيحية فقط عند تعيين القيمة True
)راجع صفحة المرجع للحصول على تفاصيل إضافية عن هذه الدالة.
تحويل مضلع المقطع إلى قناع ثنائي#
حوّل مضلعًا واحدًا (على هيئة قائمة) إلى قناع ثنائي بحجم الصورة المحدد. ينبغي أن يكون المضلع مصفوفة مسطحة أحادية البعد من إحداثيات 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]) # (N,) إحداثيات x وy مسطحة
mask = polygon2mask(
imgsz, # tuple
[polygon], # الإدخال على هيئة قائمة
color=255, # ثنائي 8 بت
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), # أبعاد الصورة الأصلية
boxes=xyxy_boxes, # المربعات من الصورة الأصلية
img0_shape=(new_h, new_w), # أبعاد الصورة بعد تغيير حجمها (التحجيم إلى)
ratio_pad=None,
padding=False,
xywh=False,
)
print(new_boxes)
# >>> 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)
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 ← الزاوية العلوية اليسرى، w، h
xywh2xyxy,
xywhn2xyxy, # مطبّع ← بكسل
xyxy2ltwh, # xyxy ← الزاوية العلوية اليسرى، w، h
xyxy2xywhn, # بكسل ← مطبّع
)
for func in (ltwh2xywh, ltwh2xyxy, xywh2ltwh, xywh2xyxy, xywhn2xyxy, xyxy2ltwh, xyxy2xywhn):
print(help(func)) # طباعة سلاسل توثيق الدوالراجع سلسلة التوثيق لكل دالة، أو زُر ultralytics.utils.ops صفحة المرجع لمزيد من القراءة.
الرسم#
أدوات التعليقات التوضيحية#
تتضمن Ultralytics الفئة Annotator لإضافة تعليقات توضيحية إلى أنواع مختلفة من البيانات. ويُفضّل استخدامها مع مربعات إحاطة كشف الكائنات والنقاط المفتاحية للوضعيات ومربعات الإحاطة الموجّهة.
التعليقات التوضيحية للمربعات#
import cv2 as cv
import numpy as np
from ultralytics.utils.plotting import Annotator, colors
names = {
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 عند العمل مع نتائج الكشف. راجع أيضًا صفحة المرجع الخاصة بـ Annotator لمزيد من المعلومات.
التعليقات التوضيحية للمسح في Ultralytics#
import sys
import cv2
import numpy as np
from ultralytics import YOLO
from ultralytics.solutions.solutions import SolutionAnnotator
from ultralytics.utils.plotting import colors
# User defined video path and model file
cap = cv2.VideoCapture("path/to/video.mp4")
model = YOLO(model="yolo26s-seg.pt") # Model file, e.g., yolo26s.pt or yolo26m-seg.pt
if not cap.isOpened():
print("Error: Could not open video.")
sys.exit()
# Initialize the video writer object.
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
video_writer = cv2.VideoWriter("ultralytics.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
masks = None # Initialize variable to store masks data
f = 0 # Initialize frame count variable for enabling mouse event.
line_x = w # Store width of line.
dragging = False # Initialize bool variable for line dragging.
classes = model.names # Store model classes names for plotting.
window_name = "Ultralytics Sweep Annotator"
def drag_line(event, x, _, flags, param):
"""Mouse callback function to enable dragging a vertical sweep line across the video frame."""
global line_x, dragging
if event == cv2.EVENT_LBUTTONDOWN or (flags & cv2.EVENT_FLAG_LBUTTON):
line_x = max(0, min(x, w))
dragging = True
while cap.isOpened(): # Loop over the video capture object.
ret, im0 = cap.read()
if not ret:
break
f = f + 1 # Increment frame count.
count = 0 # Re-initialize count variable on every frame for precise counts.
results = model.track(im0, persist=True)[0]
if f == 1:
cv2.namedWindow(window_name)
cv2.setMouseCallback(window_name, drag_line)
annotator = SolutionAnnotator(im0)
if results.boxes.is_track:
if results.masks is not None:
masks = [np.array(m, dtype=np.int32) for m in results.masks.xy]
boxes = results.boxes.xyxy.tolist()
track_ids = results.boxes.id.int().cpu().tolist()
clss = results.boxes.cls.cpu().tolist()
for mask, box, cls, t_id in zip(masks or [None] * len(boxes), boxes, clss, track_ids):
color = colors(t_id, True) # Assign different color to each tracked object.
label = f"{classes[cls]}:{t_id}"
if mask is not None and mask.size > 0:
if box[0] > line_x:
count += 1
cv2.polylines(im0, [mask], True, color, 2)
x, y = mask.min(axis=0)
(w_m, _), _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)
cv2.rectangle(im0, (x, y - 20), (x + w_m, y), color, -1)
cv2.putText(im0, label, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
else:
if box[0] > line_x:
count += 1
annotator.box_label(box=box, color=color, label=label)
# Generate draggable sweep line
annotator.sweep_annotator(line_x=line_x, line_y=h, label=f"COUNT:{count}")
cv2.imshow(window_name, im0)
video_writer.write(im0)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
# Release the resources
cap.release()
video_writer.release()
cv2.destroyAllWindows()اعثر على مزيد من التفاصيل عن الطريقة sweep_annotator في قسم المرجع لدينا هنا.
التعليقات التوضيحية للتسميات التكيفية#
ترسم SolutionAnnotator.adaptive_label تسميةً يُختار شكلها باستخدام الوسيطة shape (وهي تحل محل الطريقتين الأقدم circle_label وtext_label):
- مستطيل:
annotator.adaptive_label(box, label=names[int(cls)], color=colors(cls, True), shape="rect") - دائرة:
annotator.adaptive_label(box, label=names[int(cls)], color=colors(cls, True), shape="circle")
شاهد: دليل متعمق للتعليقات التوضيحية النصية والدائرية مع عروض توضيحية مباشرة بـ Python | التعليقات التوضيحية في Ultralytics 🚀
import cv2
from ultralytics import YOLO
from ultralytics.solutions.solutions import SolutionAnnotator
from ultralytics.utils.plotting import colors
model = YOLO("yolo26s.pt")
names = model.names
cap = cv2.VideoCapture("path/to/video.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 = SolutionAnnotator(im0)
results = model.predict(im0)[0]
boxes = results.boxes.xyxy.cpu()
clss = results.boxes.cls.cpu().tolist()
for box, cls in zip(boxes, clss):
annotator.adaptive_label(box, label=names[int(cls)], color=colors(cls, True), shape="circle")
writer.write(im0)
cv2.imshow("Ultralytics circle annotation", im0)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
writer.release()
cap.release()
cv2.destroyAllWindows()راجع الصفحة المرجعية لـ SolutionAnnotator لمزيد من المعلومات.
متفرقات#
تحليل أداء التعليمات البرمجية#
تحقّق من المدة التي يستغرقها تشغيل التعليمات البرمجية أو معالجتها، إما باستخدام with أو بوصفها مزخرفًا.
from ultralytics.utils.ops import Profile
with Profile(device="cuda:0") as dt:
pass # عملية للقياس
print(dt)
# >>> "Elapsed time is 9.5367431640625e-07 s"التنسيقات التي تدعمها Ultralytics#
هل تحتاج إلى استخدام تنسيقات الصور أو الفيديو التي تدعمها Ultralytics برمجيًا؟ استخدم هذه الثوابت عند الحاجة:
from ultralytics.data.utils import IMG_FORMATS, VID_FORMATS
print(IMG_FORMATS)
# {'avif', 'bmp', 'dng', 'heic', 'heif', 'jp2', 'jpeg', 'jpg', 'mpo', 'png', 'tif', 'tiff', 'webp'}
print(VID_FORMATS)
# {'asf', 'avi', 'gif', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'ts', 'wmv', 'webm'}التقريب إلى أقرب مضاعف#
احسب أصغر عدد صحيح أكبر من x أو مساوٍ له، ويقبل القسمة بالتساوي على y.
from ultralytics.utils.ops import make_divisible
make_divisible(7, 3)
# >>> 9
make_divisible(7, 2)
# >>> 8الأسئلة الشائعة#
تتضمن حزمة Ultralytics أدوات مساعدة مصممة لتبسيط سير عمل تعلّم الآلة وتحسينه. تشمل الأدوات الرئيسية التوسيم التلقائي لوسم مجموعات البيانات، وتحويل COCO إلى تنسيق YOLO باستخدام convert_coco، وضغط الصور، والتقسيم التلقائي لمجموعات البيانات. تقلل هذه الأدوات الجهد اليدوي، وتضمن الاتساق، وتعزز كفاءة معالجة البيانات.
إذا كان لديك نموذج Ultralytics YOLO مُدرّب مسبقًا لكشف الكائنات، فيمكنك استخدامه مع نموذج SAM لإضافة تعليقات توضيحية تلقائيًا إلى مجموعة بياناتك بتنسيق التقسيم. إليك مثالًا:
from ultralytics.data.annotator import auto_annotate auto_annotate( data="path/to/new/data", det_model="yolo26n.pt", sam_model="mobile_sam.pt", device="cuda", output_dir="path/to/save_labels", )لمزيد من التفاصيل، راجع قسم مرجع auto_annotate، أو استخدم منصة Ultralytics بديلًا مستضافًا لا يتطلب كتابة التعليمات البرمجية، مع إنشاء الأقنعة بالنقر عبر SAM 2.1 أو SAM 3 أو SAM 3.1، أو استخدام تنبؤات نماذج YOLO المدربة مسبقًا والمضبوطة بدقة لمهام الكشف والتقسيم وOBB.
لتحويل تعليقات COCO التوضيحية بتنسيق JSON إلى تنسيق YOLO لكشف الكائنات، يمكنك استخدام الأداة المساعدة
convert_coco. إليك مقتطفًا برمجيًا نموذجيًا:from ultralytics.data.converter import convert_coco convert_coco( "coco/annotations/", use_segments=False, use_keypoints=False, cls91to80=True, )لمزيد من المعلومات، تفضل بزيارة الصفحة المرجعية لـ convert_coco.
توفر منصة Ultralytics تحليلات تلقائية لمجموعات البيانات: تعرض علامة التبويب
Chartsتوزيع التقسيمات، وأعداد الفئات الأكثر شيوعًا، ومخططات مدرج تكراري لأبعاد الصور، وخرائط حرارية ثنائية الأبعاد لمواضع التعليقات التوضيحية، ما يساعدك على اكتشاف الاختلالات والقيم الشاذة قبل التدريب.لتحويل بيانات الصناديق المحيطة الحالية (بتنسيق
x y w h) إلى مقاطع، يمكنك استخدام الدالةyolo_bbox2segment. تأكد من تنظيم ملفاتك في مجلدات منفصلة للصور والتسميات.from ultralytics.data.converter import yolo_bbox2segment yolo_bbox2segment( im_dir="path/to/images", save_dir=None, # محفوظ في "labels-segment" بجوار مجلد الصور sam_model="sam_b.pt", )لمزيد من المعلومات، تفضل بزيارة الصفحة المرجعية لـ yolo_bbox2segment.