λ€μμ μ¬μ©νμ¬ κ°μ²΄ μ κ³μ° Ultralytics YOLOv8
μ€λΈμ νΈ μΉ΄μ΄ν μ΄λ 무μμΈκ°μ?
λ₯Ό μ¬μ©ν κ°μ²΄ μΉ΄μ΄ν Ultralytics YOLOv8 λ λμμκ³Ό μΉ΄λ©λΌ μ€νΈλ¦Όμμ νΉμ κ°μ²΄λ₯Ό μ ννκ² μλ³νκ³ μΉ΄μ΄ν νλ κΈ°λ₯μ μ 곡ν©λλ€. YOLOv8 λ μ΅μ²¨λ¨ μκ³ λ¦¬μ¦κ³Ό λ₯λ¬λ κΈ°λ₯ λλΆμ κ΅°μ€ λΆμ λ° κ°μμ κ°μ λ€μν μλ리μ€μμ ν¨μ¨μ μ΄κ³ μ νν κ°μ²΄ μΉ΄μ΄ν μ μ 곡νλ μ€μκ° μ ν리μΌμ΄μ μ νμν©λλ€.
Watch: λ€μμ μ¬μ©νμ¬ κ°μ²΄ μ κ³μ° Ultralytics YOLOv8 |
Watch: ν΄λμ€λ³ μ€λΈμ νΈ μΉ΄μ΄ν μ μ¬μ©νμ¬ 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)] |
κ³μ° μμμ μ μνλ ν¬μΈνΈ λͺ©λ‘μ λλ€. |
count_reg_color |
tuple |
(255, 0, 255) |
μΉ΄μ΄ν μμμ RGB μμμ λλ€. |
count_txt_color |
tuple |
(0, 0, 0) |
μΉ΄μ΄νΈ ν μ€νΈμ RGB μμμ λλ€. |
count_bg_color |
tuple |
(255, 255, 255) |
μΉ΄μ΄νΈ ν μ€νΈ λ°°κ²½μ RGB μμμ λλ€. |
line_thickness |
int |
2 |
κ²½κ³ μμμ μ λκ»μ λλ€. |
track_thickness |
int |
2 |
νΈλ μ μ λκ»μ λλ€. |
view_img |
bool |
False |
λΉλμ€ μ€νΈλ¦Ό νμ μ¬λΆλ₯Ό μ μ΄νλ νλκ·Έμ λλ€. |
view_in_counts |
bool |
True |
λΉλμ€ μ€νΈλ¦Όμ μΈ μΉ΄μ΄νΈλ₯Ό νμν μ§ μ¬λΆλ₯Ό μ μ΄νλ νλκ·Έμ λλ€. |
view_out_counts |
bool |
True |
λΉλμ€ μ€νΈλ¦Όμ μμ μΉ΄μ΄νΈλ₯Ό νμν μ§ μ¬λΆλ₯Ό μ μ΄νλ νλκ·Έμ λλ€. |
draw_tracks |
bool |
False |
νλκ·Έ - κ°μ²΄ νΈλμ κ·Έλ¦΄μ§ μ¬λΆλ₯Ό μ μ΄ν©λλ€. |
track_color |
tuple |
None |
νΈλμ RGB μμ. |
region_thickness |
int |
5 |
κ°μ²΄ κ³μ° μμμ λκ»μ λλ€. |
line_dist_thresh |
int |
15 |
λΌμΈ μΉ΄μ΄ν°μ μ ν΄λ¦¬λ 거리 μκ³κ°μ λλ€. |
cls_txtdisplay_gap |
int |
50 |
κ° ν΄λμ€ μ μ¬μ΄μ κ°κ²©μ νμν©λλ€. |
μΈμ model.track
μ΄λ¦ | μ ν | κΈ°λ³Έκ° | μ€λͺ |
---|---|---|---|
source |
im0 |
None |
μ΄λ―Έμ§ λλ λΉλμ€μ μμ€ λλ ν 리 |
persist |
bool |
False |
νλ μ κ° νΈλ μ§μ |
tracker |
str |
botsort.yaml |
μΆμ λ°©λ² 'λ°μ΄νΈνΈλ' λλ 'λ΄μνΈ' |
conf |
float |
0.3 |
μ λ’° μκ³κ° |
iou |
float |
0.5 |
IOU μκ³κ° |
classes |
list |
None |
ν΄λμ€λ³λ‘ κ²°κ³Όλ₯Ό νν°λ§ν©λλ€(μ: classes=0 λλ classes=[0,2,3]). |
verbose |
bool |
True |
κ°μ²΄ μΆμ κ²°κ³Ό νμ |
μμ£Ό 묻λ μ§λ¬Έ
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 μ λͺ¨λ°μΌ λ° μ£μ§ λλ°μ΄μ€λ₯Ό λΉλ‘―ν λ€μν νλ«νΌ λ° λλ°μ΄μ€μ μννκ² ν΅ν©ν μ μμΌλ©°, μ΄λ μ΅μ AI μ ν리μΌμ΄μ μ λ§€μ° μ€μν©λλ€.
- μ μ°μ±: νΉμ μ¬μ© μ¬λ‘ μꡬ μ¬νμ μΆ©μ‘±νλλ‘ κ΅¬μ± κ°λ₯ν λͺ¨λΈμ ν΅ν΄ κ°μ²΄ κ°μ§, μΈλΆν, μΆμ κ³Ό κ°μ λ€μν μμ μ μ§μν©λλ€.
κΈ°λ₯ λ° μ±λ₯ λΉκ΅μ λν μμΈν λ΄μ©μ Ultralytics YOLOv8 μ€λͺ μλ₯Ό μ°Έμ‘°νμΈμ.
κ΅°μ€ λΆμ λ° νΈλν½ κ΄λ¦¬μ κ°μ κ³ κΈ μ ν리μΌμ΄μ μ YOLOv8 μ μ¬μ©ν μ μλμ?
μ, Ultralytics YOLOv8 μ μ€μκ° κ°μ§ κΈ°λ₯, νμ₯μ± λ° ν΅ν© μ μ°μ±μΌλ‘ μΈν΄ κ΅°μ€ λΆμ λ° νΈλν½ κ΄λ¦¬μ κ°μ κ³ κΈ μ ν리μΌμ΄μ μ μλ²½νκ² μ ν©ν©λλ€. κ³ κΈ κΈ°λ₯μ ν΅ν΄ λμ μΈ νκ²½μμ κ³ μ λ° κ°μ²΄ μΆμ , μΉ΄μ΄ν λ° λΆλ₯κ° κ°λ₯ν©λλ€. μ¬μ© μ¬λ‘μ μλ λ€μκ³Ό κ°μ΅λλ€:
- κ΅°μ€ λΆμ: λκ·λͺ¨ λͺ¨μμ λͺ¨λν°λ§νκ³ κ΄λ¦¬νμ¬ μμ μ 보μ₯νκ³ κ΅°μ€μ νλ¦μ μ΅μ νν©λλ€.
- κ΅ν΅ κ΄λ¦¬: μ°¨λμ μΆμ λ° μ§κ³νκ³ , κ΅ν΅ ν¨ν΄μ λΆμνκ³ , μ€μκ°μΌλ‘ κ΅ν΅ νΌμ‘μ κ΄λ¦¬νμΈμ.
μμΈν μ 보 λ° κ΅¬ν μΈλΆ μ¬νμ κ°μ²΄ μΉ΄μ΄ν μ μ€μ μ μ© κ°μ΄λ( YOLOv8)λ₯Ό μ°Έμ‘°νμΈμ.
2023-12-02 μμ±, 2024-07-14 μ λ°μ΄νΈ
μμ±μ: RizwanMunawar (6), glenn-jocher (15), IvorZhu331 (1), AyushExel (1)