ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ultralytics YOLOv8
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²?
ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ultralytics YOLOv8 Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΠΎΡΠ½ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² Π²ΠΈΠ΄Π΅ΠΎ ΠΈ ΠΏΠΎΡΠΎΠΊΠ°Ρ Ρ ΠΊΠ°ΠΌΠ΅Ρ. YOLOv8 ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΈ ΡΠΎΡΠ½ΡΠΉ ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π², ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Π°Π½Π°Π»ΠΈΠ· ΡΠΎΠ»ΠΏΡ ΠΈ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ²ΠΎΠΈΠΌ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°ΠΌ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ.
Π‘ΠΌΠΎΡΡΠΈ: ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ultralytics YOLOv8 |
Π‘ΠΌΠΎΡΡΠΈ: ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΠΎ ΠΊΠ»Π°ΡΡΠ°ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ultralytics YOLOv8 |
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²?
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ²: ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΠ΅Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΌΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ ΡΠΎΡΠ½ΡΠΉ ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² Π² ΡΠ°ΠΊΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ , ΠΊΠ°ΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠ°ΡΠ°ΠΌΠΈ.
- ΠΠΎΠ²ΡΡΠ΅Π½Π½Π°Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ: ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ ΡΡΠΎΠ²Π΅Π½Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΡΠ½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΈ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΡΠΎ ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΠ΅Ρ ΠΏΡΠΎΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΡΠ³ΡΠΎΠ·.
- ΠΡΠΈΠ½ΡΡΠΈΠ΅ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ: ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π΄Π°Π΅Ρ ΡΠ΅Π½Π½ΡΠ΅ Π·Π½Π°Π½ΠΈΡ Π΄Π»Ρ ΠΏΡΠΈΠ½ΡΡΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π² ΡΠΎΠ·Π½ΠΈΡΠ½ΠΎΠΉ ΡΠΎΡΠ³ΠΎΠ²Π»Π΅, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΡΡΠ°ΡΠΈΠΊΠΎΠΌ ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π΄ΡΡΠ³ΠΈΡ ΡΡΠ΅ΡΠ°Ρ .
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΌΠΈΡΠ΅
ΠΠΎΠ³ΠΈΡΡΠΈΠΊΠ° | ΠΠΊΠ²Π°ΠΊΡΠ»ΡΡΡΡΠ° |
---|---|
ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ½ΠΎΠΉ Π»Π΅Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ultralytics YOLOv8 | ΠΠΎΠ΄ΡΡΠ΅Ρ ΡΡΠ±Ρ Π² ΠΌΠΎΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ultralytics YOLOv8 |
ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° YOLOv8
import cv2
from ultralytics import YOLO, solutions
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
# Define region points
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
# Init Object Counter
counter = solutions.ObjectCounter(
view_img=True,
reg_pts=region_points,
names=model.names,
draw_tracks=True,
line_thickness=2,
)
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
tracks = model.track(im0, persist=True, show=False)
im0 = counter.start_counting(im0, tracks)
video_writer.write(im0)
cap.release()
video_writer.release()
cv2.destroyAllWindows()
import cv2
from ultralytics import YOLO, solutions
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
# Define region points as a polygon with 5 points
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360), (20, 400)]
# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
# Init Object Counter
counter = solutions.ObjectCounter(
view_img=True,
reg_pts=region_points,
names=model.names,
draw_tracks=True,
line_thickness=2,
)
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
tracks = model.track(im0, persist=True, show=False)
im0 = counter.start_counting(im0, tracks)
video_writer.write(im0)
cap.release()
video_writer.release()
cv2.destroyAllWindows()
import cv2
from ultralytics import YOLO, solutions
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
# Define line points
line_points = [(20, 400), (1080, 400)]
# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
# Init Object Counter
counter = solutions.ObjectCounter(
view_img=True,
reg_pts=line_points,
names=model.names,
draw_tracks=True,
line_thickness=2,
)
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
tracks = model.track(im0, persist=True, show=False)
im0 = counter.start_counting(im0, tracks)
video_writer.write(im0)
cap.release()
video_writer.release()
cv2.destroyAllWindows()
import cv2
from ultralytics import YOLO, solutions
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
line_points = [(20, 400), (1080, 400)] # line or region points
classes_to_count = [0, 2] # person and car classes for count
# Video writer
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
# Init Object Counter
counter = solutions.ObjectCounter(
view_img=True,
reg_pts=line_points,
names=model.names,
draw_tracks=True,
line_thickness=2,
)
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
tracks = model.track(im0, persist=True, show=False, classes=classes_to_count)
im0 = counter.start_counting(im0, tracks)
video_writer.write(im0)
cap.release()
video_writer.release()
cv2.destroyAllWindows()
Π Π΅Π³ΠΈΠΎΠ½ ΠΏΠΎΠ΄Π²ΠΈΠΆΠ΅Π½
Π’Ρ ΠΌΠΎΠΆΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ ΡΠ΅Π³ΠΈΠΎΠ½ Π² Π»ΡΠ±ΡΡ ΡΠΎΡΠΊΡ ΠΊΠ°Π΄ΡΠ°, ΡΠ΅Π»ΠΊΠ½ΡΠ² ΠΏΠΎ Π΅Π³ΠΎ ΠΊΡΠ°ΡΠΌ
ΠΡΠ³ΡΠΌΠ΅Π½Ρ ObjectCounter
ΠΠΎΡ ΡΠ°Π±Π»ΠΈΡΠ° Ρ ObjectCounter
Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ:
ΠΠΌΡ | Π’ΠΈΠΏ | ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
---|---|---|---|
names |
dict |
None |
Π‘Π»ΠΎΠ²Π°ΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠΉ ΠΊΠ»Π°ΡΡΠΎΠ². |
reg_pts |
list |
[(20, 400), (1260, 400)] |
Π‘ΠΏΠΈΡΠΎΠΊ ΡΠΎΡΠ΅ΠΊ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ°. |
line_thickness |
int |
2 |
Π’ΠΎΠ»ΡΠΈΠ½Π° Π»ΠΈΠ½ΠΈΠΉ Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ°ΠΌΠΎΠΊ. |
view_img |
bool |
False |
Π€Π»Π°Π³, ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡΡΠΈΠΉ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π»ΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡΠΎΠΊ. |
view_in_counts |
bool |
True |
Π€Π»Π°Π³, ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠ΅ΠΌ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π»ΠΈ Π² Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡΠΎΠΊΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠΈ in. |
view_out_counts |
bool |
True |
Π€Π»Π°Π³, ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΡΠ΅ΠΌ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π»ΠΈ Π² Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡΠΎΠΊΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠΈ Π°ΡΡΠΎΠ². |
draw_tracks |
bool |
False |
Π€Π»Π°Π³, ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡΡΠΈΠΉ, ΡΠΈΡΠΎΠ²Π°ΡΡ Π»ΠΈ ΡΡΠ΅ΠΊΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². |
ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ model.track
ΠΡΠ³ΡΠΌΠ΅Π½Ρ | Π’ΠΈΠΏ | ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
---|---|---|---|
source |
str |
None |
Specifies the source directory for images or videos. Supports file paths and URLs. |
persist |
bool |
False |
Enables persistent tracking of objects between frames, maintaining IDs across video sequences. |
tracker |
str |
botsort.yaml |
Specifies the tracking algorithm to use, e.g., bytetrack.yaml ΠΈΠ»ΠΈ botsort.yaml . |
conf |
float |
0.3 |
Sets the confidence threshold for detections; lower values allow more objects to be tracked but may include false positives. |
iou |
float |
0.5 |
Sets the Intersection over Union (IoU) threshold for filtering overlapping detections. |
classes |
list |
None |
Filters results by class index. For example, classes=[0, 2, 3] only tracks the specified classes. |
verbose |
bool |
True |
Controls the display of tracking results, providing a visual output of tracked objects. |
ΠΠΠΠ ΠΠ‘Π« Π ΠΠ’ΠΠΠ’Π«
ΠΠ°ΠΊ ΡΡΠΈΡΠ°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² Π²ΠΈΠ΄Π΅ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ultralytics YOLOv8 ?
Π§ΡΠΎΠ±Ρ ΠΏΠΎΡΡΠΈΡΠ°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ultralytics YOLOv8 , Π²ΡΠΏΠΎΠ»Π½ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π³ΠΈ:
- ΠΠΌΠΏΠΎΡΡΠΈΡΡΠΉ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ (
cv2
,ultralytics
). - ΠΠ°Π³ΡΡΠ·ΠΈ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΡΠ΅Π½Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ YOLOv8 .
- ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ½ΠΎΠ³ΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ, Π»ΠΈΠ½ΠΈΡ ΠΈ Ρ.Π΄.).
- ΠΠ°ΡΡΡΠΎΠΉ Π²ΠΈΠ΄Π΅ΠΎΠ·Π°Ρ Π²Π°Ρ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉ ΡΡΠ΅ΡΡΠΈΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
- ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΠΉ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ°Π΄Ρ, ΡΡΠΎΠ±Ρ ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ ΡΠΎΡΡΠΈΡΠ°ΡΡ ΠΈΡ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ.
ΠΠΎΡ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° Π² ΡΠ΅Π³ΠΈΠΎΠ½Π΅:
import cv2
from ultralytics import YOLO, solutions
def count_objects_in_region(video_path, output_video_path, model_path):
"""Count objects in a specific region within a video."""
model = YOLO(model_path)
cap = cv2.VideoCapture(video_path)
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360)]
video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
counter = solutions.ObjectCounter(
view_img=True, reg_pts=region_points, names=model.names, draw_tracks=True, line_thickness=2
)
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
tracks = model.track(im0, persist=True, show=False)
im0 = counter.start_counting(im0, tracks)
video_writer.write(im0)
cap.release()
video_writer.release()
cv2.destroyAllWindows()
count_objects_in_region("path/to/video.mp4", "output_video.avi", "yolov8n.pt")
ΠΠ·ΡΡΠΈ Π±ΠΎΠ»ΡΡΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΈ ΠΎΠΏΡΠΈΠΉ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ " ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ".
Π ΡΠ΅ΠΌ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Ultralytics YOLOv8 Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²?
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Ultralytics YOLOv8 Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π΄Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²:
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ²: ΠΠ½ ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΠ΅Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΌΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ ΡΠΎΡΠ½ΡΠ΅ ΠΏΠΎΠ΄ΡΡΠ΅ΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² Π² ΡΠ°ΠΊΠΈΡ ΠΎΡΡΠ°ΡΠ»ΡΡ , ΠΊΠ°ΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠ°ΡΠ°ΠΌΠΈ.
- ΠΠΎΠ²ΡΡΠ΅Π½Π½Π°Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ: ΠΠ½ ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ ΡΡΠΎΠ²Π΅Π½Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΡ, ΡΠΎΡΠ½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ ΠΈ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π² ΠΏΡΠΎΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΌ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ ΡΠ³ΡΠΎΠ·.
- ΠΡΠΎΠ·Π½Π°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ½ΡΡΠΈΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ: ΠΠ½ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΠ΅Π½Π½ΡΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΡΠΈΠ½ΡΡΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ Π² ΡΠ°ΠΊΠΈΡ ΠΎΠ±Π»Π°ΡΡΡΡ , ΠΊΠ°ΠΊ ΡΠΎΠ·Π½ΠΈΡΠ½Π°Ρ ΡΠΎΡΠ³ΠΎΠ²Π»Ρ, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡΠΎΠΆΠ½ΡΠΌ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
Π ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΠΊΠΎΠ΄Π° ΡΠΈΡΠ°ΠΉ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ " ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ".
ΠΠ°ΠΊ ΠΏΠΎΠ΄ΡΡΠΈΡΠ°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ultralytics YOLOv8 ?
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ultralytics YOLOv8 , ΡΠ΅Π±Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠΈΠ΅ ΡΠ΅Π±Ρ ΠΊΠ»Π°ΡΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Python :
import cv2
from ultralytics import YOLO, solutions
def count_specific_classes(video_path, output_video_path, model_path, classes_to_count):
"""Count specific classes of objects in a video."""
model = YOLO(model_path)
cap = cv2.VideoCapture(video_path)
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
line_points = [(20, 400), (1080, 400)]
video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
counter = solutions.ObjectCounter(
view_img=True, reg_pts=line_points, names=model.names, draw_tracks=True, line_thickness=2
)
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
tracks = model.track(im0, persist=True, show=False, classes=classes_to_count)
im0 = counter.start_counting(im0, tracks)
video_writer.write(im0)
cap.release()
video_writer.release()
cv2.destroyAllWindows()
count_specific_classes("path/to/video.mp4", "output_specific_classes.avi", "yolov8n.pt", [0, 2])
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, classes_to_count=[0, 2]
ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ½ ΡΡΠΈΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΊΠ»Π°ΡΡΠ° 0
ΠΈ 2
(Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ ΠΈ ΠΌΠ°ΡΠΈΠ½Π°).
ΠΠΎΡΠ΅ΠΌΡ Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ YOLOv8 Π²ΠΌΠ΅ΡΡΠΎ Π΄ΡΡΠ³ΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ?
Ultralytics YOLOv8 ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Faster R-CNN, SSD ΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ YOLO :
- Π‘ΠΊΠΎΡΠΎΡΡΡ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ: YOLOv8 ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΡΡΠ΅Π±ΡΡΡΠΈΡ Π²ΡΡΠΎΠΊΠΎΡΠΊΠΎΡΠΎΡΡΠ½ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΎΠ², ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ ΠΈ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠ΅ Π²ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅.
- Π’ΠΎΡΠ½ΠΎΡΡΡ: ΠΠ½Π° ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΎΡΠ½ΠΎΡΡΡ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ ΠΏΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠ½ΠΈΠΆΠ°Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π»ΠΎΠΆΠ½ΡΡ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠΉ ΠΈ ΠΏΠΎΠ²ΡΡΠ°Ρ ΠΎΠ±ΡΡΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ.
- ΠΡΠΎΡΡΠΎΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ: YOLOv8 ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π±Π΅ΡΡΠΎΠ²Π½ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΠΌΠΈ ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°ΠΌΠΈ, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΠΈ edge-ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΡΡΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π»Ρ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ AI-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
- ΠΠΈΠ±ΠΊΠΎΡΡΡ: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅, ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π΄Π»Ρ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ°Π³Π»ΡΠ½ΠΈ Π½Π° Ultralytics YOLOv8 Documentation, ΡΡΠΎΠ±Ρ Π³Π»ΡΠ±ΠΆΠ΅ ΠΏΠΎΠ³ΡΡΠ·ΠΈΡΡΡΡ Π² Π΅Π³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈ ΡΡΠ°Π²Π½ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ.
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ YOLOv8 Π΄Π»Ρ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²ΡΠΎΠ΄Π΅ Π°Π½Π°Π»ΠΈΠ·Π° ΡΠΎΠ»ΠΏΡ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΠ°ΡΠΈΠΊΠΎΠΌ?
ΠΠ°, Ultralytics YOLOv8 ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ Π°Π½Π°Π»ΠΈΠ· ΡΠΎΠ»ΠΏΡ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ°ΡΠΈΠΊΠΎΠΌ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΠΈ ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ. ΠΠ³ΠΎ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Ρ Π²ΡΡΠΎΠΊΠΎΠΉ ΡΠΎΡΠ½ΠΎΡΡΡΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ, ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΈ ΠΊΠ»Π°ΡΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΡΡ ΡΡΠ΅Π΄Π°Ρ . ΠΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ:
- ΠΠ½Π°Π»ΠΈΠ· ΡΠΎΠ»ΠΏΡ: ΠΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠΉ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠΉ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΡΠΊΠΎΠΏΠ»Π΅Π½ΠΈΡΠΌΠΈ Π»ΡΠ΄Π΅ΠΉ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΡ ΠΏΠΎΡΠΎΠΊ ΡΠΎΠ»ΠΏΡ.
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡΠΎΠΆΠ½ΡΠΌ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ: ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΠΉ ΠΈ ΡΡΠΈΡΠ°ΠΉ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»ΠΈ, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠΉ ΡΡ Π΅ΠΌΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠΉ Π·Π°ΡΠΎΡΠ°ΠΌΠΈ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΈ Π΄Π΅ΡΠ°Π»ΡΠΌΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠ°ΠΉΡΡ ΠΊ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Ρ ΠΏΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΌΠΈΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ YOLOv8.