Segmentasyon Nesnelerini İzole Etme
Segmentasyon Görevi gerçekleştirildikten sonra, bazen izole edilen nesneleri çıkarım sonuçlarından ayıklamak istenebilir. Bu kılavuz, Ultralytics Tahmin Modu kullanarak bunu nasıl yapacağına dair genel bir yöntem sunar.
Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀
Yöntem İncelemesi
-
Gerekli kütüphanelerin kurulumuna dair hızlı bir başlangıç için Ultralytics Hızlı Başlangıç Kurulumu bölümüne bak.
-
Bir model yükle ve bir kaynak üzerinde
predict()yöntemini çalıştır.from ultralytics import YOLO # Load a model model = YOLO("yolo26n-seg.pt") # Run inference results = model.predict()
Bir kaynak belirtmezsen, kütüphanedeki örnek görseller kullanılacaktır:
'ultralytics/assets/bus.jpg'
'ultralytics/assets/zidane.jpg'Bu, predict() yöntemiyle hızlı testler yapmak için faydalıdır.
Segmentasyon Modelleri hakkında ek bilgi için Segmentasyon Görevi sayfasını ziyaret et. predict() yöntemi hakkında daha fazla bilgi edinmek için Dokümantasyonun Tahmin Modu bölümüne bak.
***
3. Şimdi sonuçlar ve konturlar üzerinde yinele. Görseli dosyaya kaydetmek isteyen iş akışları için, kaynak görselin base-name değeri ve tespit edilen class-label daha sonra kullanılmak üzere alınır (isteğe bağlı).
```{ .py .annotate }
from pathlib import Path
import numpy as np
# (2) Iterate detection results (helpful for multiple images)
for r in results:
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. To learn more about working with detection results, see [Boxes Section for Predict Mode](../modes/predict.md#boxes).
2. To learn more about `predict()` results see [Working with Results for Predict Mode](../modes/predict.md#working-with-results)For Döngüsü
Tek bir görsel, ilk döngüyü yalnızca bir kez çalıştıracaktır. Sadece tek bir tespiti olan tek bir görsel, her döngüyü yalnızca bir kez çalıştıracaktır.
-
Kaynak görselden bir ikili maske oluşturarak başla ve ardından maskenin üzerine dolu bir kontur çiz. Bu, nesnenin görselin diğer kısımlarından izole edilmesini sağlayacaktır.
bus.jpgörneğinden, tespit edilenpersonsınıfı nesnelerinden biri için bir örnek sağ tarafta gösterilmiştir.{ width="240", align="right" }
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)-
c.masks.xyhakkında daha fazla bilgi için Tahmin Modu Maskeler Bölümü kısmına bak. -
Here the values are cast into
np.int32for compatibility withdrawContours()function from OpenCV. -
OpenCV
drawContours()fonksiyonu, konturların[N, 1, 2]şeklinde olmasını bekler, daha fazla detay için aşağıdaki bölümü genişlet.
Expand to understand what is happening when defining the
contourvariable.- `c.masks.xy` :: Provides the coordinates of the mask contour points in the format `(x, y)`. For more details, refer to the [Masks Section from Predict Mode](../modes/predict.md#masks). - `.pop()` :: As `masks.xy` is a list containing a single element, this element is extracted using the `pop()` method. - `.astype(np.int32)` :: Using `masks.xy` will return with a data type of `float32`, but this won't be compatible with the OpenCV `drawContours()` function, so this will change the data type to `int32` for compatibility. - `.reshape(-1, 1, 2)` :: Reformats the data into the required shape of `[N, 1, 2]` where `N` is the number of contour points, with each point represented by a single entry `1`, and the entry is composed of `2` values. The `-1` denotes that the number of values along this dimension is flexible.
Expand for an explanation of the
drawContours()configuration.- Encapsulating the `contour` variable within square brackets, `[contour]`, was found to effectively generate the desired contour mask during testing. - The value `-1` specified for the `drawContours()` parameter instructs the function to draw all contours present in the image. - The `tuple` `(255, 255, 255)` represents the color white, which is the desired color for drawing the contour in this binary mask. - The addition of `cv2.FILLED` will color all pixels enclosed by the contour boundary the same, in this case, all enclosed pixels will be white. - See [OpenCV Documentation on `drawContours()`](https://docs.opencv.org/4.8.0/d6/d6e/group__imgproc__draw.html#ga746c0625f1781f1ffc9056259103edbc) for more information.
-
-
Bir sonraki adımda, görselle nasıl ilerleyeceğine dair 2 seçenek ve her biri için izleyen birer seçenek bulunmaktadır.
Nesne İzole Etme Seçenekleri
# 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?
-
Öncelikle, ikili maske tek kanallı bir görselden üç kanallı bir görsele dönüştürülür. Bu dönüşüm, maske ve orijinal görselin birleştirildiği sonraki adım için gereklidir. Karıştırma işlemiyle uyumlu olması için her iki görselin de aynı sayıda kanala sahip olması gerekir.
-
Orijinal görsel ve üç kanallı ikili maske, OpenCV
bitwise_and()fonksiyonu kullanılarak birleştirilir. Bu işlem, her iki görselden de sıfırdan büyük(> 0)olan piksel değerlerini yalnızca korur. Maske pikselleri yalnızca kontur bölgesinde sıfırdan büyük(> 0)olduğu için, orijinal görselden geriye kalan pikseller, konturla örtüşenlerdir.
Siyah Piksellerle İzole Et: Alt Seçenekler
Tam Boyutlu Görsel
Görseli tam boyutta tutarsan ek bir adım gerekmez.
Kırpılmış Nesne Görseli
Görseli sadece nesne bölgesini içerecek şekilde kırpmak için ek adımlar gerekir.
{ align="right" }
# (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 Modu Kutular Bölümü kısmına bak.
Bu kod ne yapıyor?
-
c.boxes.xyxy.cpu().numpy()çağrısı, sınırlayıcı kutularıxyxyformatında bir NumPy dizisi olarak alır; buradaxmin,ymin,xmaxveymaxsınırlayıcı kutu dikdörtgeninin koordinatlarını temsil eder. Daha fazla detay için Tahmin Modu Kutular Bölümü kısmına bak. -
squeeze()işlemi, NumPy dizisindeki gereksiz boyutları kaldırarak beklenen şekle sahip olmasını sağlar. -
Koordinat değerlerini
.astype(np.int32)kullanarak dönüştürmek, kutu koordinatlarının veri türünüfloat32değerindenint32değerine değiştirerek indeks dilimleme yoluyla görsel kırpma için uyumlu hale getirir. -
Son olarak, sınırlayıcı kutu bölgesi indeks dilimleme kullanılarak görselden kırpılır. Sınırlar, tespit edilen sınırlayıcı kutunun
[ymin:ymax, xmin:xmax]koordinatları tarafından belirlenir.
Peki, kırpılmış nesneyi arka plan **dahil** istiyorsam ne yapmalıyım?
This is a built-in feature for the Ultralytics library. See the save_crop argument for Predict Mode Inference Arguments for details.
- Bundan sonra ne yapacağın tamamen geliştirici olarak sana kalmıştır. Olası bir sonraki adımın (görseli ileride kullanmak üzere dosyaya kaydetme) temel bir örneği gösterilmiştir.
- NOT: Bu adım isteğe bağlıdır ve özel kullanım durumun için gerekmiyorsa atlanabilir.
Örnek Son Adım
# Save isolated object to file
_ = cv2.imwrite(f"{img_name}_{label}-{ci}.png", iso_crop)- Bu örnekte,
img_namekaynak görsel dosyasının temel adıdır,labeltespit edilen sınıf adıdır veciise nesne tespiti indeksidir (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. Tekrarlayan kullanımlar için, for döngülerinde yer alan komutların bir kısmını veya tamamını gerçekleştirecek bir fonksiyon tanımlamak en iyisi olacaktır, 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("yolo26n-seg.pt") # (4)!
res = m.predict(source="path/to/image.jpg") # (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]
# Add your custom post-processing here (2)contourdeğerini dolduran satır burada tek bir satırda birleştirilmiştir, yukarıda ise birkaç satıra bölünmüştü.- {==Buraya ne geleceği sana kalmış!==}
- Ek bilgi için Tahmin Modu bölümüne bak.
- Daha fazla bilgi için Segmentasyon Görevi bölümüne bak.
- Sonuçlarla Çalışma hakkında daha fazla bilgi edin
- Segmentasyon Maskesi Sonuçları hakkında daha fazla bilgi edin
SSS
Ultralytics YOLO26 kullanarak segmentasyon görevleri için nesneleri nasıl izole ederim?
Ultralytics YOLO26 kullanarak nesneleri izole etmek için şu adımları izle:
-
Modeli yükle ve çıkarımı çalıştır:
from ultralytics import YOLO model = YOLO("yolo26n-seg.pt") results = model.predict(source="path/to/your/image.jpg") -
İkili maske oluştur ve konturları çiz:
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 et:
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) isolated = cv2.bitwise_and(mask3ch, img)
Daha fazla bilgi için Tahmin Modu ve Segmentasyon Görevi hakkındaki kılavuza başvur.
Segmentasyondan sonra izole edilen nesneleri kaydetmek için hangi seçenekler mevcuttur?
Ultralytics YOLO26, izole edilen 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 et.
Ultralytics YOLO26 kullanarak izole edilmiş nesneleri sınırlayıcı kutularına göre nasıl kırpabilirim?
İzole edilmiş nesneleri sınırlayıcı kutularına göre 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örseli kırp:
iso_crop = isolated[y1:y2, x1:x2]
Sınırlayıcı kutu sonuçları hakkında daha fazla bilgiyi Tahmin Modu dokümantasyonunda bul.
Segmentasyon görevlerinde nesne izolasyonu için neden Ultralytics YOLO26 kullanmalıyım?
Ultralytics YOLO26 şunları sağlar:
- Yüksek hızlı gerçek zamanlı nesne tespiti 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.
YOLO kullanmanın faydalarını Segmentasyon Görevi dokümantasyonunda keşfet.
Ultralytics YOLO26 kullanarak arka plan dahil izole edilmiş nesneleri kaydedebilir miyim?
Yes, this is a built-in feature in Ultralytics YOLO26. Use the save_crop argument in the predict() method. For example:
results = model.predict(source="path/to/your/image.jpg", save_crop=True)save_crop argümanı hakkında daha fazla bilgiyi Tahmin Modu Çıkarım Argümanları bölümünde oku.