YOLO λͺ¨λΈμ μ¬μ©ν μ€λ λ μμ μΆλ‘
λ©ν° μ€λ λ νκ²½μμ YOLO λͺ¨λΈμ μ€ννλ €λ©΄ μ€λ λ μμ μ 보μ₯νκΈ° μν΄ μ μ€ν κ³ λ €κ° νμν©λλ€. Python's threading
λͺ¨λμ μ¬μ©νλ©΄ μ¬λ¬ μ€λ λλ₯Ό λμμ μ€νν μ μμ§λ§ μ΄λ¬ν μ€λ λμμ YOLO λͺ¨λΈμ μ¬μ©ν λλ μ£Όμν΄μΌ ν μ€μν μμ λ¬Έμ κ° μμ΅λλ€. μ΄ νμ΄μ§μμλ μ€λ λμ μμ ν YOLO λͺ¨λΈ μΆλ‘ μ λ§λλ λ°©λ²μ μλ΄ν©λλ€.
Python μ€λ λ© μ΄ν΄
Python μ€λ λλ νλ‘κ·Έλ¨μμ ν λ²μ μ¬λ¬ μμ μ μ€νν μ μλ λ³λ ¬ μ²λ¦¬μ ν ννμ λλ€. νμ§λ§ Python μ κΈλ‘λ² μΈν°νλ¦¬ν° μ κΈ(GIL)μ ν λ²μ νλμ μ€λ λλ§ Python λ°μ΄νΈμ½λλ₯Ό μ€νν μ μμμ μλ―Έν©λλ€.
μ ν μ¬νμ²λΌ λ€λ¦¬μ§λ§, μ€λ λλ νΉν I/O λ°μΈλ© μ°μ°μ΄λ YOLO μ κΈ°λ³Έ C λΌμ΄λΈλ¬λ¦¬μμ μννλ κ²κ³Ό κ°μ΄ GILμ ν΄μ νλ μ°μ°μ μ¬μ©ν λ μ¬μ ν λμμ±μ μ 곡ν μ μμ΅λλ€.
곡μ λͺ¨λΈ μΈμ€ν΄μ€μ μνμ±
YOLO λͺ¨λΈμ μ€λ λ μΈλΆμμ μΈμ€ν΄μ€ννκ³ μ΄ μΈμ€ν΄μ€λ₯Ό μ¬λ¬ μ€λ λμμ 곡μ νλ©΄ λμ μ‘μΈμ€λ‘ μΈν΄ λͺ¨λΈμ λ΄λΆ μνκ° μΌκ΄μ± μμ΄ μμ λλ κ²½μ μ‘°κ±΄μ΄ λ°μν μ μμ΅λλ€. μ΄λ λͺ¨λΈ λλ κ·Έ κ΅¬μ± μμκ° μ€λ λμ μμ νμ§ μλλ‘ μ€κ³λμ§ μμ μνλ₯Ό 보μ ν λ νΉν λ¬Έμ κ° λ©λλ€.
μ€λ λ μμ νμ§ μμ μμ : λ¨μΌ λͺ¨λΈ μΈμ€ν΄μ€
Python μμ μ€λ λλ₯Ό μ¬μ©ν λλ λμμ± λ¬Έμ λ₯Ό μΌμΌν¬ μ μλ ν¨ν΄μ μΈμνλ κ²μ΄ μ€μν©λλ€. λ¨μΌ YOLO λͺ¨λΈ μΈμ€ν΄μ€λ₯Ό μ¬λ¬ μ€λ λμμ 곡μ νλ κ²μ νΌν΄μΌ ν©λλ€.
# Unsafe: Sharing a single model instance across threads
from threading import Thread
from ultralytics import YOLO
# Instantiate the model outside the thread
shared_model = YOLO("yolo11n.pt")
def predict(image_path):
"""Predicts objects in an image using a preloaded YOLO model, take path string to image as argument."""
results = shared_model.predict(image_path)
# Process results
# Starting threads that share the same model instance
Thread(target=predict, args=("image1.jpg",)).start()
Thread(target=predict, args=("image2.jpg",)).start()
μμ μμμ shared_model
κ° μ¬λ¬ μ€λ λμμ μ¬μ©λλ©΄ λ€μκ³Ό κ°μ μ΄μ λ‘ μμΈ‘ν μ μλ κ²°κ³Όκ° λ°μν μ μμ΅λλ€. predict
λ₯Ό μ¬λ¬ μ€λ λμμ λμμ μ€νν μ μμ΅λλ€.
μ€λ λ μμ νμ§ μμ μμ : μ¬λ¬ λͺ¨λΈ μΈμ€ν΄μ€
λ§μ°¬κ°μ§λ‘ YOLO λͺ¨λΈ μΈμ€ν΄μ€κ° μ¬λ¬ κ° μλ μμ νμ§ μμ ν¨ν΄λ μμ΅λλ€:
# Unsafe: Sharing multiple model instances across threads can still lead to issues
from threading import Thread
from ultralytics import YOLO
# Instantiate multiple models outside the thread
shared_model_1 = YOLO("yolo11n_1.pt")
shared_model_2 = YOLO("yolo11n_2.pt")
def predict(model, image_path):
"""Runs prediction on an image using a specified YOLO model, returning the results."""
results = model.predict(image_path)
# Process results
# Starting threads with individual model instances
Thread(target=predict, args=(shared_model_1, "image1.jpg")).start()
Thread(target=predict, args=(shared_model_2, "image2.jpg")).start()
λ κ°μ κ°λ³ λͺ¨λΈ μΈμ€ν΄μ€κ° μλλΌλ λμμ± λ¬Έμ μ μνμ μ¬μ ν μ‘΄μ¬ν©λλ€. λ΄λΆ ꡬνμμ YOLO
λ μ€λ λ μμ νμ§ μμΌλ―λ‘ λ³λμ μΈμ€ν΄μ€λ₯Ό μ¬μ©νλ©΄ νΉν μ΄λ¬ν μΈμ€ν΄μ€κ° μ€λ λ λ‘μ»¬μ΄ μλ κΈ°λ³Έ 리μμ€λ μνλ₯Ό 곡μ νλ κ²½μ° κ²½μ 쑰건μ λ°©μ§νμ§ λͺ»ν μ μμ΅λλ€.
μ€λ λ μμ μΆλ‘
μ€λ λ μμ μΆλ‘ μ μννλ €λ©΄ κ° μ€λ λ λ΄μ λ³λμ YOLO λͺ¨λΈμ μΈμ€ν΄μ€νν΄μΌ ν©λλ€. μ΄λ κ² νλ©΄ κ° μ€λ λκ° κ³ μ μ 격리λ λͺ¨λΈ μΈμ€ν΄μ€λ₯Ό κ°κ² λμ΄ κ²½μ 쑰건μ μνμ μ κ±°ν μ μμ΅λλ€.
μ€λ λ μμ μμ
μμ ν λ³λ ¬ μΆλ‘ μ μν΄ κ° μ€λ λ λ΄μμ YOLO λͺ¨λΈμ μΈμ€ν΄μ€ννλ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€:
# Safe: Instantiating a single model inside each thread
from threading import Thread
from ultralytics import YOLO
def thread_safe_predict(image_path):
"""Predict on an image using a new YOLO model instance in a thread-safe manner; takes image path as input."""
local_model = YOLO("yolo11n.pt")
results = local_model.predict(image_path)
# Process results
# Starting threads that each have their own model instance
Thread(target=thread_safe_predict, args=("image1.jpg",)).start()
Thread(target=thread_safe_predict, args=("image2.jpg",)).start()
μ΄ μμ μμλ κ° μ€λ λκ° κ³ μ ν YOLO
μΈμ€ν΄μ€. μ΄λ κ² νλ©΄ μ΄λ€ μ€λ λκ° λ€λ₯Έ μ€λ λμ λͺ¨λΈ μνλ₯Ό κ°μνμ§ λͺ»νλ―λ‘ κ° μ€λ λκ° λ€λ₯Έ μ€λ λμ μκΈ°μΉ μμ μνΈ μμ© μμ΄ μμ νκ² μΆλ‘ μ μνν μ μμ΅λλ€.
κ²°λ‘
YOLO λͺ¨λΈκ³Ό Python threading
λ₯Ό μ¬μ©νλ©΄ μ€λ λ μμ μ 보μ₯νκΈ° μν΄ νμ λͺ¨λΈμ μ¬μ©ν μ€λ λ λ΄μμ λͺ¨λΈμ μΈμ€ν΄μ€νν©λλ€. μ΄λ κ² νλ©΄ κ²½μ 쑰건μ νΌνκ³ μΆλ‘ μμ
μ μμ μ μΌλ‘ μ€νν μ μμ΅λλ€.
λ³΄λ€ κ³ κΈ μλ리μ€μ λ©ν°μ€λ λ μΆλ‘ μ±λ₯μ λμ± μ΅μ ννλ €λ©΄ λ€μκ³Ό κ°μ΄ νλ‘μΈμ€ κΈ°λ° λ³λ ¬ μ²λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. multiprocessing
λλ μ μ© μμ
μ νλ‘μΈμ€κ° μλ μμ
λκΈ°μ΄μ νμ©νμΈμ.
μμ£Ό 묻λ μ§λ¬Έ
λ©ν° μ€λ λ Python νκ²½μμ YOLO λͺ¨λΈμ μ¬μ©ν λ κ²½μ 쑰건μ νΌνλ €λ©΄ μ΄λ»κ² ν΄μΌ νλμ?
λ©ν° μ€λ λ Python νκ²½μμ Ultralytics YOLO λͺ¨λΈμ μ¬μ©ν λ κ²½μ 쑰건μ λ°©μ§νλ €λ©΄ κ° μ€λ λ λ΄μ λ³λμ YOLO λͺ¨λΈμ μΈμ€ν΄μ€ννμΈμ. μ΄λ κ² νλ©΄ κ° μ€λ λκ° κ³ μ μ 격리λ λͺ¨λΈ μΈμ€ν΄μ€λ₯Ό κ°κ² λμ΄ λͺ¨λΈ μνκ° λμμ μμ λλ κ²μ λ°©μ§ν μ μμ΅λλ€.
μμ:
from threading import Thread
from ultralytics import YOLO
def thread_safe_predict(image_path):
"""Predict on an image in a thread-safe manner."""
local_model = YOLO("yolo11n.pt")
results = local_model.predict(image_path)
# Process results
Thread(target=thread_safe_predict, args=("image1.jpg",)).start()
Thread(target=thread_safe_predict, args=("image2.jpg",)).start()
μ€λ λ μμ μ± λ³΄μ₯μ λν μμΈν λ΄μ©μ YOLO λͺ¨λΈμ μ¬μ©ν μ€λ λ μμ μΆλ‘ λ¬Έμλ₯Ό μ°Έμ‘°νμΈμ.
Python μμ λ©ν° μ€λ λ YOLO λͺ¨λΈ μΆλ‘ μ μ€ννλ λͺ¨λ² μ¬λ‘λ 무μμΈκ°μ?
Python μμ λ©ν° μ€λ λ YOLO λͺ¨λΈ μΆλ‘ μ μμ νκ² μ€ννλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μΈμ:
- λ¨μΌ λͺ¨λΈ μΈμ€ν΄μ€λ₯Ό μ¬λ¬ μ€λ λμμ 곡μ νλ λμ κ° μ€λ λ λ΄μμ YOLO λͺ¨λΈμ μΈμ€ν΄μ€νν©λλ€.
- Python μ¬μ©
multiprocessing
λͺ¨λμ λ³λ ¬ μ²λ¦¬νμ¬ κΈλ‘λ² μΈν°νλ¦¬ν° μ κΈ(GIL)κ³Ό κ΄λ ¨λ λ¬Έμ λ₯Ό λ°©μ§ν©λλ€. - YOLO μ κΈ°λ³Έ C λΌμ΄λΈλ¬λ¦¬μμ μννλ μμ μ μ¬μ©νμ¬ GILμ 릴리μ€ν©λλ€.
μ€λ λ μμ λͺ¨λΈ μΈμ€ν΄μ€νμ μμ λλ€:
from threading import Thread
from ultralytics import YOLO
def thread_safe_predict(image_path):
"""Runs inference in a thread-safe manner with a new YOLO model instance."""
model = YOLO("yolo11n.pt")
results = model.predict(image_path)
# Process results
# Initiate multiple threads
Thread(target=thread_safe_predict, args=("image1.jpg",)).start()
Thread(target=thread_safe_predict, args=("image2.jpg",)).start()
μμΈν λ΄μ©μ μ€λ λ μμ μΆλ‘ μΉμ μ μ°Έμ‘°νμΈμ.
κ° μ€λ λμ κ³ μ ν YOLO λͺ¨λΈ μΈμ€ν΄μ€κ° μμ΄μΌ νλ μ΄μ λ 무μμΈκ°μ?
κ° μ€λ λμλ μ체 YOLO λͺ¨λΈ μΈμ€ν΄μ€κ° μμ΄μΌ κ²½μ 쑰건μ λ°©μ§ν μ μμ΅λλ€. λ¨μΌ λͺ¨λΈ μΈμ€ν΄μ€λ₯Ό μ¬λ¬ μ€λ λμμ 곡μ νλ©΄ λμ μ‘μΈμ€λ‘ μΈν΄ μμΈ‘ν μ μλ λμκ³Ό λͺ¨λΈ λ΄λΆ μνμ μμ μ΄ λ°μν μ μμ΅λλ€. λ³λμ μΈμ€ν΄μ€λ₯Ό μ¬μ©νλ©΄ μ€λ λ 격리λ₯Ό 보μ₯νμ¬ λ©ν°μ€λ λ μμ μ μμ μ μ΄κ³ μμ νκ² μνν μ μμ΅λλ€.
μμΈν μ§μΉ¨μ λΉμ€λ λ μμ μμ μΉμ μ μ°Έμ‘°νμΈμ: λ¨μΌ λͺ¨λΈ μΈμ€ν΄μ€ λ° μ€λ λ μμ μμ μΉμ μ μ°Έμ‘°νμΈμ.
Python μ κΈλ‘λ² μΈν°νλ¦¬ν° μ κΈ(GIL)μ YOLO λͺ¨λΈ μΆλ‘ μ μ΄λ€ μν₯μ λ―ΈμΉλμ?
Pythonμ κΈλ‘λ² μΈν°νλ¦¬ν° μ κΈ(GIL)μ ν λ²μ νλμ μ€λ λλ§ Python λ°μ΄νΈμ½λλ₯Ό μ€ννλλ‘ νμ©νλ―λ‘ CPU-λ°μ΄λ λ©ν°μ€λ λ© μμ
μ μ±λ₯μ΄ μ νλ μ μμ΅λλ€. κ·Έλ¬λ YOLO μ C λΌμ΄λΈλ¬λ¦¬μ²λΌ GILμ ν΄μ νλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ I/O λ°μ΄λ μμ
μ΄λ νλ‘μΈμ€μ κ²½μ° μ¬μ ν λμμ±μ λ¬μ±ν μ μμ΅λλ€. μ±λ₯μ ν₯μμν€λ €λ©΄ Python μμ νλ‘μΈμ€ κΈ°λ° λ³λ ¬ μ²λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. multiprocessing
λͺ¨λ.
Python μμ μ€λ λ©μ λν μμΈν λ΄μ©μ Python μ€λ λ© μ΄ν΄ μΉμ μ μ°Έμ‘°νμΈμ.
YOLO λͺ¨λΈ μΆλ‘ μ μ€λ λ© λμ νλ‘μΈμ€ κΈ°λ° λ³λ ¬ μ²λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ λ μμ νκ°μ?
μ, Python μ multiprocessing
λͺ¨λμ λ³λ ¬λ‘ μ€ννλ κ²μ΄ YOLO λͺ¨λΈ μΆλ‘ μ μ€ννλ λ° λ μμ νκ³ ν¨μ¨μ μΈ κ²½μ°κ° λ§μ΅λλ€. νλ‘μΈμ€ κΈ°λ° λ³λ ¬ μ²λ¦¬λ λ³λμ λ©λͺ¨λ¦¬ 곡κ°μ μμ±νμ¬ κΈλ‘λ² μΈν°νλ¦¬ν° μ κΈ(GIL)μ νΌνκ³ λμμ± λ¬Έμ μ μνμ μ€μ
λλ€. κ° νλ‘μΈμ€λ μ체 YOLO λͺ¨λΈ μΈμ€ν΄μ€μ ν¨κ» λ
립μ μΌλ‘ μλν©λλ€.
YOLO λͺ¨λΈμ μ¬μ©ν νλ‘μΈμ€ κΈ°λ° λ³λ ¬ μ²λ¦¬μ λν μμΈν λ΄μ©μ μ€λ λ μμ μΆλ‘ νμ΄μ§λ₯Ό μ°Έμ‘°νμΈμ.