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

Π˜Π·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² сСгмСнтации

ПослС выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ Segment Task ΠΈΠ½ΠΎΠ³Π΄Π° Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΡƒΠΌΠΎΠ·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π’ этом руководствС приводится ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π΅Ρ†Π΅ΠΏΡ‚, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽΡ€Π΅ΠΆΠΈΠΌΠ° Ultralytics PredictMode.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ сСгмСнтации ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²

  1. ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ руководство ΠΏΠΎ установкС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅Ultralytics Quickstart Installation.


  2. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ модСль ΠΈ запуститС predict() ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° источникС.

    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolo11n-seg.pt")
    
    # Run inference
    results = model.predict()
    

    НСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ прСдсказаний?

    Π‘Π΅Π· указания источника Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

    'ultralytics/assets/bus.jpg'
    'ultralytics/assets/zidane.jpg'
    

    Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для быстрого тСстирования с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ predict() ΠΌΠ΅Ρ‚ΠΎΠ΄.

    Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ модСлях сСгмСнтации ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° сайтС Π—Π°Π΄Π°Ρ‡Π° сСгмСнта Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ predict() ΠΌΠ΅Ρ‚ΠΎΠ΄, см. Π Π΅ΠΆΠΈΠΌ прСдсказания Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ДокумСнтация.


  3. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ΡΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ ΠΈ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°ΠΌ. Для Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… процСссов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хотят ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ„Π°ΠΉΠ», исходноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ base-name ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ class-label ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ использования (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ).

    from pathlib import Path
    
    import numpy as np
    
    # (2) Iterate detection results (helpful for multiple images)
    for r in res:
        img = np.copy(r.orig_img)
        img_name = Path(r.path).stem  # source image base-name
    
        # Iterate each object contour (multiple detections)
        for ci, c in enumerate(r):
            # (1) Get detection class name
            label = c.names[c.boxes.cls.tolist().pop()]
    
    1. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ обнаруТСния, см. Ρ€Π°Π·Π΄Π΅Π» Вставки для Ρ€Π΅ΠΆΠΈΠΌΠ° прогнозирования.
    2. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ predict() Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ см. Π Π°Π±ΠΎΡ‚Π° с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ для Ρ€Π΅ΠΆΠΈΠΌΠ° Predict
    For-Loop

    Для ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ изобраТСния ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Для ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ изобраТСния с СдинствСнным ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.


  4. НачнитС с создания Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ маски ΠΈΠ· исходного изобраТСния, Π° Π·Π°Ρ‚Π΅ΠΌ нарисуйтС Π½Π° Π½Π΅ΠΉ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚ΡƒΡ€. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… частСй изобраТСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· bus.jpg для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… person ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ справа.

    Π”Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ масочноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

    import cv2
    
    # Create binary mask
    b_mask = np.zeros(img.shape[:2], np.uint8)
    
    # (1) Extract contour result
    contour = c.masks.xy.pop()
    # (2) Changing the type
    contour = contour.astype(np.int32)
    # (3) Reshaping
    contour = contour.reshape(-1, 1, 2)
    
    
    # Draw contour onto mask
    _ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
    
    1. Для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ c.masks.xy см. Π Π°Π·Π΄Π΅Π» "Маски" ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° прогнозирования.

    2. Π—Π΄Π΅ΡΡŒ значСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² np.int32 для совмСстимости с drawContours() функция ΠΎΡ‚ OpenCV.

    3. OpenCV drawContours() Ѐункция ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ [N, 1, 2] Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π» Π½ΠΈΠΆΠ΅ для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

    Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ contour пСрСмСнная.

    • c.masks.xy :: ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° маски Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (x, y). Для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ см. Π Π°Π·Π΄Π΅Π» "Маски" ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° прогнозирования.

    • .pop() :: Как masks.xy являСтся списком, содСрТащим ΠΎΠ΄ΠΈΠ½ элСмСнт, этот элСмСнт извлСкаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pop() ΠΌΠ΅Ρ‚ΠΎΠ΄.

    • .astype(np.int32) :: ИспользованиС masks.xy вСрнСтся с Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… float32Π½ΠΎ это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ совмСстимо с OpenCV. drawContours() функция ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° int32 для совмСстимости.

    • .reshape(-1, 1, 2) :: ΠŸΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ [N, 1, 2] Π³Π΄Π΅ N количСство Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… прСдставлСна ΠΎΠ΄Π½ΠΎΠΉ записью 1, ΠΈ запись состоит ΠΈΠ· 2 цСнности. Π‘Π°ΠΉΡ‚ -1 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ число Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² этом ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΈ Π³ΠΈΠ±ΠΊΠΎΠ΅.

    Π Π°Π·Π²Π΅Ρ€Π½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ объяснСниС drawContours() конфигурация.

    • Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ contour пСрСмСнная Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках, [contour]Π’ Ρ…ΠΎΠ΄Π΅ тСстирования Π±Ρ‹Π»ΠΎ установлСно, Ρ‡Ρ‚ΠΎ ΠΎΠ½ эффСктивно Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΆΠ΅Π»Π°Π΅ΠΌΡƒΡŽ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π½ΡƒΡŽ маску.

    • Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1 ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ для drawContours() ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ всС ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

    • Π‘Π°ΠΉΡ‚ tuple (255, 255, 255) прСдставляСт собой Π±Π΅Π»Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ для рисования ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° Π² этой Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ маскС.

    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ cv2.FILLED окрасит всС пиксСли, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π² Π³Ρ€Π°Π½ΠΈΡ†Ρƒ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°, Π² ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ†Π²Π΅Ρ‚, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС всС Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ пиксСли Π±ΡƒΠ΄ΡƒΡ‚ Π±Π΅Π»Ρ‹ΠΌΠΈ.

    • Π‘ΠΌ. ДокумСнтация ΠΏΠΎ OpenCV Π½Π° drawContours() для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.


  5. Π”Π°Π»Π΅Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ΡΡ 2 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ с этой Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ….

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ изоляции ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€

    # Create 3-channel mask
    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    
    # Isolate object with binary mask
    isolated = cv2.bitwise_and(mask3ch, img)
    
    Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?
    • Π‘Π½Π°Ρ‡Π°Π»Π° двоичная маска прСобразуСтся ΠΈΠ· одноканального изобраТСния Π² Ρ‚Ρ€Π΅Ρ…ΠΊΠ°Π½Π°Π»ΡŒΠ½ΠΎΠ΅. Π­Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ этапа, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ маска ΠΈ исходноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ. Оба изобраТСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство ΠΊΠ°Π½Π°Π»ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ совмСстимыми с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ смСшивания.

    • Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ‚Ρ€Π΅Ρ…ΠΊΠ°Π½Π°Π»ΡŒΠ½Π°Ρ бинарная маска ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ OpenCV bitwise_and(). Π­Ρ‚Π° опСрация сохраняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния пиксСлСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ большС нуля (> 0) ΠΈΠ· ΠΎΠ±ΠΎΠΈΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ пиксСли маски большС нуля (> 0) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π’ области ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ пиксСли, ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚ΡƒΡ€ исходного изобраТСния.

    Π˜Π·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‡Π΅Ρ€Π½Ρ‹Ρ… пиксСлСй: ΠŸΠΎΠ΄Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹

    ΠŸΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

    ΠŸΡ€ΠΈ сохранСнии ΠΏΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ изобраТСния Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий Π½Π΅ трСбуСтся.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π˜Π·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π§Π΅Ρ€Π½Ρ‹ΠΉ Ρ„ΠΎΠ½
    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°

    ΠžΠ±Ρ€Π΅Π·Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

    Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для ΠΎΠ±Ρ€Π΅Π·ΠΊΠΈ изобраТСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π΅Π·ΠΊΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ изобраТСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π° Ρ‡Π΅Ρ€Π½ΠΎΠΌ Ρ„ΠΎΠ½Π΅

    # (1) Bounding box coordinates
    x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
    # Crop image to object region
    iso_crop = isolated[y1:y2, x1:x2]
    

    1. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… создания ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°ΠΌΠΎΠΊ см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π Π°ΠΌΠΊΠΈ ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° прогнозирования
    Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ этот ΠΊΠΎΠ΄?
    • Π‘Π°ΠΉΡ‚ c.boxes.xyxy.cpu().numpy() Π’Ρ‹Π·ΠΎΠ² ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°ΠΌΠΊΠΈ Π² Π²ΠΈΠ΄Π΅ массива NumPy Π² xyxy Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Π³Π΄Π΅ xmin, ymin, xmax, ΠΈ ymax ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΈ. Π‘ΠΌ. БСкция боксов ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° прогнозирования для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

    • Π‘Π°ΠΉΡ‚ squeeze() ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ удаляСт лишниС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΈΠ· массива NumPy, обСспСчивая Π΅Π³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ.

    • ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ .astype(np.int32) измСняСт Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ с float32 Π½Π° int32Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΡ… совмСстимыми для ΠΎΠ±Ρ€Π΅Π·ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ индСксных Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ².

    • НаконСц, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΈ вырСзаСтся ΠΈΠ· изобраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ индСксной Π½Π°Ρ€Π΅Π·ΠΊΠΈ. Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [ymin:ymax, xmin:xmax] ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΈ обнаруТСния.

    # Isolate object with transparent background (when saved as PNG)
    isolated = np.dstack([img, b_mask])
    
    Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?
    • ИспользованиС NumPy dstack() (ΡƒΠΊΠ»Π°Π΄ΠΊΠ° массива ΠΏΠΎ оси Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹) Π² сочСтании со сгСнСрированной Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ маской создаст ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ. Π­Ρ‚ΠΎ позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всС пиксСли Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ сохранСнии Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ PNG Ρ„Π°ΠΉΠ».

    Π˜Π·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹Ρ… пиксСлСй: ΠŸΠΎΠ΄Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹

    ΠŸΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

    ΠŸΡ€ΠΈ сохранСнии ΠΏΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ изобраТСния Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий Π½Π΅ трСбуСтся.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π˜Π·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π΅Π· Ρ„ΠΎΠ½Π°
    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ изобраТСния + ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ Ρ„ΠΎΠ½

    ΠžΠ±Ρ€Π΅Π·Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

    Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для ΠΎΠ±Ρ€Π΅Π·ΠΊΠΈ изобраТСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π΅Π·ΠΊΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ изобраТСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π΅Π· Ρ„ΠΎΠ½Π°

    # (1) Bounding box coordinates
    x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
    # Crop image to object region
    iso_crop = isolated[y1:y2, x1:x2]
    

    1. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… создания ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°ΠΌΠΎΠΊ см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π Π°ΠΌΠΊΠΈ ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° прогнозирования
    Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ этот ΠΊΠΎΠ΄?
    • ΠŸΡ€ΠΈ использовании c.boxes.xyxy.cpu().numpy()Π“Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Π΅ поля Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ массива NumPy, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ xyxy Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ бокса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ xmin, ymin, xmax, ymax для ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΈ (ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°), см. БСкция боксов ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° прогнозирования для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

    • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ squeeze() Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ всС лишниС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΈΠ· массива NumPy.

    • ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ .astype(np.int32) измСняСт Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ с float32 Π½Π° int32 ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ совмСстимы ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π΅Π·ΠΊΠ΅ изобраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ индСксных Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ².

    • НаконСц, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ изобраТСния для ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поля обрСзаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ индСксной Π½Π°Ρ€Π΅Π·ΠΊΠΈ, Π³Π΄Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ [ymin:ymax, xmin:xmax] ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΈ обнаруТСния.

    А Ссли ΠΌΠ½Π΅ Π½ΡƒΠΆΠ΅Π½ ΠΎΠ±Ρ€Π΅Π·Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ , Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„ΠΎΠ½?

    Π­Ρ‚ΠΎ встроСнная функция Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ultralytics . Π‘ΠΌ. save_crop Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π·Π° АргумСнты для ΡƒΠΌΠΎΠ·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ прСдсказания для Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ.


  6. Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ дальшС, зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ вас ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² дСйствий (сохранСниС изобраТСния Π² Ρ„Π°ΠΉΠ» для дальнСйшСго использования).

    • ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•: этот шаг Π½Π΅ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½, Ссли ΠΎΠ½ Π½Π΅ трСбуСтся для вашСго ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ случая использования.
    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π—Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ шаг
    # Save isolated object to file
    _ = cv2.imwrite(f"{img_name}_{label}-{ci}.png", iso_crop)
    
    • Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ img_name Π±Π°Π·ΠΎΠ²ΠΎΠ΅ имя исходного Ρ„Π°ΠΉΠ»Π° изобраТСния, label это имя ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ класса, Π° ci индСкс ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Π² случаС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… экзСмпляров с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ класса).

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

Π—Π΄Π΅ΡΡŒ всС шаги ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ Π² ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°. Для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ»ΠΈ всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, содСрТащиСся Π² for-ΠΏΠ΅Ρ‚Π»ΠΈ, Π½ΠΎ это ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ остаСтся Π½Π° усмотрСниС читатСля.

from pathlib import Path

import cv2
import numpy as np

from ultralytics import YOLO

m = YOLO("yolo11n-seg.pt")  # (4)!
res = m.predict()  # (3)!

# Iterate detection results (5)
for r in res:
    img = np.copy(r.orig_img)
    img_name = Path(r.path).stem

    # Iterate each object contour (6)
    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]

        b_mask = np.zeros(img.shape[:2], np.uint8)

        # Create contour mask (1)
        contour = c.masks.xy.pop().astype(np.int32).reshape(-1, 1, 2)
        _ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)

        # Choose one:

        # OPTION-1: Isolate object with black background
        mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
        isolated = cv2.bitwise_and(mask3ch, img)

        # OPTION-2: Isolate object with transparent background (when saved as PNG)
        isolated = np.dstack([img, b_mask])

        # OPTIONAL: detection crop (from either OPT1 or OPT2)
        x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
        iso_crop = isolated[y1:y2, x1:x2]

        # TODO your actions go here (2)
  1. Π‘Ρ‚Ρ€ΠΎΠΊΠ°, Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ contour ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ΡΡ Π² ΠΎΠ΄Π½Ρƒ строку здСсь, Π³Π΄Π΅ Π²Ρ‹ΡˆΠ΅ ΠΎΠ½Π° Π±Ρ‹Π»Π° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° нСсколько.
  2. Π§Ρ‚ΠΎ здСсь Π±ΡƒΠ΄Π΅Ρ‚, зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ вас!
  3. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π Π΅ΠΆΠΈΠΌ прогнозирования.
  4. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ БСгмСнтная Π·Π°Π΄Π°Ρ‡Π°.
  5. Π£Π·Π½Π°ΠΉΡ‚Π΅ большС ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ
  6. Π£Π·Π½Π°ΠΉΡ‚Π΅ большС ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… примСнСния маски сСгмСнтации

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

Как Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ultralytics YOLO11 для Π·Π°Π΄Π°Ρ‡ сСгмСнтации?

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ultralytics YOLO11 , Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

  1. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ модСль ΠΈ запуститС Π²Ρ‹Π²ΠΎΠ΄:

    from ultralytics import YOLO
    
    model = YOLO("yolo11n-seg.pt")
    results = model.predict(source="path/to/your/image.jpg")
    
  2. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π±ΠΈΠ½Π°Ρ€Π½ΡƒΡŽ маску ΠΈ нарисуйтС ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹:

    import cv2
    import numpy as np
    
    img = np.copy(results[0].orig_img)
    b_mask = np.zeros(img.shape[:2], np.uint8)
    contour = results[0].masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
    cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
    
  3. Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ маски:

    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    isolated = cv2.bitwise_and(mask3ch, img)
    

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ см. Π² руководствС ΠΏΠΎ Ρ€Π΅ΠΆΠΈΠΌΡƒ прогнозирования ΠΈ Π·Π°Π΄Π°Ρ‡Π΅ "Π‘Π΅Π³ΠΌΠ΅Π½Ρ‚".

КакиС ΠΎΠΏΡ†ΠΈΠΈ доступны для сохранСния ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² послС сСгмСнтации?

Ultralytics YOLO11 ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π΄Π²Π° основных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° сохранСния ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²:

  1. Π‘ Ρ‡Π΅Ρ€Π½Ρ‹ΠΌ Ρ„ΠΎΠ½ΠΎΠΌ:

    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    isolated = cv2.bitwise_and(mask3ch, img)
    
  2. Π‘ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ Ρ„ΠΎΠ½ΠΎΠΌ:

    isolated = np.dstack([img, b_mask])
    

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ "Π Π΅ΠΆΠΈΠΌ прогнозирования ".

Как ΠΎΠ±Ρ€Π΅Π·Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄ΠΎ ΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°ΠΌΠΎΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ultralytics YOLO11 ?

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π΅Π·Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄ΠΎ ΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°ΠΌΠΎΠΊ:

  1. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΈ:

    x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
    
  2. ΠžΠ±Ρ€Π΅ΠΆΡŒΡ‚Π΅ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

    iso_crop = isolated[y1:y2, x1:x2]
    

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… построСния ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ€Π΅ΠΆΠΈΠΌΡƒ Predict.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ultralytics YOLO11 для выдСлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π·Π°Π΄Π°Ρ‡Π°Ρ… сСгмСнтации?

Ultralytics YOLO11 обСспСчиваСт:

  • ВысокоскоростноС ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈ сСгмСнтация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.
  • Вочная гСнСрация ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°ΠΌΠΎΠΊ ΠΈ масок для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ выдСлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  • Π˜ΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π°Ρ докумСнтация ΠΈ простой Π² использовании API для эффСктивной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ прСимущСства использования YOLO Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Segment Task.

МоТно Π»ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„ΠΎΠ½, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ultralytics YOLO11 ?

Π”Π°, это встроСнная функция Π² Ultralytics YOLO11 . Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ save_crop Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² predict() ΠΌΠ΅Ρ‚ΠΎΠ΄. НапримСр:

results = model.predict(source="path/to/your/image.jpg", save_crop=True)

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ save_crop Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² АргумСнты для ΡƒΠΌΠΎΠ·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ прСдсказания Ρ€Π°Π·Π΄Π΅Π».

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

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