YOLO Vision 2026:

Ultralytics YOLO ile Segmentasyon Nesnelerini İzole Etme#

Örnek bölümleme, algılanan her nesne için piksel hassasiyetinde bir maske üretir; bu da her nesneyi bir görselden tek başına ayırabilmen anlamına gelir. Bu kılavuz, Predict Mode ve OpenCV kullanarak Ultralytics YOLO bölümleme sonuçlarını, PNG olarak kaydetmek için düz siyah arka plan veya şeffaf arka planla izole edilmiş nesnelere nasıl dönüştüreceğini gösterir.



Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀

Neden Segmentasyon Nesnelerini İzole Etmelisin?#

Bireysel nesneleri görüntüden ayırmak, bir dizi sonraki iş akışının önünü açar:

  • Ürün çekimleri, kataloglar veya yaratıcı düzenlemeler için arka plan kaldırma.
  • Algılamalarından sınıflandırma veri setleri oluşturmak için nesne bazlı kırpmalar.
  • OCR, renk analizi veya ölçüm gibi sonraki adımların çevredeki sahneyi değil, yalnızca nesneyi görmesi için odaklanmış işleme.
  • Nesneleri yeni arka planlar üzerinde birleştirmek için şeffaf PNG dışa aktarımı.

Bu yöntem, herhangi bir Ultralytics YOLO bölümleme modeliyle çalışır ve dört aşamadan oluşur: çıkarım çalıştırher konturu çıkarnesneyi izole etsonucu kaydet.

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

Gerekli kütüphaneleri kur, ardından bir bölümleme modeli yükle (-seg eki, maske üretmek için gereklidir) ve kaynak görselin üzerinde tahmin çalıştır:

from ultralytics import YOLO

# Load a segmentation model
model = YOLO("yolo26n-seg.pt")

# Run inference on a source
results = model.predict(source="path/to/image.jpg")
Kaynak yok mu? YOLO, paketle birlikte gelen örnek görüntüleri kullanır

Eğer model.predict() değerini bir source olmadan çağırırsan, Ultralytics paketle birlikte gelen örnek görsellere (bus.jpg ve zidane.jpg) geri döner; bu da iş akışını hızlıca test etmek için oldukça pratiktir.

Nesne Konturlarını Çıkar#

results içindeki her öğe tek bir görsele karşılık gelir ve bir sonuç üzerinde döngü kurmak her seferinde tek bir algılama döndürür. Her algılama için orijinal görseli kopyala, sınıf etiketini oku ve nesnenin maske konturunu boş bir ikili maske üzerine çiz. Bu maskenin beyaz alanı, hangi piksellerin tam olarak nesneye ait olduğunu işaretler.

Bu ve sonraki bölümde yer alan kod parçacıkları, aşağıdaki algılama döngüsünün içinde çalışır; kopyala-yapıştır yapılabilen eksiksiz betik Full Example adresindedir.

Binary Mask Image{ width="240", align="right" }

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  # source image base-name

    # Iterate each detected object in the image
    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]  # class name

        # Build a binary mask and draw the object contour onto it
        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], bu tekli algılama sonucundaki nesne için maske konturunu (x, y) nokta koordinatları olarak döndürür.
  • .astype(np.int32), OpenCV'nin drawContours() fonksiyonunun kabul etmediği noktaları float32 formatına dönüştürür.
  • .reshape(-1, 1, 2), N ifadesinin kontur noktası sayısı olduğu, drawContours() tarafından beklenen [N, 1, 2] düzenine göre noktaları yeniden şekillendirir.

[contour] değerini -1 indeksiyle birlikte geçirmek, sağlanan konturun tüm noktalarını çizer ve cv2.FILLED çevrelenen her pikseli beyazla doldurur.

Nesneyi İzole Et#

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

Bir izolasyon stili seç

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

# Isolate object with a black background
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)
![Example Full size Isolated Object Image Black Background](https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/full-size-isolated-object-black-background.avif){ width=240 }
Full-size object on a black background
Sınırlayıcı kutuya göre kırp

Tam boyutlu görüntü yerine yalnızca nesnenin olduğu bölgeyi tutmak için, onu algılamanın sınırlayıcı kutusuna göre dilimle:

# Bounding box coordinates
x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
# Crop the isolated image to the object region
iso_crop = isolated[y1:y2, x1:x2]
![Example Crop Isolated Object Image Black Background](https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/example-crop-isolated-object-image-black-background.avif){ width=240 }
Object cropped to its bounding box
Kırpmayı orijinal arka planıyla birlikte mi istiyorsun?

Bu yerleşiktir. save_crop=True değerini predict() içine aktar; Ultralytics, maskeleme gerektirmeden sınırlayıcı kutu kırpımlarını otomatik olarak kaydeder.

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

Her izole edilmiş nesneyle ne yapacağın sana kalmış. Yaygın bir sonraki adım, daha sonra kullanmak üzere diske yazmaktır:

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

Burada img_name kaynak görsel adıdır, label sınıf adıdır ve ci algılama indeksidir; böylece aynı sınıfın birden fazla örneği benzersiz dosya adlarına sahip olur. Yukarıdaki isteğe bağlı kırpma işlemini uyguladıysan isolated yerine iso_crop kullan.

Tam Örnek#

Aşağıdaki betik her adımı tek ve çalıştırılabilir bir blokta birleştirir. Varsayılan olarak siyah bir arka plan kullanır; bunun yerine şeffaf bir 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])

Tekrarlı kullanım için, döngü gövdesini bir fonksiyona sar, böylece onu birçok görüntüde çağırabilirsin.

Sonuç#

Artık Ultralytics YOLO ile bölütlenmiş nesneleri izole etmek için eksiksiz bir tarife sahipsin: çıkarım çalıştır, her konturdan ikili bir maske oluştur, ardından nesneyi siyah veya şeffaf bir arka plan üzerinde çı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 Task ve Predict Mode belgelerinin tamamını incele.

SSS#

Segmentasyon görevleri için Ultralytics YOLO kullanarak nesneleri nasıl izole ederim?#

Bir segmentasyon modeli yükle, çıkarım çalıştır, her algılamanın konturundan bir ikili maske oluştur ve bunu orijinal 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)

Algılama başına döngünün tamamı için Full Example bölümüne göz at.

Segmentasyondan sonra izole edilmiş nesneleri kaydetmek için hangi seçenekler mevcuttur?#

İki ana stil vardır. Siyah arka plan için maskeyi üç kanala dönüştür ve cv2.bitwise_and() kullan. Şeffaf arka plan için (PNG olarak kaydederken) maskeyi np.dstack([img, b_mask]) ile dördüncü bir alfa kanalı olarak yığınla. Her ikisi de Isolate the Object bölümünde gösterilmektedir.

İzole edilmiş nesneleri sınırlayıcı kutularına nasıl kırpabilirim?#

Algılamadan 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 edinmek için Predict Mode belgelerine göz at.

Segmentasyon görevlerinde nesne izolasyonu için neden Ultralytics YOLO kullanmalıyım?#

Ultralytics YOLO, doğru maske ve sınırlayıcı kutu üretimi ile hızlı, gerçek zamanlı örnek segmentasyonu sağlar; ayrıca çıkarım sonuçlarını birkaç satır OpenCV koduyla izole nesnelere dönüştüren basit bir Python API'sine sahiptir.

Ultralytics YOLO ile arka plan dahil izole nesneleri kaydedebilir miyim?#

Evet. Sınırlayıcı kutu kırpımlarını orijinal arka planlarıyla kaydetmek için predict() içindeki save_crop argümanını kullan:

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

Daha fazlasını Predict Mode Inference Arguments bölümünde oku.

Yorumlar