Ultralytics YOLOv8 ๐์ ์ฌ์ฉํ ์ค๋ธ์ ํธ ๋ธ๋ฌ๋ง
์ค๋ธ์ ํธ ๋ธ๋ฌ๋ ๋ฌด์์ธ๊ฐ์?
๋ฌผ์ฒด ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌ Ultralytics YOLOv8 ๋ ์ด๋ฏธ์ง ๋๋ ๋์์์์ ๊ฐ์ง๋ ํน์ ๊ฐ์ฒด์ ๋ธ๋ฌ ํจ๊ณผ๋ฅผ ์ ์ฉํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ YOLOv8 ๋ชจ๋ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ฃผ์ด์ง ์ฅ๋ฉด ๋ด์์ ๊ฐ์ฒด๋ฅผ ์๋ณํ๊ณ ์กฐ์ํ ์ ์์ต๋๋ค.
Watch: ์ค๋ธ์ ํธ ๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ Ultralytics YOLOv8
์ค๋ธ์ ํธ ๋ธ๋ฌ์ ์ฅ์ ์?
- ๊ฐ์ธ์ ๋ณด ๋ณดํธ: ๋ฌผ์ฒด ํ๋ฆผ ํจ๊ณผ๋ ์ด๋ฏธ์ง๋ ๋์์์์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ๊ฐ์ธ ์๋ณ ์ ๋ณด๋ฅผ ์จ๊ฒจ ๊ฐ์ธ ์ ๋ณด๋ฅผ ๋ณดํธํ๋ ๋ฐ ํจ๊ณผ์ ์ธ ๋๊ตฌ์ ๋๋ค.
- ์ ํ์ ์ด์ : YOLOv8 ์ ์ฌ์ฉํ๋ฉด ์ ํ์ ์ผ๋ก ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ์ฌ ์ฌ์ฉ์๊ฐ ํน์ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ง์ ํ ์ ์์ผ๋ฏ๋ก ๊ฐ์ธ์ ๋ณด ๋ณดํธ์ ๊ด๋ จ ์๊ฐ ์ ๋ณด ์ ์ง ๊ฐ์ ๊ท ํ์ ์ ์งํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ์ฒ๋ฆฌ: YOLOv8 ์ ํจ์จ์ฑ์ ์ค์๊ฐ์ผ๋ก ๋ฌผ์ฒด๋ฅผ ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ ์ ์์ด ๋์ ํ๊ฒฝ์์ ์ฆ๊ฐ์ ์ธ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ฐํ๊ฐ ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
YOLOv8 ์ ์ฌ์ฉํ ์ค๋ธ์ ํธ ํ๋ฆผ ์์
import cv2
from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors
model = YOLO("yolov8n.pt")
names = model.names
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))
# Blur ratio
blur_ratio = 50
# Video writer
video_writer = cv2.VideoWriter("object_blurring_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
results = model.predict(im0, show=False)
boxes = results[0].boxes.xyxy.cpu().tolist()
clss = results[0].boxes.cls.cpu().tolist()
annotator = Annotator(im0, line_width=2, example=names)
if boxes is not None:
for box, cls in zip(boxes, clss):
annotator.box_label(box, color=colors(int(cls), True), label=names[int(cls)])
obj = im0[int(box[1]) : int(box[3]), int(box[0]) : int(box[2])]
blur_obj = cv2.blur(obj, (blur_ratio, blur_ratio))
im0[int(box[1]) : int(box[3]), int(box[0]) : int(box[2])] = blur_obj
cv2.imshow("ultralytics", im0)
video_writer.write(im0)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
video_writer.release()
cv2.destroyAllWindows()
์ธ์ model.predict
์ด๋ฆ | ์ ํ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
source |
str |
'ultralytics/assets' |
์ด๋ฏธ์ง ๋๋ ๋น๋์ค์ ์์ค ๋๋ ํ ๋ฆฌ |
conf |
float |
0.25 |
ํ์ง๋ฅผ ์ํ ๊ฐ์ฒด ์ ๋ขฐ ์๊ณ๊ฐ |
iou |
float |
0.7 |
NMS์ ๋ํ ๊ต์ฐจ์ ์ค๋ฒ ์ ๋์จ(IoU) ์๊ณ๊ฐ |
imgsz |
int or tuple |
640 |
์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์นผ๋ผ ๋๋ (h, w) ๋ชฉ๋ก(์: (640, 480))์ผ๋ก ์ง์ ํฉ๋๋ค. |
half |
bool |
False |
๋ฐ์ ๋ฐ๋ ์ฌ์ฉ(FP16) |
device |
None or str |
None |
์คํํ ์ฅ์น, ์ฆ cuda device=0/1/2/3 ๋๋ device=.cpu |
max_det |
int |
300 |
์ด๋ฏธ์ง๋น ์ต๋ ํ์ง ํ์ |
vid_stride |
bool |
False |
๋น๋์ค ํ๋ ์ ์๋ ๋ณดํญ |
stream_buffer |
bool |
False |
๋ชจ๋ ์คํธ๋ฆฌ๋ฐ ํ๋ ์์ ๋ฒํผ๋งํ๊ฑฐ๋(True) ๊ฐ์ฅ ์ต๊ทผ ํ๋ ์์ ๋ฐํํฉ๋๋ค(False). |
visualize |
bool |
False |
๋ชจ๋ธ ๊ธฐ๋ฅ ์๊ฐํ |
augment |
bool |
False |
์์ธก ์์ค์ ์ด๋ฏธ์ง ์ฆ๊ฐ ์ ์ฉ |
agnostic_nms |
bool |
False |
ํด๋์ค์ ๊ตฌ์ ๋ฐ์ง ์๋ NMS |
classes |
list[int] |
None |
ํด๋์ค๋ณ๋ก ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํฉ๋๋ค(์: classes=0 ๋๋ classes=[0,2,3]). |
retina_masks |
bool |
False |
๊ณ ํด์๋ ์ธ๋ถํ ๋ง์คํฌ ์ฌ์ฉ |
embed |
list[int] |
None |
์ฃผ์ด์ง ๋ ์ด์ด์์ ํผ์ฒ ๋ฒกํฐ/์๋ฒ ๋ฉ์ ๋ฐํํฉ๋๋ค. |
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
๋ฌผ์ฒด ํ๋ฆผ์ด๋ ๋ฌด์์ธ๊ฐ์ Ultralytics YOLOv8 ?
๋ฌผ์ฒด ํ๋ฆผ ํจ๊ณผ Ultralytics YOLOv8 ๋ ์ด๋ฏธ์ง๋ ๋์์์์ ํน์ ๋ฌผ์ฒด๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ์ฌ ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ๋ ํจ๊ณผ๋ฅผ ์ ์ฉํฉ๋๋ค. ์ด ๊ธฐ์ ์ ๊ด๋ จ ์๊ฐ์ ๋ฐ์ดํฐ๋ ์ ์งํ๋ฉด์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์จ๊ฒจ ๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ฅผ ๊ฐํํฉ๋๋ค. YOLOv8 ์ค์๊ฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ผ๋ก ์ฆ๊ฐ์ ์ธ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฐ ์ ํ์ ์ด์ ์กฐ์ ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
YOLOv8 ์ ์ฌ์ฉํ์ฌ ์ค์๊ฐ ์ค๋ธ์ ํธ ๋ธ๋ฌ๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
YOLOv8 ๋ก ์ค์๊ฐ ๊ฐ์ฒด ํ๋ฆผ ํจ๊ณผ๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์ ๊ณต๋ Python ์์ ๋ฅผ ๋ฐ๋ฅด์ธ์. ์ฌ๊ธฐ์๋ ๋ฌผ์ฒด ๊ฐ์ง์๋ YOLOv8 ๋ฅผ ์ฌ์ฉํ๊ณ ํ๋ฆผ ํจ๊ณผ ์ ์ฉ์๋ OpenCV๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์์ ๋จ์ํ๋ ๋ฒ์ ์ ๋๋ค:
import cv2
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("path/to/video/file.mp4")
while cap.isOpened():
success, im0 = cap.read()
if not success:
break
results = model.predict(im0, show=False)
for box in results[0].boxes.xyxy.cpu().tolist():
obj = im0[int(box[1]) : int(box[3]), int(box[0]) : int(box[2])]
im0[int(box[1]) : int(box[3]), int(box[0]) : int(box[2])] = cv2.blur(obj, (50, 50))
cv2.imshow("YOLOv8 Blurring", im0)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
๋ฌผ์ฒด ํ๋ฆผ์ Ultralytics YOLOv8 ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ด์ ์ด ์๋์?
Ultralytics YOLOv8 ๋ ์ค๋ธ์ ํธ ํ๋ฆผ ํจ๊ณผ์ ๋ช ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ๊ฐ์ธ์ ๋ณด ๋ณดํธ: ๋ฏผ๊ฐํ๊ฑฐ๋ ์๋ณ ๊ฐ๋ฅํ ์ ๋ณด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ฐ๋ฆด ์ ์์ต๋๋ค.
- ์ ํ์ ์ด์ : ํน์ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ์ฌ ํ์ ์๊ฐ์ ์ฝํ ์ธ ๋ฅผ ์ ์งํฉ๋๋ค.
- ์ค์๊ฐ ์ฒ๋ฆฌ: ๋์ ํ๊ฒฝ์์ ์ค๋ธ์ ํธ ๋ธ๋ฌ๋ง์ ํจ์จ์ ์ผ๋ก ์คํํ์ฌ ์ฆ๊ฐ์ ์ธ ํ๋ผ์ด๋ฒ์ ํฅ์์ ์ ํฉํฉ๋๋ค.
์์ธํ ์ ์ฉ ์ฌ๋ก๋ ๋ฌผ์ฒด ํ๋ฆผ ํจ๊ณผ์ ์ฅ์ ์น์ ์์ ํ์ธํ์ธ์.
๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ฅผ ์ํด ๋์์์์ ์ผ๊ตด์ ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐ Ultralytics YOLOv8 ์ฌ์ฉํ ์ ์๋์?
์, Ultralytics YOLOv8 ์ ๋์์์์ ์ผ๊ตด์ ๊ฐ์งํ๊ณ ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ์ฌ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ณดํธํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค. ์ผ๊ตด์ ๊ตฌ์ฒด์ ์ผ๋ก ์ธ์ํ๋๋ก ๋ฏธ๋ฆฌ ํ๋ จํ๊ฑฐ๋ ํ๋ จ๋ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๊ฐ์ง ๊ฒฐ๊ณผ๋ฅผ OpenCV๋ก ์ฒ๋ฆฌํ์ฌ ๋ธ๋ฌ ํจ๊ณผ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ฌผ์ฒด ๊ฐ์ง์ ๋ํ ๊ฐ์ด๋( YOLOv8 )๋ฅผ ์ฐธ์กฐํ์ฌ ์ผ๊ตด ๊ฐ์ง ๋์์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์์ ํ์ธ์.
YOLOv8 ์ ๋ฌผ์ฒด ํ๋ฆผ ํจ๊ณผ๋ฅผ ์ํ Faster R-CNN๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฌผ์ฒด ๊ฐ์ง ๋ชจ๋ธ๊ณผ ์ด๋ป๊ฒ ๋น๊ต๋๋์?
Ultralytics YOLOv8 ์ ์ผ๋ฐ์ ์ผ๋ก ์๋ ์ธก๋ฉด์์ Faster R-CNN๊ณผ ๊ฐ์ ๋ชจ๋ธ๋ณด๋ค ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฏ๋ก ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ ํฉํฉ๋๋ค. ๋ ๋ชจ๋ธ ๋ชจ๋ ์ ํํ ๊ฐ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, YOLOv8 ์ ์ํคํ ์ฒ๋ ์ค์๊ฐ ๋ฌผ์ฒด ํ๋ฆผ๊ณผ ๊ฐ์ ์์ ์ ์ค์ํ ๋น ๋ฅธ ์ถ๋ก ์ ์ต์ ํ๋์ด ์์ต๋๋ค. ๊ธฐ์ ์ ์ฐจ์ด์ ๊ณผ ์ฑ๋ฅ ์งํ์ ๋ํ ์์ธํ ๋ด์ฉ์ YOLOv8 ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์์ฑ 2024-01-09, ์ ๋ฐ์ดํธ 2024-07-05
์์ฑ์: glenn-jocher (6), RizwanMunawar (1), IvorZhu331 (1), AyushExel (1)