Link to this sectionUltralytics YOLO ile Segmentasyon Nesnelerini İzole Etme#
Örnek segmentasyonu, algılanan her nesne için piksel hassasiyetinde bir maske üretir; bu da her nesneyi görüntüden tek başına ayırabileceğin anlamına gelir. Bu kılavuz, Tahmin Modu ve OpenCV kullanarak Ultralytics YOLO segmentasyon sonuçlarını nasıl izole nesnelere dönüştüreceğini, PNG olarak kaydetmek için düz siyah arka plan veya şeffaf bir arka plan ile gösterir.
Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀
Link to this sectionNeden 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 segmentasyon modeliyle çalışır ve dört aşamayı takip eder: çıkarım çalıştır → her konturu çıkar → nesneyi izole et → sonucu kaydet.
Link to this sectionSegmentasyon Çıkarımını Çalıştır#
Gerekli kütüphaneleri yükle, ardından bir segmentasyon modeli (maske üretmek için gerekli olan -seg soneki) yükle ve kaynak görüntün ü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")If you call model.predict() without a source, Ultralytics falls back to the example images shipped with the package (bus.jpg and zidane.jpg), which is handy for quickly testing the workflow.
Link to this sectionNesne Konturlarını Çıkar#
results içindeki her öğe bir görüntüye karşılık gelir ve bir sonuç üzerinde döngü yapmak, her seferinde bir algılama döndürür. Her algılama için orijinal görüntüyü kopyala, sınıf etiketini oku ve nesnenin maske konturunu boş bir ikili maske üzerine çiz. Bu maskenin beyaz bölgesi, tam olarak hangi piksellerin nesneye ait olduğunu işaret eder.
Bu bölümdeki ve sonrakindeki kod parçacıkları, aşağıdaki algılama döngüsünün içinde çalışır; kopyalayıp yapıştırabileceğin eksiksiz betik Tam Örnek kısmındadır.
{ 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], bu tek algılama sonucundaki nesne için maske konturunu(x, y)nokta koordinatları olarak döndürür..astype(np.int32)converts the points fromfloat32, which OpenCV'sdrawContours()does not accept..reshape(-1, 1, 2)reshapes the points into the[N, 1, 2]layoutdrawContours()expects, whereNis the number of contour points.
Passing [contour] with the index -1 draws all points of the supplied contour, and cv2.FILLED fills every enclosed pixel white.
Link to this sectionNesneyi İ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:
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)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]That is built in. Pass save_crop=True to predict() and Ultralytics saves bounding-box crops automatically, no masking required.
Link to this sectionSonucu 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örüntü 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. Eğer yukarıdaki isteğe bağlı kırpmayı uyguladıysan isolated yerine iso_crop kullan.
Link to this sectionTam Örnek#
Aşağıdaki betik her adımı tek ve çalıştırılabilir bir blokta birleştirir. Varsayılan olarak siyah arka plan kullanır; şeffaf bir PNG için işaretlenmiş tek satırı np.dstack([img, b_mask]) ile 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.
Link to this sectionSonuç#
Artık Ultralytics YOLO ile segmentasyon nesnelerini izole etmek için eksiksiz bir yönteme sahipsin: çıkarım çalıştır, her konturdan bir ikili 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 kırp. İş akışını kendi sınıflarına uyarlamak için Segmentasyon Görevi ve Tahmin Modu belgelerinin tamamını keşfet.
Link to this sectionSSS#
Link to this sectionSegmentasyon 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 Tam Örnek bölümüne bak.
Link to this sectionSegmentasyondan 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 ekle. Her ikisi de Nesneyi İzole Et bölümünde gösterilmiştir.
Link to this sectionİ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 bilgiyi Tahmin Modu belgelerinde bulabilirsin.
Link to this sectionSegmentasyon 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.
Link to this sectionUltralytics YOLO ile arka plan dahil izole nesneleri kaydedebilir miyim?#
Yes. Use the save_crop argument in predict() to save bounding-box crops with their original background:
results = model.predict(source="path/to/your/image.jpg", save_crop=True)Tahmin Modu Çıkarım Bağımsız Değişkenleri bölümünden daha fazla bilgi oku.