ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

БСзопасныС для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Ρ‹Π²ΠΎΠ΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ YOLO

Запуск ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ YOLO Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ рассмотрСния для обСспСчСния бСзопасности ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Python's threading ΠœΠΎΠ΄ΡƒΠ»ΡŒ позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»ΠΎ Π΄ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ использования ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ YOLO Π² этих ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π²Π°ΠΆΠ½Ρ‹Π΅ вопросы бСзопасности, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ. На этой страницС Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ бСзопасный для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ YOLO .

ПониманиС Python Threading

Python ΠŸΠΎΡ‚ΠΎΠΊΠΈ - это Ρ„ΠΎΡ€ΠΌΠ° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Однако глобальная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (GIL) Π½Π° сайтС Python ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Python .

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π₯отя это Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΊΠ°ΠΊ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΊΠΈ всС ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ, особСнно ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ использовании ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… GIL, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, выполняСмых Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ YOLO's, Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌΠΈ Π² основС языка C.

ΠžΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΡ… экзСмпляров ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ

Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ 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's threadingΠ§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², всСгда инстанцируйтС ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Вакая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ условий Π³ΠΎΠ½ΠΊΠΈ ΠΈ обСспСчиваСт Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ Π²Ρ‹Π²ΠΎΠ΄Π°.

Для Π±ΠΎΠ»Π΅Π΅ слоТных сцСнариСв ΠΈ дальнСйшСй ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ² рассмотритС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° Π½Π° основС процСссов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ multiprocessing ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π·Π°Π΄Π°Ρ‡ с Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ процСссами.

ЧАБВО Π—ΠΠ”ΠΠ’ΠΠ•ΠœΠ«Π• Π’ΠžΠŸΠ ΠžΠ‘Π«

Как ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ условий Π³ΠΎΠ½ΠΊΠΈ ΠΏΡ€ΠΈ использовании ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ YOLO Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС Python ?

Для прСдотвращСния условий Π³ΠΎΠ½ΠΊΠΈ ΠΏΡ€ΠΈ использовании Ultralytics YOLO ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ Python срСдС, инстанцируйтС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ 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()

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± обСспСчСнии бСзопасности ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Thread-Safe Inference with YOLO Models.

ΠšΠ°ΠΊΠΎΠ²Ρ‹ Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ для выполнСния ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ YOLO Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² Python?

Π§Ρ‚ΠΎΠ±Ρ‹ бСзопасно Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ YOLO Π² Python, слСдуйтС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ рСкомСндациям:

  1. Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ YOLO Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π° Π½Π΅ Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΎΠ΄ΠΈΠ½ экзСмпляр ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ.
  2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Python's multiprocessing ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с глобальной Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (GIL).
  3. ОсвобоТдСниС GIL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, выполняСмых YOLO's Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ C.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ потокобСзопасного инстанцирования ΠΌΠΎΠ΄Π΅Π»ΠΈ:

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 для прСдотвращСния ситуаций Π³ΠΎΠ½ΠΊΠΈ. Когда ΠΎΠ΄ΠΈΠ½ экзСмпляр ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ совмСстно нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ ΠΊ Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСпрСдсказуСмому повСдСнию ΠΈ измСнСнию Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ состояния ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ экзСмпляры, Π²Ρ‹ обСспСчиваСтС ΠΈΠ·ΠΎΠ»ΡΡ†ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌΠΈ ΠΈ бСзопасными.

Для получСния ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ руководства ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌΠΈ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±Π΅Π· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ бСзопасности: ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ экзСмпляр ΠΌΠΎΠ΄Π΅Π»ΠΈ" ΠΈ "ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒΡŽ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²".

Как глобальная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (GIL) Π½Π° сайтС Python влияСт Π½Π° Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠ΄Π΅Π»ΠΈ YOLO ?

PythonΠ“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (GIL) позволяСт ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Python Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, связанных с CPU. Однако для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ процСссов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ GIL, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ YOLO'C-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π²Ρ‹ всС Ρ€Π°Π²Π½ΠΎ смоТСтС Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°. Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ рассмотритС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° Π½Π° основС процСссов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python's multiprocessing ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Ρ€Π΅Π·ΡŒΠ±Π΅ Π² Python см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ "ПониманиС Ρ€Π΅Π·ΡŒΠ±Ρ‹ Python ".

БСзопаснСС Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ Π½Π° основС процСссов вмСсто ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ YOLO ?

Π”Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Python's multiprocessing ΠΌΠΎΠ΄ΡƒΠ»ΡŒ являСтся Π±ΠΎΠ»Π΅Π΅ бСзопасным ΠΈ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π±ΠΎΠ»Π΅Π΅ эффСктивным для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ YOLO . ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ Π½Π° основС процСссов создаСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ пространства памяти, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ глобальной Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (GIL) ΠΈ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ риск возникновСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠΎΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСзависимо со своим экзСмпляром ΠΌΠΎΠ΄Π΅Π»ΠΈ YOLO .

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ΅ Π½Π° основС процСссов Π² модСлях YOLO ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° страницС Thread-Safe Inference.

πŸ“… Π‘ΠΎΠ·Π΄Π°Π½ΠΎ 1 Π³ΠΎΠ΄ Π½Π°Π·Π°Π΄ ✏️ ОбновлСно 3 мСсяца Π½Π°Π·Π°Π΄

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ