Segmentasyon Nesnelerini İzole Etme
Segment Görevini gerçekleştirdikten sonra, çıkarım sonuçlarından izole edilmiş nesneleri çıkarmak bazen arzu edilir. Bu kılavuz, Ultralytics Tahmin Modunu kullanarak bunu nasıl başaracağınıza dair genel bir tarif sunar.
Reçete İzleme
-
Gerekli kütüphanelerin kurulumu hakkında 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()
bir kaynak üzerindeki yöntem.from ultralytics import YOLO # Load a model model = YOLO("yolo11n-seg.pt") # Run inference results = model.predict()
Tahmin Argümanı Yok mu?
Bir kaynak belirtilmeden, kitaplıktaki örnek görüntüler kullanılacaktır:
'ultralytics/assets/bus.jpg' 'ultralytics/assets/zidane.jpg'
Bu, şununla hızlı test için kullanışlıdır:
predict()
yöntemi.Segmentasyon Modelleri hakkında ek bilgi için şu adresi ziyaret edin: Bölümleme Görevi sayfasına bakın. Daha fazla bilgi edinmek için
predict()
yöntemi, bkz. Tahmin Modu Belgeleme bölümü.
-
Şimdi sonuçlar ve konturlar üzerinde yineleyin. Bir görüntüyü dosyaya kaydetmek isteyen iş akışları için, kaynak görüntü
base-name
ve algılamaclass-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()]
- Algılama sonuçlarıyla çalışma hakkında daha fazla bilgi edinmek için Tahmin Modu için Kutular Bölümüne bakın.
- Daha fazla bilgi edinmek için
predict()
sonuçları gör Tahmin Modu için Sonuçlarla Çalışmak
For-Loop
Tek bir görüntü, yalnızca ilk döngüyü bir kez yineleyecektir. Yalnızca tek bir algılamaya sahip tek bir görüntü, her döngüyü yalnızca bir kez yineleyecektir.
-
Önce kaynak görüntüden bir ikili maske oluşturarak başlayın ve ardından maskenin üzerine dolu bir kontur çizin. Bu, nesnenin görüntünün diğer kısımlarından izole edilmesini sağlayacaktır. Şuradan bir örnek:
bus.jpg
tespit edilenlerden biri içinperson
sınıf nesneleri sağda gösterilmiştir.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)
-
Hakkında daha fazla bilgi için
c.masks.xy
bkz. Tahmin Modundan Maskeler Bölümü. -
Burada değerler şu şekilde dönüştürülür:
np.int32
ile uyumluluk içindrawContours()
fonksiyonu OpenCV. -
OpenCV
drawContours()
fonksiyonu, konturların şeklinde olmasını bekler[N, 1, 2]
daha fazla ayrıntı için aşağıdaki bölümü genişletin.
'yi tanımlarken neler olduğunu anlamak için genişletin
contour
değişkeni.-
c.masks.xy
:: Maske kontur noktalarının koordinatlarını şu biçimde sağlar:(x, y)
. Daha fazla ayrıntı için şuraya bakın: Tahmin Modundan Maskeler Bölümü..pop()
:: Olarakmasks.xy
tek bir öğe içeren bir listedir, bu öğe kullanılarak çıkarılır.pop()
metodu. -.astype(np.int32)
:: Kullanarakmasks.xy
veri türü ile geri dönecektir:float32
, ancak bu OpenCV ile uyumlu olmayacaktır.drawContours()
fonksiyonu, bu nedenle veri tipini şu şekilde değiştirecektir:int32
uyumluluk için. -.reshape(-1, 1, 2)
:: Verileri gerekli şekle yeniden biçimlendirir:[N, 1, 2]
neredeN
her nokta tek bir girişle temsil edilen, kontur noktalarının sayısıdır1
, ve giriş şunlardan oluşur:2
değerleri. Şuradaki-1
bu boyut boyunca değerlerin sayısının esnek olduğunu belirtir.'nin açıklaması için genişletin
drawContours()
yapılandırma.- Şunu kapsüllemek
contour
köşeli parantez içindeki değişken,[contour]
, test sırasında istenen kontur maskesini etkili bir şekilde oluşturduğu bulunmuştur. - Değer-1
için belirtilendrawContours()
parametresi, fonksiyona görüntüdeki tüm konturları çizmesini söyler. -tuple
(255, 255, 255)
beyaz rengi temsil eder; bu, bu ikili maskede konturu çizmek için istenen renktir. - Şunun eklenmesicv2.FILLED
kontur sınırı ile çevrili tüm pikselleri aynı renkte renklendirecektir, bu durumda çevrelenen tüm pikseller beyaz olacaktır. - Bakınız OpenCV BelgeleridrawContours()
daha fazla bilgi için.
-
-
Ardından, bu noktadan itibaren görüntüyle nasıl ilerleneceğine dair 2 seçenek ve her biri için sonraki bir seçenek bulunmaktadır.
Nesne İzolasyon 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ışır?
-
İlk olarak, ikili maske önce 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. Her iki görüntünün de harmanlama işlemiyle uyumlu olması için aynı sayıda kanala sahip olması gerekir.
-
Orijinal görüntü ve üç kanallı ikili maske, OpenCV fonksiyonu kullanılarak birleştirilir
bitwise_and()
. Bu işlem şunu korur: sadece sıfırdan büyük olan piksel değerleri(> 0)
her iki görüntüden. Maske pikselleri sıfırdan büyük olduğundan(> 0)
sadece kontur bölgesi içinde, orijinal görüntüden kalan pikseller kontur ile örtüşenlerdir.
Siyah Piksellerle İzole Et: Alt seçenekler
Tam Boyutlu Görüntü
Tam boyutlu görüntüyü korurken ek bir adım gerekmez.
Ö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 gereken ek adımlar.
# (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 yapar?
-
c.boxes.xyxy.cpu().numpy()
çağrısı, sınırlayıcı kutuları NumPy dizisi olarak alır.xyxy
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. -
squeeze()
işlemi, NumPy dizisinden gereksiz boyutları kaldırarak beklenen şekle sahip olmasını sağlar. -
Koordinat değerlerini kullanarak dönüştürme
.astype(np.int32)
kutu koordinatları veri tipini şundan değiştirir:float32
içinint32
, bunları indeks dilimlerini kullanarak görüntü kırpma için uyumlu hale getirir. -
Son olarak, sınırlayıcı kutu bölgesi, dizin dilimlemesi kullanılarak görüntüden kırpılır. Sınırlar tarafından 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ışır?
- NumPy'ı kullanarak
dstack()
fonksiyonu (derinlik ekseni boyunca dizi yığınlama), oluşturulan ikili maske ile birlikte dört kanallı bir görüntü oluşturacaktır. Bu, bir olarak kaydedilirken nesne konturunun dışındaki tüm piksellerin şeffaf olmasını sağlar.PNG
dosyası.
Şeffaf Piksellerle İzole Et: Alt seçenekler
Tam Boyutlu Görüntü
Tam boyutlu görüntüyü korurken ek bir adım gerekmez.
Ö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 gereken ek adımlar.
# (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 yapar?
-
Kullanırken
c.boxes.xyxy.cpu().numpy()
, sınırlayıcı kutular, şunu kullanan bir NumPy dizisi olarak döndürülür:xyxy
noktalarına karşılık gelen kutu koordinatları formatı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. -
Ekleniyor
squeeze()
NumPy dizisinden herhangi bir yabancı boyutun kaldırılmasını sağlar. -
Koordinat değerlerini kullanarak dönüştürme
.astype(np.int32)
kutu koordinatları veri tipini şundan değiştirir:float32
içinint32
dizin dilimlerini kullanarak görüntüyü kırparken uyumlu olacaktır. -
Son olarak, sınırlayıcı kutu için görüntü bölgesi, sınırların kullanılarak ayarlandığı dizin dilimlemesi kullanılarak kırpılır.
[ymin:ymax, xmin:xmax]
algılama sınırlayıcı kutusunun koordinatları.
Kırpılmış nesneyi arka planı dahil etmek istersem ne olur?
Bu, Ultralytics kütüphanesi için yerleşik bir özelliktir. Şuraya bakın:
save_crop
için argüman Tahmin Modu Çıkarım Argümanları ayrıntılar için.
-
-
Bir sonraki adımda ne yapacağınız tamamen size, geliştiriciye kalmış. Olası bir sonraki adımın temel bir örneği (görüntüyü gelecekte kullanmak üzere dosyaya kaydetme) gösterilmiştir.
- NOT: Bu adım isteğe bağlıdır ve belirli 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,
img_name
kaynak görüntü dosyasının temel adıdır,label
algılanan sınıf adıdır veci
şunun indeksidir nesne tespiti (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. Tekrarlı kullanım için, bazı veya tüm komutları içeren bir fonksiyon tanımlamak en uygunu olacaktır. for
-döngüler, ancak bu okuyucuya bırakılan 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)
- Doldurulan satır
contour
yukarıda birden çok satıra bölünmüşken, burada tek bir satırda birleştirilmiştir. - Buraya ne geleceği size kalmış!
- Ek bilgiler için Tahmin Modu'na bakın.
- Daha fazla bilgi için Segment Görevi'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 kullanarak nesneleri nasıl izole ederim?
Ultralytics YOLO11 kullanarak nesneleri izole etmek için şu adımları izleyin:
-
Modeli yükleyin ve çıkarımı çalıştırın:
from ultralytics import YOLO model = YOLO("yolo11n-seg.pt") results = model.predict(source="path/to/your/image.jpg")
-
İkili bir maske oluşturun ve konturlar çizin:
import cv2 import numpy as np 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)
-
İkili maskeyi kullanarak nesneyi izole edin:
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) isolated = cv2.bitwise_and(mask3ch, img)
Daha fazla bilgi için Tahmin Modu ve Segment Görevi kılavuzuna bakın.
Segmentasyon sonrasında 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 Plan ile:
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) isolated = cv2.bitwise_and(mask3ch, img)
-
Şeffaf Arka Plan ile:
isolated = np.dstack([img, b_mask])
Daha fazla ayrıntı için Tahmin Modu bölümünü ziyaret edin.
Ultralytics YOLO11 kullanarak izole edilmiş nesneleri sınırlayıcı kutularına nasıl kırpabilirim?
İzole edilmiş nesneleri sınırlayıcı kutularına kırpmak için:
-
Sınırlayıcı kutu koordinatlarını al:
x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
-
İzole edilmiş görüntüyü kırpın:
iso_crop = isolated[y1:y2, x1:x2]
Tahmin Modu belgelerinde sınırlayıcı kutu sonuçları hakkında daha fazla bilgi edinin.
Segmentasyon görevlerinde nesne yalıtımı için neden Ultralytics YOLO11 kullanmalıyım?
Ultralytics YOLO11 şunları sağlar:
- Yüksek hızlı gerçek zamanlı nesne algılama ve segmentasyon.
- Hassas nesne izolasyonu için doğru sınırlayıcı kutu ve maske oluşturma.
- Verimli geliştirme için kapsamlı dokümantasyon ve kullanımı kolay API.
Segment Görevi belgelerinde YOLO kullanmanın faydalarını keşfedin.
Ultralytics YOLO11 kullanarak arka plan dahil olmak üzere izole edilmiş nesneleri kaydedebilir miyim?
Evet, bu Ultralytics YOLO11'de yerleşik bir özelliktir. Şunu kullanın: save_crop
'deki argüman predict()
yöntemi. Örneğin:
results = model.predict(source="path/to/your/image.jpg", save_crop=True)
Şu konu hakkında daha fazla bilgi edinin: save_crop
'deki argüman Tahmin Modu Çıkarım Argümanları bölüm.