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.
Tarif Gezintisi
-
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.
-
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("yolo11n-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:
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ü.
-
Ş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 tespitclass-label
daha sonra kullanılmak üzere alınır (isteğe bağlı).from pathlib import Path import numpy as np # (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()]
- 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.
- 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.
-
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çinperson
sınıf nesneleri sağda gösterilmektedir.import cv2 # 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)
-
Daha fazla bilgi için
c.masks.xy
bkz. Tahmin Modundan Maskeler Bölümü. -
Burada değerler
np.int32
ile uyumluluk içindrawContours()
fonksiyonundan OpenCV. -
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()
:: Gibimasks.xy
tek bir eleman içeren bir liste ise, bu elemanpop()
yöntem. -
.astype(np.int32)
:: Kullanmamasks.xy
veri türü ile dönecektir.float32
ancak bu OpenCV ile uyumlu olmayacaktırdrawContours()
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]
neredeN
kontur noktalarının sayısıdır ve her nokta tek bir girişle temsil edilir1
ve giriş şunlardan oluşur2
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 belirtilendrawContours()
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.
-
-
Ardından, 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
Örnek
# 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.
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.
# (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]
- 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 olarakxyxy
biçimi, buradaxmin
,ymin
,xmax
veymax
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çinint32
Bu 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.
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.
# (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]
- 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çimixmin, 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çinint32
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.
-
-
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
- 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 veci
'nin indeksidir. nesne algılama (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ım için, aşağıdaki komutların bazılarını ya da tümü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("yolo11n-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)
- Dolduran satır
contour
yukarıda birden fazla satıra bölünmüşken burada tek bir satırda birleştirilmiştir. - Buraya ne koyacağınız size kalmış!
- Daha fazla bilgi için Tahmin Modu bölümüne bakın.
- Daha fazla bilgi için Segment Görevi bölümüne bakın.
- Sonuçlarla Çalışma hakkında daha fazla bilgi edinin
- Segmentasyon Maskesi Sonuçları hakkında daha fazla bilgi edinin
SSS
Segmentasyon görevleri için Ultralytics YOLO11 adresini kullanarak nesneleri nasıl izole edebilirim?
Ultralytics YOLO11 adresini kullanarak nesneleri izole etmek için aşağıdaki adımları izleyin:
-
Modeli yükleyin ve çıkarımı çalıştırın:
-
İkili bir maske oluşturun ve konturlar çizin:
-
İkili maskeyi kullanarak nesneyi izole edin:
Daha fazla bilgi için Tahmin Modu ve Segment Görevi hakkındaki kılavuza bakın.
Segmentasyondan sonra izole edilmiş nesneleri kaydetmek için hangi seçenekler mevcuttur?
Ultralytics YOLO11 yalıtılmış nesneleri kaydetmek için iki ana seçenek sunar:
-
Siyah Arka Planlı:
-
Şeffaf Arka Plan ile:
Daha fazla ayrıntı için Tahmin Modu bölümünü ziyaret edin.
Ultralytics YOLO11 adresini kullanarak yalıtılmış nesneleri sınırlayıcı kutularına nasıl kırpabilirim?
Yalıtılmış nesneleri sınırlayıcı kutularına kırpmak için:
-
Sınırlayıcı kutu koordinatlarını alın:
-
Yalıtılmış görüntüyü kırpın:
Tahmin Modu belgelerinde sınırlayıcı kutu sonuçları hakkında daha fazla bilgi edinin.
Segmentasyon görevlerinde nesne izolasyonu için neden Ultralytics YOLO11 adresini kullanmalıyım?
Ultralytics YOLO11 sağlar:
- Yüksek hızlı gerçek zamanlı nesne algılama ve segmentasyon.
- Hassas nesne yalıtımı için doğru sınırlayıcı kutu ve maske üretimi.
- Verimli geliştirme için kapsamlı dokümantasyon ve kullanımı kolay API.
Segment Görevi dokümantasyonunda YOLO adresini kullanmanın faydalarını keşfedin.
Arka plan dahil izole edilmiş nesneleri Ultralytics YOLO11 kullanarak kaydedebilir miyim?
Evet, bu Ultralytics YOLO11 adresinde yerleşik bir özelliktir. Kullanın save_crop
argümanında predict()
yöntem. Örneğin:
Hakkında daha fazla bilgi edinin save_crop
argümanında Tahmin Modu Çıkarım Argümanları Bölüm.