Ultralytics YOLO27:
Get Started

Ultralytics YOLO ile Segmentasyon Nesnelerini İzole Etme#

Örnek segmentasyonu, tespit edilen her nesne için piksel hassasiyetinde bir maske üretir; bu da her nesneyi görüntüden tek başına çıkarabileceğin anlamına gelir. Bu kılavuzda, Ultralytics YOLO segmentasyon sonuçlarını Tahmin Modu ve OpenCV kullanarak, siyah arka plan ya da PNG olarak kaydetmek üzere şeffaf arka plan ile izole nesnelere dönüştürme gösteriliyor.



İzle: Python'da Ultralytics YOLO segmentasyonu ve OpenCV ile arka planı kaldırıp nesneleri nasıl ayırırsın 🚀

Segmentasyon Nesneleri Neden İzole Edilir?#

Görüntüdeki nesneleri tek tek çıkarmak, çeşitli sonraki iş akışlarının önünü açar:

  • Ürün fotoğrafları, kataloglar veya yaratıcı düzenleme için arka planı kaldırma.
  • Tespit sonuçlarından sınıflandırma veri kümeleri oluşturmak için nesne başına kırpımlar.
  • OCR, renk analizi veya ölçüm gibi sonraki adımların çevredeki sahneyi değil, yalnızca nesneyi görmesini sağlayan odaklı işleme.
  • Nesneleri yeni arka planlara yerleştirmek için şeffaf PNG dışa aktarımı.

Bu yöntem tüm Ultralytics YOLO segmentasyon modelleriyle çalışır ve dört aşamadan oluşur: çıkarım çalıştır → her konturu çıkar → nesneyi izole et → sonucu kaydet.

Segmentasyon Çıkarımını Çalıştır#

Gerekli kütüphaneleri yükle, ardından bir segmentasyon modeli yükle (maskeler üretmek için gerekli -seg soneki) ve kaynak görüntün üzerinde tahmin çalıştır:

from ultralytics import YOLO

# Segmentasyon modeli yükle
model = YOLO("yolo26n-seg.pt")

# Bir kaynak üzerinde çıkarım çalıştır
results = model.predict(source="path/to/image.jpg")
Kaynağın yok mu? YOLO, paketle birlikte gelen örnek görüntüleri kullanır

source belirtmeden model.predict() çağırırsan Ultralytics, pakette gelen örnek görüntülere (bus.jpg ve zidane.jpg) geri döner; bu, iş akışını hızla test etmek için kullanışlıdır.

Nesne Konturlarını Çıkar#

results içindeki her öğe bir görüntüye karşılık gelir ve sonuç üzerinde yineleme yaptığında her seferinde bir tespit elde edersin. Her tespit için özgün görüntüyü kopyala, sınıf etiketini oku ve nesnenin maske konturunu boş bir ikili maskeye çiz. Bu maskenin beyaz bölgesi, nesneye ait pikselleri tam olarak gösterir.

Bu bölümdeki ve sonraki bölümdeki kod parçacıkları, aşağıdaki tespit döngüsünün içinde çalıştırılır; kodun tamamını kopyalayıp yapıştırabileceğin Tam Örnek bölümünde bulabilirsin.

Binary Mask Image
from pathlib import Path

import cv2
import numpy as np

for r in results:
    img = np.copy(r.orig_img)
    img_name = Path(r.path).stem  # kaynak görüntünün temel adı

    # Görüntüdeki tespit edilen her nesne üzerinde yinele
    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]  # sınıf adı

        # İkili maske oluştur ve nesne konturunu üzerine çiz
        b_mask = np.zeros(img.shape[:2], np.uint8)
        contour = c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
        cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
`c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)` ne yapar?
  • c.masks.xy[0], tek tespit içeren bu sonuçtaki nesneye ait maske konturunu (x, y) nokta koordinatları olarak döndürür.
  • .astype(np.int32), OpenCV'nin drawContours() işlevinin kabul etmediği float32 biçimindeki noktaları dönüştürür.
  • .reshape(-1, 1, 2), noktaları [N, 1, 2] düzenine dönüştürür; bu düzeni drawContours() bekler ve N kontur noktalarının sayısını belirtir.

[contour] değerini -1 diziniyle geçirmek, sağlanan konturun tüm noktalarını çizer; cv2.FILLED ise konturla çevrelenen tüm pikselleri beyaza boyar.

Nesneyi İzole Et#

İkili maske hazır olduğunda özgün görüntüyle birleştir. Arka planın nasıl görünmesini istediğine bağlı olarak iki yaygın yöntem vardır:

Bir yalıtma yöntemi seç

Maskeyi üç kanala dönüştür ve yalnızca nesneyle kesişen pikselleri tut. Konturun dışındaki her şey siyah olur:

# Nesneyi siyah arka planla izole et
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)
Example Full size Isolated Object Image Black Background
Siyah arka planda tam boyutlu nesne
Sınırlayıcı kutuya göre kırp

Tam boyutlu görüntü yerine yalnızca nesnenin bölgesini tutmak için tespit sonucunun sınırlayıcı kutusuna göre dilimle:

# Sınırlayıcı kutu koordinatları
x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
# İzole edilmiş görüntüyü nesne bölgesine göre kırp
iso_crop = isolated[y1:y2, x1:x2]
Example Crop Isolated Object Image Black Background
Sınırlayıcı kutusuna göre kırpılmış nesne
Kırpımı özgün arka planıyla mı istiyorsun?

Bu özellik zaten yerleşik olarak sunuluyor. save_crop=True değerini predict() işlevine aktar; Ultralytics, maske uygulaman gerekmeden sınırlayıcı kutu kırpımlarını otomatik olarak kaydeder.

Sonucu Kaydet (isteğe bağlı)#

Her izole nesneyle ne yapacağın sana bağlı. Sonraki adımlardan biri, daha sonra kullanmak üzere nesneyi diske yazmaktır:

# Save the isolated object to file
cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)

Burada img_name kaynak görüntünün temel adıdır, label sınıf adıdır ve ci tespit dizinidir; böylece aynı sınıfın birden fazla örneği benzersiz dosya adları alır. Yukarıdaki isteğe bağlı kırpmayı uyguladıysan isolated yerine iso_crop kullan.

Tam Örnek#

Aşağıdaki betik tüm adımları çalıştırılabilir tek bir kod bloğunda birleştirir. Varsayılan olarak siyah arka plan kullanır; bunun yerine şeffaf PNG elde etmek için işaretli tek satırı np.dstack([img, b_mask]) olarak değiştir:

from pathlib import Path

import cv2
import numpy as np

from ultralytics import YOLO

model = YOLO("yolo26n-seg.pt")
results = model.predict(source="path/to/image.jpg")

for r in results:
    img = np.copy(r.orig_img)
    img_name = Path(r.path).stem

    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]

        # Build a binary mask from the object contour
        b_mask = np.zeros(img.shape[:2], np.uint8)
        contour = c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
        cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)

        # Isolate the object (black background)
        mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
        isolated = cv2.bitwise_and(mask3ch, img)  # transparent PNG: isolated = np.dstack([img, b_mask])

        # Save or add your custom post-processing here
        cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)

        # Optional: crop to the bounding box before saving
        # x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
        # cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated[y1:y2, x1:x2])

Tekrar tekrar kullanmak için döngü gövdesini bir işleve sar; böylece bu işlevi birçok görüntü üzerinde çağırabilirsin.

Sonuç#

Artık Ultralytics YOLO ile segmentlere ayrılmış nesneleri izole etmek için eksiksiz bir yöntemin var: çıkarımı çalıştır, her konturdan ikili maske oluştur, ardından nesneyi siyah veya şeffaf arka planla çıkar ve isteğe bağlı olarak sınırlayıcı kutusuna göre kırp. İş akışını kendi sınıflarına uyarlamak için Segment Görevi ve Tahmin Modu belgelerinin tamamını incele.

Sık Sorulan Sorular#

  • Bir segmentasyon modeli yükle, çıkarımı çalıştır, her tespitin konturundan ikili maske oluştur ve bunu özgün görüntüyle birleştir:

    import cv2
    import numpy as np
    
    from ultralytics import YOLO
    
    model = YOLO("yolo26n-seg.pt")
    results = model.predict(source="path/to/your/image.jpg")
    
    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)
    
    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    isolated = cv2.bitwise_and(mask3ch, img)

    Tespit başına döngünün tamamı için Tam Örnek bölümüne bak.

  • İki temel yöntem vardır. Siyah arka plan için maskeyi üç kanala dönüştür ve cv2.bitwise_and() kullan. Şeffaf arka plan (PNG olarak kaydederken) için maskeyi dördüncü alfa kanalı olarak np.dstack([img, b_mask]) ile ekle. Her iki yöntem de Nesneyi İzole Et bölümünde gösterilmiştir.

  • Tespitten sınırlayıcı kutu koordinatlarını oku ve izole edilmiş görüntüyü dilimle:

    x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
    iso_crop = isolated[y1:y2, x1:x2]

    Sınırlayıcı kutu sonuçları hakkında daha fazla bilgi için Tahmin Modu belgelerine bak.

  • Ultralytics YOLO, doğru maskeler ve sınırlayıcı kutular oluşturarak hızlı, gerçek zamanlı örnek segmentasyonu sunar. Ayrıca çıkarım sonuçlarını birkaç satır OpenCV koduyla yalıtılmış nesnelere dönüştüren basit bir Python API’si sağlar.

  • Evet. Orijinal arka planlarıyla birlikte sınırlayıcı kutu kırpmalarını kaydetmek için save_crop bağımsız değişkenini predict() içinde kullan:

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

    Daha fazla bilgi için Tahmin Modu Çıkarım Bağımsız Değişkenleri bölümünü oku.

Yorumlar