рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЬрд╛рдПрдВ

рдкреГрдердХ рд╡рд┐рднрд╛рдЬрди рд╡рд╕реНрддреБрдПрдВ

рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрднреА-рдХрднреА рдЕрдиреБрдорд╛рди рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдкреГрдердХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдиреБрд╕реНрдЦрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИUltralytics рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдбред

рдЙрджрд╛рд╣рд░рдг рдкреГрдердХ рд╡рд╕реНрддреБ рд╡рд┐рднрд╛рдЬрди

рдкрдХрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдирд╛

  1. рдЖрд╡рд╢реНрдпрдХ рдЖрдпрд╛рдд рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ

    from pathlib import Path
    
    import cv2
    import numpy as np
    from ultralytics import YOLO
    
    Ultralytics рдкрджрд╛рд╕реАрди рдХрд░рдирд╛

    рджреЗрдЦреЗрдВ Ultralytics рдХреНрд╡рд┐рдХрд╕реНрдЯрд╛рд░реНрдЯ рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдкрд░ рддреНрд╡рд░рд┐рдд рдкреВрд░реНрд╡рд╛рднреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдкрдирд╛ рдЕрдиреБрднрд╛рдЧред


  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. рдбрд┐рдЯреЗрдХреНрд╢рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдореЛрдб рдХреЗ рд▓рд┐рдП рдмреЙрдХреНрд╕реЗрдЬрд╝ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ.
    2. рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП predict() рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдирд╛
    рдлреЙрд░-рд▓реВрдк

    рдПрдХ рдПрдХрд▓ рдЫрд╡рд┐ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкрд╣рд▓реЗ рд▓реВрдк рдХреЛ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдЧреАред рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкрд╣рдЪрд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рдЫрд╡рд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓реВрдк рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдЧреАред


  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() рдУрдкрдирд╕реАрд╡реА рд╕реЗ рдлрд╝рдВрдХреНрд╢рдиред

    3. рдУрдкрдирд╕реАрд╡реА drawContours() рдлрд╝рдВрдХреНрд╢рди рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдХреГрддрд┐ рдХрд╛ рдЖрдХрд╛рд░ рд╣реЛрдЧрд╛ [N, 1, 2] рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред

    рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ contour рдЪрд░ред

    • c.masks.xy :: рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореБрдЦреМрдЯрд╛ рд╕рдореЛрдЪреНрдЪ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (x, y). рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рд╕реЗ рдорд╛рд╕реНрдХ рдЕрдиреБрднрд╛рдЧ.

    • .pop() ::рдЬреИрд╕рд╛ masks.xy рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рддрддреНрд╡ рд╣реИ, рдЗрд╕ рддрддреНрд╡ рдХреЛ pop() рд╡рд┐рдзрд┐ред

    • .astype(np.int32) ::рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ masks.xy рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ float32, рд▓реЗрдХрд┐рди рдпрд╣ рдУрдкрдирд╕реАрд╡реА рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ 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('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
рд▓реЗрдЦрдХ: рдЧреНрд▓реЗрди-рдЬреЛрдЪрд░ (6), рд░рд┐рдЬрд╡рд╛рдирдореБрдирд╡реНрд╡рд░ (1), рдмреБрд░рд╣рд╛рди-рдХреНрдпреВ (1)

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ