Ultralytics YOLOv8 ๐์ ์ด์ฉํ ์ฃผ์ฐจ ๊ด๋ฆฌ
์ฃผ์ฐจ ๊ด๋ฆฌ ์์คํ ์ด๋ ๋ฌด์์ธ๊ฐ์?
์ฃผ์ฐจ ๊ด๋ฆฌ Ultralytics YOLOv8 ๋ ๊ณต๊ฐ์ ๊ตฌ์ฑํ๊ณ ๊ฐ์ฉ์ฑ์ ๋ชจ๋ํฐ๋งํ์ฌ ํจ์จ์ ์ด๊ณ ์์ ํ ์ฃผ์ฐจ๋ฅผ ๋ณด์ฅํฉ๋๋ค. YOLOv8 ์ค์๊ฐ ์ฐจ๋ ๊ฐ์ง ๋ฐ ์ฃผ์ฐจ ์ ์ ์จ์ ๋ํ ์ธ์ฌ์ดํธ๋ฅผ ํตํด ์ฃผ์ฐจ์ฅ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ฃผ์ฐจ ๊ด๋ฆฌ ์์คํ ์ ์ฅ์ ์?
- ํจ์จ์ฑ: ์ฃผ์ฐจ์ฅ ๊ด๋ฆฌ๋ ์ฃผ์ฐจ ๊ณต๊ฐ ์ฌ์ฉ์ ์ต์ ํํ๊ณ ํผ์ก์ ์ค์ ๋๋ค.
- ์์ ๋ฐ ๋ณด์: YOLOv8 ์ ์ฌ์ฉํ ์ฃผ์ฐจ ๊ด๋ฆฌ๋ ๊ฐ์ ๋ฐ ๋ณด์ ์กฐ์น๋ฅผ ํตํด ์ฌ๋๊ณผ ์ฐจ๋ ๋ชจ๋์ ์์ ์ ํฅ์์ํต๋๋ค.
- ๋ฐฐ๊ธฐ๊ฐ์ค ๋ฐฐ์ถ๋ ๊ฐ์: YOLOv8 ์ ์ฌ์ฉํ ์ฃผ์ฐจ ๊ด๋ฆฌ๋ ๊ตํต ํ๋ฆ์ ๊ด๋ฆฌํ์ฌ ์ฃผ์ฐจ์ฅ์ ์ ํด ์๊ฐ๊ณผ ๋ฐฐ๊ธฐ๊ฐ์ค ๋ฐฐ์ถ์ ์ต์ํํฉ๋๋ค.
์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ฃผ์ฐจ ๊ด๋ฆฌ ์์คํ | ์ฃผ์ฐจ ๊ด๋ฆฌ ์์คํ |
---|---|
๋ค์์ ์ฌ์ฉํ์ฌ ์ฃผ์ฐจ ๊ด๋ฆฌ ์์ด๋ฆฌ์ผ ๋ทฐ Ultralytics YOLOv8 | ๋ค์์ ์ฌ์ฉํ ์ฃผ์ฐจ ๊ด๋ฆฌ ํ๋ฉด๋ Ultralytics YOLOv8 |
์ฃผ์ฐจ ๊ด๋ฆฌ ์์คํ ์ฝ๋ ์ํฌํ๋ก์ฐ
ํฌ์ธํธ ์ ํ
์ด์ ํฌ์ธํธ ์ ํ์ด ์ฌ์์ก์ต๋๋ค.
์ฃผ์ฐจ ์ง์ ์ ํ์ ์ฃผ์ฐจ ๊ด๋ฆฌ ์์คํ ์์ ๋งค์ฐ ์ค์ํ๊ณ ๋ณต์กํ ์์ ์ ๋๋ค. Ultralytics ์์๋ ์ฃผ์ฐจ์ฅ ๊ตฌ์ญ์ ์ ์ํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ฌ ์ด ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๊ณ , ๋์ค์ ์ถ๊ฐ ์ฒ๋ฆฌ์ ํ์ฉํ ์ ์์ต๋๋ค.
- ์ฃผ์ฐจ์ฅ์ ๊ด๋ฆฌํ๋ ค๋ ๋น๋์ค ๋๋ ์นด๋ฉ๋ผ ์คํธ๋ฆผ์์ ํ๋ ์์ ์บก์ฒํฉ๋๋ค.
- ์ ๊ณต๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ํฝ ์ธํฐํ์ด์ค๋ฅผ ์์ํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ์ ํํ๊ณ ๋ง์ฐ์ค ํด๋ฆญ์ผ๋ก ์ฃผ์ฐจ ๊ตฌ์ญ์ ์ค๊ณฝ์ ๊ทธ๋ ค ๋ค๊ฐํ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ด๋ฏธ์ง ํฌ๊ธฐ
์ต๋ ์ด๋ฏธ์ง ํฌ๊ธฐ 1920 * 1080 ์ง์
from ultralytics.solutions.parking_management import ParkingPtsSelection, tk
root = tk.Tk()
ParkingPtsSelection(root)
root.mainloop()
- ๋ค๊ฐํ์ผ๋ก ์ฃผ์ฐจ ๊ตฌ์ญ์ ์ ์ํ ํ ๋ค์์ ํด๋ฆญํฉ๋๋ค.
save
์ ์ฌ์ฉํ์ฌ ์์ ๋๋ ํฐ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ JSON ํ์ผ์ ์ ์ฅํฉ๋๋ค.
Python ์ฃผ์ฐจ ๊ด๋ฆฌ ์ฝ๋
YOLOv8 ์์ ๋ฅผ ์ฌ์ฉํ ์ฃผ์ฐจ ๊ด๋ฆฌ
import cv2
from ultralytics.solutions.parking_management import ParkingManagement
# Path to json file, that created with above point selection app
polygon_json_path = "bounding_boxes.json"
# Video capture
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))
# Video writer
video_writer = cv2.VideoWriter("parking management.avi",
cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
# Initialize parking management object
management = ParkingManagement(model_path="yolov8n.pt")
while cap.isOpened():
ret, im0 = cap.read()
if not ret:
break
json_data = management.parking_regions_extraction(polygon_json_path)
results = management.model.track(im0, persist=True, show=False)
if results[0].boxes.id is not None:
boxes = results[0].boxes.xyxy.cpu().tolist()
clss = results[0].boxes.cls.cpu().tolist()
management.process_data(json_data, im0, boxes, clss)
management.display_frames(im0)
video_writer.write(im0)
cap.release()
video_writer.release()
cv2.destroyAllWindows()
์ ํ์ ์ธ์ ParkingManagement()
์ด๋ฆ | ์ ํ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
---|---|---|---|
occupied_region_color |
RGB Color |
(0, 255, 0) |
์ฃผ์ฐจ ๊ณต๊ฐ ์ ์ ์์ญ ์์ |
available_region_color |
RGB Color |
(0, 0, 255) |
์ฃผ์ฐจ ๊ณต๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ ์ง์ญ ์์ |
margin |
int |
10 |
์ฌ๋ฌ ํด๋์ค ์นด์ดํธ์ ๋ํ ํ ์คํธ ํ์ ๊ฐ๊ฒฉ |
txt_color |
RGB Color |
(255, 255, 255) |
๊ฐ์ฒด ์ ํ ์คํธ์ ์ ๊ฒฝ์ |
bg_color |
RGB Color |
(255, 255, 255) |
ํ ์คํธ ๋ฐฐ๊ฒฝ์ ๋ค์ ์ง์ฌ๊ฐํ |
์ธ์ 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 |
๊ฐ์ฒด ์ถ์ ๊ฒฐ๊ณผ ํ์ |