ΠΡΠΎΡΡΡΠ΅ ΡΡΠΈΠ»ΠΈΡΡ
Π‘Π°ΠΉΡ ultralytics
ΠΠ°ΠΊΠ΅Ρ ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΡΠΈΠ»ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°ΡΡ, ΡΠ»ΡΡΡΠΈΡΡ ΠΈ ΡΡΠΊΠΎΡΠΈΡΡ Π²Π°ΡΠΈ ΡΠ°Π±ΠΎΡΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΡΡΠ³ΠΈΡ
, Π½ΠΎ Π²ΠΎΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½ΠΈΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ². ΠΠ½ΠΈ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΠΎΡΠ»ΠΈΡΠ½ΡΠΌ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠΌ ΠΏΡΠΈ ΠΈΠ·ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
Π‘ΠΌΠΎΡΡΠ΅ΡΡ: Ultralytics Π£ΡΠΈΠ»ΠΈΡΡ | ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ, API ΠΏΡΠΎΠ²ΠΎΠ΄Π½ΠΈΠΊΠ° ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡΠΎΠ² Π΄Π°Π½Π½ΡΡ
ΠΠ°Π½Π½ΡΠ΅
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²ΠΊΠ° / Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ
ΠΠ½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Π΄Π°Π½Π½ΡΡ - ΠΎΡΠ΅Π½Ρ ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΈΠΉ ΠΈ ΡΡΡΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΌΠΎΠ΄Π΅Π»ΡΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² 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",
)
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠ°Π±ΠΎΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ:
- Π‘ΠΌ. ΡΠΏΡΠ°Π²ΠΎΡΠ½ΡΠΉ ΡΠ°Π·Π΄Π΅Π» Π΄Π»Ρ
annotator.auto_annotate
Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠ°Π±ΠΎΡΠ΅ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. - ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π² ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ ΡΡΠ½ΠΊΡΠΈΡ
segments2boxes
Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΠΈΡ ΡΠ°ΠΌΠΎΠΊ Π΄Π»Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅
ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ ΠΊ Π½Π°Π±ΠΎΡΡ Π΄Π°Π½Π½ΡΡ
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ YOLO Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΈ ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΠΌΠΎΠ³Π°Ρ Π²ΡΡΠ²ΠΈΡΡ ΠΈ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Π»ΡΠ±ΡΠ΅ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π½Π΅Π²Π΅ΡΠ½ΡΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ. ΠΠ½Π° ΡΠΈΡΡΠ΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΌΠΊΠΈ, ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΡΠ΅Ρ ΡΠ²Π΅Ρ ΡΠ΅ΠΊΡΡΠ° Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠΊΠΎΡΡΠΈ ΡΠΎΠ½Π° Π΄Π»Ρ Π»ΡΡΡΠ΅ΠΉ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΠΈ.
from ultralytics.data.utils import visualize_image_annotations
label_map = { # Define the label map with all annotated class labels.
0: "person",
1: "car",
}
# Visualize
visualize_image_annotations(
"path/to/image.jpg", # Input image path.
"path/to/annotations.txt", # Annotation file path for the image.
label_map,
)
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΠΎΠΊ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π² ΡΠΎΡΠΌΠ°Ρ 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 . ΠΠ»Ρ Π½Π°Π±ΠΎΡΠΎΠ² Π΄Π°Π½Π½ΡΡ
ΠΏΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (bounding box), 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('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",
)
- ΠΠ· ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ
ΠΠΎΡΠ΅ΡΠΈΡΠ΅ yolo_bbox2segment
ΡΠΏΡΠ°Π²ΠΎΡΠ½Π°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ± ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΌΠΊΠΈ
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ
, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΡΠΌΠ°Ρ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ
ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»Π΅Π³ΠΊΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΈΡ
Π² ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΌΠΊΠΈ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π²Π²Π΅ΡΡ
-Π²ΠΏΡΠ°Π²ΠΎ (ΠΈΠ»ΠΈ ΠΏΠΎ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΠΈ) (x y w h
ΡΠΎΡΠΌΠ°Ρ) Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ.
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)!
- ΠΠ· ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ
Π½Π° 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
ΠΠ»Π°ΡΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΡΠΎΡΠΌΠ°Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ Π±ΠΎΠΊΡΠ°, ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡ Π±ΠΎΠΊΡΠ°, Π²ΡΡΠΈΡΠ»ΡΡΡ ΠΏΠ»ΠΎΡΠ°Π΄ΠΈ, Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅!
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]]
# )
- ΠΡΠ°Π½ΠΈΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ, ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΡΠΌΠ°ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°ΠΌΠΊΠΈ
XYXY β XYWH
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠΉΡΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°ΠΌΠΊΠΈ ΠΈΠ· ΡΠΎΡΠΌΠ°ΡΠ° (x1, y1, x2, y2) Π² ΡΠΎΡΠΌΠ°Ρ (x, y, width, height), Π³Π΄Π΅ (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, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π»ΡΠ±ΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠ΅Π³ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΡΠ°ΠΌΠΊΠ°ΠΌΠΈ Π΄Π»Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΊΠ»ΡΡΠ΅Π²ΡΠΌΠΈ ΡΠΎΡΠΊΠ°ΠΌΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΡΠ°ΠΌΠΊΠ°ΠΌΠΈ.
Ultralytics ΠΠ½Π½ΠΎΡΠ°ΡΠΈΡ
Python ΠΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ YOLO11 π.
import cv2
from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors
# User defined video path and model file
cap = cv2.VideoCapture("Path/to/video/file.mp4")
model = YOLO(model="yolo11s-seg.pt") # Model file i.e. yolo11s.pt or yolo11m-seg.pt
if not cap.isOpened():
print("Error: Could not open video.")
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, y, flags, param): # Mouse callback for dragging line.
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.
annotator = Annotator(im0)
results = model.track(im0, persist=True) # Track objects using track method.
if f == 1:
cv2.namedWindow(window_name)
cv2.setMouseCallback(window_name, drag_line)
if results[0].boxes.id is not None:
if results[0].masks is not None:
masks = results[0].masks.xy
track_ids = results[0].boxes.id.int().cpu().tolist()
clss = results[0].boxes.cls.cpu().tolist()
boxes = results[0].boxes.xyxy.cpu()
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.
if mask is not None and mask.size > 0:
# If you want to overlay the masks
# mask[:, 0] = np.clip(mask[:, 0], line_x, w)
# mask_img = cv2.fillPoly(im0.copy(), [mask.astype(int)], color)
# cv2.addWeighted(mask_img, 0.5, im0, 0.5, 0, im0)
if box[0] > line_x:
count += 1
annotator.seg_bbox(mask=mask, mask_color=color, label=str(classes[cls]))
else:
if box[0] > line_x:
count += 1
annotator.box_label(box=box, color=color, label=str(classes[cls]))
annotator.sweep_annotator(line_x=line_x, line_y=h, label=f"COUNT:{count}") # Display the sweep
cv2.imshow(window_name, im0)
video_writer.write(im0)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release() # Release the video capture.
video_writer.release() # Release the video writer.
cv2.destroyAllWindows() # Destroy all opened windows.
ΠΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΌΠΊΠΈ
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"{obb_names.get(int(c_idx))}"
ann.box_label(
obb,
label,
color=colors(c_idx, True),
rotated=True,
)
image_with_obb = ann.result()
ΠΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΌΠΊΠΈ ΠΡΡΠ³ΠΎΠ²Π°Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ ΠΡΡΠ³ΠΎΠ²Π°Ρ ΠΌΠ΅ΡΠΊΠ°
Π‘ΠΌΠΎΡΡΠ΅ΡΡ: ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ ΠΈ ΠΊΡΡΠ³ΠΎΠ²ΡΠΌ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡΠΌ Ρ ΠΆΠΈΠ²ΡΠΌΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡΠΌΠΈ Python | Ultralytics ΠΠ½Π½ΠΎΡΠ°ΡΠΈΠΈ π.
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()
ΠΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΌΠΊΠΈ Π’Π΅ΠΊΡΡΠΎΠ²Π°Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Π’Π΅ΠΊΡΡΠΎΠ²Π°Ρ ΠΌΠ΅ΡΠΊΠ°
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
Π§ΠΠ‘Π’Π ΠΠΠΠΠΠΠΠΠ«Π ΠΠΠΠ ΠΠ‘Π«
ΠΠ°ΠΊΠΈΠ΅ ΡΡΠΈΠ»ΠΈΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² ΠΏΠ°ΠΊΠ΅Ρ Ultralytics Π΄Π»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ?
ΠΠ°ΠΊΠ΅Ρ 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",
)
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠΌΡ ΡΠ°Π·Π΄Π΅Π»Ρ auto_annotate.
ΠΠ°ΠΊ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ Π½Π°Π±ΠΎΡΠΎΠ² Π΄Π°Π½Π½ΡΡ 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 Data Explorer Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ 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.