ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ содСрТимому

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

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

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

ΠŸΡ€ΠΎΠ³ΡƒΠ»ΠΊΠ° ΠΏΠΎ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π°ΠΌ

  1. Начни с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°

    from pathlib import Path
    
    import cv2
    import numpy as np
    from ultralytics import YOLO
    
    Ultralytics Install

    Ознакомься с Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ Ultralytics Quickstart Installation, Π³Π΄Π΅ описана краткая инструкция ΠΏΠΎ установкС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.


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

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

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

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

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

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

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


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

    # (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. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ обнаруТСния, смотри Ρ€Π°Π·Π΄Π΅Π» "Вставки" для Ρ€Π΅ΠΆΠΈΠΌΠ° Predict.
    2. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ predict() Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π Π°Π±ΠΎΡ‚Π° с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ для Ρ€Π΅ΠΆΠΈΠΌΠ° Predict
    For-Loop

    ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с СдинствСнным ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.


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

    Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ маской

    # 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() ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ всС ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

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

    • The 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. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ€Π°ΠΌΠΊΠ°ΠΌΠΈ Ρ‡ΠΈΡ‚Π°ΠΉ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Боксы ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° Predict.
    Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ этот ΠΊΠΎΠ΄?
    • ΠŸΡ€ΠΈ использовании 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('yolov8n-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. Π£Π·Π½Π°ΠΉ большС ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… примСнСния маски сСгмСнтации


Боздано 2023-11-27, ОбновлСно 2024-04-27
Авторы: glenn-jocher (6), RizwanMunawar (1), Burhan-Q (1)

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