İçeriğe geç

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.

Örnek İzole Nesne Segmentasyonu

Reçete İzleme

  1. 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.


  2. 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ü.


  3. Ş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ılama class-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()]
    
    1. 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.
    2. 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.


  4. Ö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çin person sınıf nesneleri sağda gösterilmiştir.

    İkili Maske Görüntüsü

    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)
    
    1. Hakkında daha fazla bilgi için c.masks.xy bkz. Tahmin Modundan Maskeler Bölümü.

    2. Burada değerler şu şekilde dönüştürülür: np.int32 ile uyumluluk için drawContours() fonksiyonu OpenCV.

    3. 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() :: Olarak masks.xy tek bir öğe içeren bir listedir, bu öğe kullanılarak çıkarılır. pop() metodu. - .astype(np.int32) :: Kullanarak masks.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] nerede N her nokta tek bir girişle temsil edilen, kontur noktalarının sayısıdır 1, 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 belirtilen drawContours() 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 eklenmesi cv2.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 Belgeleri drawContours() daha fazla bilgi için.


  5. 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 İzole Nesne Görüntüsü Siyah Arka Plan
    Ö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.

    Örnek Kırpılmış İzole Nesne Görüntüsü Siyah Arka Plan

    # (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]
    

    1. 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, burada xmin, ymin, xmaxve ymax 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çin int32, 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 İzole Nesne Görüntüsü Arka Plan Yok
    Ö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.

    Örnek Kırpılmış İzole Nesne Görüntüsü Arka Plan Yok

    # (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]
    

    1. 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çin int32 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.


  6. 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 ve ci ş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)
  1. Doldurulan satır contour yukarıda birden çok satıra bölünmüşken, burada tek bir satırda birleştirilmiştir.
  2. Buraya ne geleceği size kalmış!
  3. Ek bilgiler için Tahmin Modu'na bakın.
  4. Daha fazla bilgi için Segment Görevi'ne bakın.
  5. Sonuçlarla Çalışma hakkında daha fazla bilgi edinin
  6. 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:

  1. 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")
    
  2. İ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)
    
  3. İ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:

  1. Siyah Arka Plan ile:

    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    isolated = cv2.bitwise_and(mask3ch, img)
    
  2. Ş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:

  1. Sınırlayıcı kutu koordinatlarını al:

    x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
    
  2. İ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.



📅 1 yıl önce oluşturuldu ✏️ 18 gün önce güncellendi

Yorumlar