─░├žeri─če ge├ž

Segmentasyon Nesnelerini ─░zole Etme

Segment G├Ârevini ger├žekle┼čtirdikten sonra, bazen ├ž─▒kar─▒m sonu├žlar─▒ndan izole edilmi┼č nesneleri ├ž─▒karmak istenebilir. Bu k─▒lavuz, Ultralytics Predict Modunu kullanarak bunun nas─▒l ger├žekle┼čtirilece─čine dair genel bir tarif sunmaktad─▒r.

├ľrnek ─░zole Nesne Segmentasyonu

Tarif Gezintisi

  1. Gerekli ithalatlarla ba┼člay─▒n

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

    Gerekli k├╝t├╝phanelerin kurulumuna ili┼čkin h─▒zl─▒ bir k─▒lavuz i├žin Ultralytics H─▒zl─▒ Ba┼člang─▒├ž Kurulumu b├Âl├╝m├╝ne bak─▒n.


  2. Bir model y├╝kleyin ve ├žal─▒┼čt─▒r─▒n predict() y├Ântemini bir kaynak ├╝zerinde kullanabilirsiniz.

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

    Tahmin Arg├╝man─▒ Yok mu?

    Bir kaynak belirtilmedi─činde, k├╝t├╝phanedeki ├Ârnek g├Âr├╝nt├╝ler kullan─▒lacakt─▒r:

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

    Bu, a┼ča─č─▒dakilerle h─▒zl─▒ test i├žin yararl─▒d─▒r predict() y├Ântem.

    Segmentasyon Modelleri hakk─▒nda daha fazla bilgi i├žin Segment G├Ârevi sayfa. Hakk─▒nda daha fazla bilgi edinmek i├žin predict() y├Ântemi i├žin bkz. Tahmin Modu Dok├╝mantasyon b├Âl├╝m├╝.


  3. ┼×imdi sonu├žlar ve konturlar ├╝zerinde yineleme yap─▒n. Bir g├Âr├╝nt├╝y├╝ dosyaya kaydetmek isteyen i┼č ak─▒┼člar─▒ i├žin, kaynak g├Âr├╝nt├╝ base-name ve tespit class-label daha sonra kullan─▒lmak ├╝zere al─▒n─▒r (iste─če ba─čl─▒).

    # (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. Tespit sonu├žlar─▒yla ├žal─▒┼čma hakk─▒nda daha fazla bilgi edinmek i├žin Tahmin Modu i├žin Kutular B├Âl├╝m├╝ne bak─▒n.
    2. Hakk─▒nda daha fazla bilgi edinmek i├žin predict() sonu├žlar bak─▒n─▒z Tahmin Modu i├žin Sonu├žlarla ├çal─▒┼čma
    For-Loop

    Tek bir g├Âr├╝nt├╝ ilk d├Âng├╝y├╝ yaln─▒zca bir kez yineleyecektir. Yaln─▒zca tek bir alg─▒lamaya sahip tek bir g├Âr├╝nt├╝, her d├Âng├╝y├╝ yaln─▒zca bir kez yineleyecektir.


  4. Kaynak g├Âr├╝nt├╝den ikili bir maske olu┼čturarak ba┼člay─▒n ve ard─▒ndan maskenin ├╝zerine dolgulu bir kontur ├žizin. Bu, nesnenin g├Âr├╝nt├╝n├╝n di─čer k─▒s─▒mlar─▒ndan izole edilmesini sa─člayacakt─▒r. Bir ├Ârnek bus.jpg tespit edilenlerden biri i├žin person s─▒n─▒f nesneleri sa─čda g├Âsterilmektedir.

    ─░kili Maske G├Âr├╝nt├╝s├╝

    # 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. Daha fazla bilgi i├žin c.masks.xy bkz. Tahmin Modundan Maskeler B├Âl├╝m├╝.

    2. Burada de─čerler np.int32 ile uyumluluk i├žin drawContours() OpenCV'den fonksiyon.

    3. OpenCV drawContours() fonksiyonu konturlar─▒n ┼ču ┼čekle sahip olmas─▒n─▒ bekler [N, 1, 2] daha fazla ayr─▒nt─▒ i├žin a┼ča─č─▒daki b├Âl├╝m├╝ geni┼čletin.

    Tan─▒mlarken neler oldu─čunu anlamak i├žin geni┼čletin contour de─či┼čken.

    • c.masks.xy :: Maske kontur noktalar─▒n─▒n koordinatlar─▒n─▒ ┼ču formatta sa─člar (x, y). Daha fazla ayr─▒nt─▒ i├žin bkz. Tahmin Modundan Maskeler B├Âl├╝m├╝.

    • .pop() :: Gibi masks.xy tek bir eleman i├žeren bir liste ise, bu eleman pop() y├Ântem.

    • .astype(np.int32) :: Kullanma masks.xy veri t├╝r├╝ ile d├Ânecektir. float32ancak bu OpenCV ile uyumlu olmayacakt─▒r drawContours() i┼člevini kullanaca─č─▒z, bu nedenle veri t├╝r├╝n├╝ int32 uyumluluk i├žin.

    • .reshape(-1, 1, 2) :: Verileri istenen ┼čekilde yeniden bi├žimlendirir [N, 1, 2] nerede N kontur noktalar─▒n─▒n say─▒s─▒d─▒r ve her nokta tek bir giri┼čle temsil edilir 1ve giri┼č ┼čunlardan olu┼čur 2 de─čerler. Bu de─čerler -1 bu boyut boyunca de─čer say─▒s─▒n─▒n esnek oldu─čunu belirtir.

    A├ž─▒klama i├žin geni┼čletin drawContours() Yap─▒land─▒rma.

    • Kaps├╝lleme contour k├Â┼čeli parantez i├žindeki de─či┼čken, [contour]'nin test s─▒ras─▒nda istenen kontur maskesini etkili bir ┼čekilde olu┼čturdu─ču g├Âr├╝lm├╝┼čt├╝r.

    • De─čer -1 i├žin belirtilen drawContours() parametresi, i┼čleve g├Âr├╝nt├╝de bulunan t├╝m konturlar─▒ ├žizme talimat─▒ verir.

    • Bu tuple (255, 255, 255) bu ikili maskede kontur ├žizmek i├žin istenen renk olan beyaz rengi temsil eder.

    • Eklenmesi cv2.FILLED kontur s─▒n─▒r─▒ taraf─▒ndan ├ževrelenen t├╝m pikselleri ayn─▒ ┼čekilde renklendirir; bu durumda, ├ževrelenen t├╝m pikseller beyaz olacakt─▒r.

    • Bkz. OpenCV Dok├╝mantasyonu drawContours() daha fazla bilgi i├žin.


  5. Daha sonra, bu noktadan sonra g├Âr├╝nt├╝yle nas─▒l ilerlenece─čine dair 2 se├ženek ve her biri i├žin bir sonraki se├ženek vard─▒r.

    Nesne ─░zolasyonu Se├ženekleri

    # Create 3-channel mask
    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    
    # Isolate object with binary mask
    isolated = cv2.bitwise_and(mask3ch, img)
    
    Bu nas─▒l ├žal─▒┼č─▒yor?
    • ─░lk olarak, ikili maske tek kanall─▒ bir g├Âr├╝nt├╝den ├╝├ž kanall─▒ bir g├Âr├╝nt├╝ye d├Ân├╝┼čt├╝r├╝l├╝r. Bu d├Ân├╝┼čt├╝rme, maskenin ve orijinal g├Âr├╝nt├╝n├╝n birle┼čtirildi─či sonraki ad─▒m i├žin gereklidir. Kar─▒┼čt─▒rma i┼člemiyle uyumlu olmas─▒ i├žin her iki g├Âr├╝nt├╝n├╝n de ayn─▒ say─▒da kanala sahip olmas─▒ gerekir.

    • Orijinal g├Âr├╝nt├╝ ve ├╝├ž kanall─▒ ikili maske OpenCV i┼člevi kullan─▒larak birle┼čtirilir bitwise_and(). Bu i┼člem a┼ča─č─▒dakileri korur sadece s─▒f─▒rdan b├╝y├╝k piksel de─čerleri (> 0) her iki g├Âr├╝nt├╝den de. Maske pikselleri s─▒f─▒rdan b├╝y├╝k oldu─ču i├žin (> 0) sadece Kontur b├Âlgesi i├žinde, orijinal g├Âr├╝nt├╝den kalan pikseller konturla ├Ârt├╝┼čen piksellerdir.

    Siyah Piksellerle ─░zole Et: Alt se├ženekler

    Tam Boyutlu G├Âr├╝nt├╝

    Tam boyutlu g├Âr├╝nt├╝y├╝ saklamak i├žin ek bir ad─▒m gerekmez.

    ├ľrnek Tam Boyutlu ─░zole Nesne G├Âr├╝nt├╝s├╝ Siyah Arka Plan
    ├ľrnek tam boyutlu ├ž─▒kt─▒

    K─▒rp─▒lm─▒┼č nesne g├Âr├╝nt├╝s├╝

    G├Âr├╝nt├╝y├╝ yaln─▒zca nesne b├Âlgesini i├žerecek ┼čekilde k─▒rpmak i├žin ek ad─▒mlar gerekir.

    ├ľrnek K─▒rp─▒lm─▒┼č ─░zole Nesne G├Âr├╝nt├╝s├╝ Siyah Arka Plan

    # (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. S─▒n─▒rlay─▒c─▒ kutu sonu├žlar─▒ hakk─▒nda daha fazla bilgi i├žin Tahmin Modundan Kutular B├Âl├╝m├╝ne bak─▒n
    Bu kod ne i┼če yar─▒yor?
    • Bu c.boxes.xyxy.cpu().numpy() ├ža─čr─▒s─▒, s─▒n─▒rlay─▒c─▒ kutular─▒ bir NumPy dizisi olarak xyxy bi├žimi, burada xmin, ymin, xmaxve ymax s─▒n─▒rlay─▒c─▒ kutu dikd├Ârtgeninin koordinatlar─▒n─▒ temsil eder. Bkz. Tahmin Modundan Kutular B├Âl├╝m├╝ daha fazla ayr─▒nt─▒ i├žin.

    • Bu squeeze() i┼člemi NumPy dizisindeki gereksiz boyutlar─▒ kald─▒rarak dizinin beklenen ┼čekle sahip olmas─▒n─▒ sa─člar.

    • Koordinat de─čerlerini kullanarak d├Ân├╝┼čt├╝rme .astype(np.int32) kutu koordinatlar─▒ veri t├╝r├╝n├╝ float32 i├žin int32Bu da onlar─▒ dizin dilimleri kullanarak g├Âr├╝nt├╝ k─▒rpma i├žin uyumlu hale getirir.

    • Son olarak, s─▒n─▒rlay─▒c─▒ kutu b├Âlgesi dizin dilimleme kullan─▒larak g├Âr├╝nt├╝den k─▒rp─▒l─▒r. S─▒n─▒rlar ┼ču ┼čekilde tan─▒mlan─▒r [ymin:ymax, xmin:xmax] alg─▒lama s─▒n─▒rlay─▒c─▒ kutusunun koordinatlar─▒.

    # Isolate object with transparent background (when saved as PNG)
    isolated = np.dstack([img, b_mask])
    
    Bu nas─▒l ├žal─▒┼č─▒yor?
    • NumPy'yi Kullanma dstack() fonksiyonu (derinlik ekseni boyunca dizi istifleme) olu┼čturulan ikili maske ile birlikte d├Ârt kanall─▒ bir g├Âr├╝nt├╝ olu┼čturacakt─▒r. Bu, nesne konturunun d─▒┼č─▒ndaki t├╝m piksellerin g├Âr├╝nt├╝ olarak kaydedilirken ┼čeffaf olmas─▒n─▒ sa─člar. PNG Dosya.

    ┼×effaf Piksellerle ─░zole Et: Alt se├ženekler

    Tam Boyutlu G├Âr├╝nt├╝

    Tam boyutlu g├Âr├╝nt├╝y├╝ saklamak i├žin ek bir ad─▒m gerekmez.

    ├ľrnek Tam Boyutlu ─░zole Nesne G├Âr├╝nt├╝s├╝ Arka Plan Yok
    ├ľrnek tam boyutlu ├ž─▒kt─▒ + ┼čeffaf arka plan

    K─▒rp─▒lm─▒┼č nesne g├Âr├╝nt├╝s├╝

    G├Âr├╝nt├╝y├╝ yaln─▒zca nesne b├Âlgesini i├žerecek ┼čekilde k─▒rpmak i├žin ek ad─▒mlar gerekir.

    ├ľrnek K─▒rpma ─░zole Nesne G├Âr├╝nt├╝s├╝ Arka Plan Yok

    # (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. S─▒n─▒rlay─▒c─▒ kutu sonu├žlar─▒ hakk─▒nda daha fazla bilgi i├žin Tahmin Modundan Kutular B├Âl├╝m├╝ne bak─▒n
    Bu kod ne i┼če yar─▒yor?
    • Kullan─▒rken c.boxes.xyxy.cpu().numpy()kullan─▒larak s─▒n─▒rlay─▒c─▒ kutular bir NumPy dizisi olarak d├Ând├╝r├╝l├╝r. xyxy noktalar─▒na kar┼č─▒l─▒k gelen kutu koordinatlar─▒ bi├žimi xmin, ymin, xmax, ymax s─▒n─▒rlay─▒c─▒ kutu (dikd├Ârtgen) i├žin bkz. Tahmin Modundan Kutular B├Âl├╝m├╝ daha fazla bilgi i├žin.

    • Ekleme squeeze() NumPy dizisinden gereksiz boyutlar─▒n kald─▒r─▒lmas─▒n─▒ sa─člar.

    • Koordinat de─čerlerini kullanarak d├Ân├╝┼čt├╝rme .astype(np.int32) kutu koordinatlar─▒ veri t├╝r├╝n├╝ float32 i├žin int32 indeks dilimleri kullanarak g├Âr├╝nt├╝y├╝ k─▒rparken uyumlu olacakt─▒r.

    • Son olarak, s─▒n─▒rlay─▒c─▒ kutu i├žin g├Âr├╝nt├╝ b├Âlgesi dizin dilimleme kullan─▒larak k─▒rp─▒l─▒r ve burada s─▒n─▒rlar [ymin:ymax, xmin:xmax] alg─▒lama s─▒n─▒rlay─▒c─▒ kutusunun koordinatlar─▒.

    Arka plan dahil k─▒rp─▒lm─▒┼č nesneyi istersem ne olur?

    Bu, Ultralytics k├╝t├╝phanesi i├žin yerle┼čik bir ├Âzelliktir. Bkz. save_crop i├žin arg├╝man Tahmin Modu ├ç─▒kar─▒m Arg├╝manlar─▒ detaylar i├žin.


  6. Bundan sonra ne yap─▒laca─č─▒ tamamen geli┼čtirici olarak size b─▒rak─▒lm─▒┼čt─▒r. Olas─▒ bir sonraki ad─▒m─▒n (g├Âr├╝nt├╝y├╝ ileride kullanmak ├╝zere dosyaya kaydetme) temel bir ├Ârne─či g├Âsterilmektedir.

    • NOT: bu ad─▒m iste─če ba─čl─▒d─▒r ve ├Âzel kullan─▒m durumunuz i├žin gerekli de─čilse atlanabilir.
    ├ľrnek Son Ad─▒m
    # Save isolated object to file
    _ = cv2.imwrite(f"{img_name}_{label}-{ci}.png", iso_crop)
    
    • Bu ├Ârnekte, a┼ča─č─▒daki img_name kaynak g├Âr├╝nt├╝ dosyas─▒n─▒n temel ad─▒d─▒r, label alg─▒lanan s─▒n─▒f ad─▒d─▒r ve ci nesne tespitinin indeksidir (ayn─▒ s─▒n─▒f ad─▒na sahip birden fazla ├Ârnek olmas─▒ durumunda).

Tam ├ľrnek kod

Burada, ├Ânceki b├Âl├╝mdeki t├╝m ad─▒mlar tek bir kod blo─čunda birle┼čtirilmi┼čtir. Tekrarlanan kullan─▒mlar i├žin, a┼ča─č─▒daki komutlar─▒n bir k─▒sm─▒n─▒ ya da tamam─▒n─▒ yerine getirecek bir fonksiyon tan─▒mlamak en uygunudur for-D├Âng├╝ler, ancak bu okuyucuya b─▒rak─▒lm─▒┼č bir al─▒┼čt─▒rmad─▒r.

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. Dolduran sat─▒r contour yukar─▒da birden fazla sat─▒ra b├Âl├╝nm├╝┼čken burada tek bir sat─▒rda birle┼čtirilmi┼čtir.
  2. Buraya ne koyaca─č─▒n─▒z size kalm─▒┼č!
  3. Daha fazla bilgi i├žin Tahmin Modu b├Âl├╝m├╝ne bak─▒n.
  4. Daha fazla bilgi i├žin Segment G├Ârevi b├Âl├╝m├╝ne bak─▒n.
  5. Sonu├žlarla ├çal─▒┼čma hakk─▒nda daha fazla bilgi edinin
  6. Segmentasyon Maskesi Sonu├žlar─▒ hakk─▒nda daha fazla bilgi edinin


Created 2023-11-27, Updated 2024-06-10
Authors: glenn-jocher (10), IvorZhu331 (1), RizwanMunawar (1), Burhan-Q (1)

Yorumlar