Örnek Segmentasyonunu Etiketleme ve Eğitme
Poligon etiketleri oluştur, kodda kontrol et, COCO8-seg üzerinde yolo26n-seg.pt modelini eğit ve kutu ile maske metrikleri arasındaki farktan modelin durumunu değerlendir.
Örnek segmentasyonu, her nesneye kendine ait bir kontur verir; alan, örtüşme veya sınırın kararı belirlediği durumlarda ihtiyacın olan da budur. Poligonlar çoğu ekibin satın aldığı en maliyetli etiketlerdir ve hatalı bir satır eğitimi durdurmaz — model sessizce yanlış şekille eğitilir. Bu derste satır biçimini doğru ayarlayacak, bir etiket kümesini kodda kontrol edecek ve ilk modelini eğiteceksin; böylece ek etiketlemenin ne kazandırdığını, yalnızca konumları değil konturları da puanlayan ikinci bir metriği göreceksin.
Uygulamalı
Poligon etiket satırı#

Segmentasyon etiket dosyasında, algılama etiketinde olduğu gibi her nesne için bir satır bulunur; ancak kutu yerine nesnenin konturu normalize edilmiş köşe çiftleri olarak listelenir. COCO8-seg veri kümesinden kısaltılmış gerçek bir satır:
45 0.782016 0.986521 0.937078 0.874167 0.957297 0.782021 0.950562 0.739333 0.825844 0.561792 ...| Konum | Algılama satırı | Segmentasyon satırı |
|---|---|---|
| 1 | sınıf indeksi (45, bowl) | sınıf indeksi |
| 2–5 | x_center y_center width height | ilk iki köşe, x1 y1 x2 y2 |
| 6+ | — | daha fazla köşe; kontur için gerektiği kadar |
| Birimler | normalize edilmiş 0–1 | normalize edilmiş 0–1 (piksel x ÷ görüntü genişliği, piksel y ÷ görüntü yüksekliği) |
En önemli üç kural şunlardır: nesne başına en az üç köşe, görüntü boyutuna bölünmüş koordinatlar ve aynı sınıftan iki nesne birbirine değse bile her örnek için ayrı bir satır. Tüm teknik özellikler için segmentasyon veri kümesi kılavuzuna bak.
Çokgenler, kutu etiketlerinin üst kümesidir. Aynı etiket klasörü yolo26n.pt modelini (Ultralytics her kutuyu çokgeninden türetir) ve yolo26n-sem.pt modelini (çokgenleri sınıf haritalarına rasterleştirir) eğitir — ikisini de coco8-seg.yaml üzerinde eğittik. Etiketlemeden sonra plan değişirse bütçe boşa gitmez.
Eğitmeden önce etiketleri kontrol et#
Tek sayıda değer içeren, koordinatı piksel cinsinden yazılmış veya yanlış nesnenin çevresinden geçirilmiş bir kontur eğitimi durdurmaz. Bu denetleyici, veri kümesini Ultralytics'in kendi yükleyicisiyle okur, hatalı satırları reddeder ve her poligonun alanını Ultralytics'in bu poligondan türeteceği kutunun yanında gösterir:
from pathlib import Path
import numpy as np
from ultralytics.data.utils import check_det_dataset
data = check_det_dataset("coco8-seg.yaml") # resolves paths, downloads if needed
for label in sorted(Path(data["path"], "labels", "train").glob("*.txt"))[:2]:
for n, row in enumerate(label.read_text().splitlines(), 1):
cls, *coords = row.split()
if len(coords) % 2 or len(coords) < 6:
print(f"{label.name}:{n} BAD: needs an even number of values and at least 3 vertices")
continue
xy = np.array(coords, dtype=float).reshape(-1, 2)
if xy.min() < 0 or xy.max() > 1:
print(f"{label.name}:{n} BAD: coordinates must be normalized to 0-1")
continue
x, y = xy[:, 0], xy[:, 1]
area = 0.5 * abs(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1))) # shoelace formula
w, h = xy.max(0) - xy.min(0) # the box Ultralytics derives from the polygon
name = data["names"][int(cls)]
print(f"{label.stem} {name:9s} {len(xy):3d} vertices polygon {area:.3f} box {w * h:.3f} fill {area / (w * h):.2f}")000000000009 bowl 12 vertices polygon 0.391 box 0.569 fill 0.69
000000000009 bowl 14 vertices polygon 0.145 box 0.238 fill 0.61
000000000009 broccoli 50 vertices polygon 0.161 box 0.252 fill 0.64
000000000009 bowl 55 vertices polygon 0.079 box 0.531 fill 0.15
000000000009 orange 13 vertices polygon 0.007 box 0.011 fill 0.64
000000000009 orange 13 vertices polygon 0.005 box 0.009 fill 0.61
000000000009 orange 18 vertices polygon 0.012 box 0.019 fill 0.61
000000000009 orange 12 vertices polygon 0.010 box 0.022 fill 0.44
000000000025 giraffe 82 vertices polygon 0.072 box 0.234 fill 0.31
000000000025 giraffe 19 vertices polygon 0.010 box 0.027 fill 0.38Alanlar görüntünün kesri olarak ifade edilir; dolayısıyla ilk kase fotoğrafın %39'unu kaplar. Doluluk, poligon alanının kutu alanına bölünmesiyle hesaplanır ve incelemen gereken sütun budur:
- Çoğu kompakt nesnenin (kase, portakal, brokoli) değeri 0,6–0,7 civarındadır.
- Zürafanın 0,31 değeri gerçektir: uzun bacakları ve boynu kutusunun büyük kısmını boş bırakır — bu nesnenin maske gerektirmesinin nedeni de budur.
- Üçüncü kasenin 0,15 değeri, bir inceleyenin açıp bakması gereken satırdır. Yiyeceklerin çevresinde kasenin yalnızca ince bir kenarı görünür; bu nedenle konturu büyük bir kutunun içindeki dar bir şerittir. Burada bu doğru; ancak kendi verinde bu kadar düşük doluluk oranı, çoğu zaman yanlış nesnenin etrafına çizilmiş bir kontura işaret eder.
Eğitimden önce BAD olan her satırı düzelt. Ardından doluluk oranına göre sırala ve her sınıftaki en düşük yüzde dilimindeki birkaç satırı bir açıklama aracında aç: düşük doluluk, ya ince veya örtülmüş bir nesne (tut) ya da hatalı bir iz (düzelt) anlamına gelir.
Her kenarı tek tek çizmeksizin poligon elde et#
Konturları elle çizmek, veri etiketlemenin en maliyetli kısmıdır. Herhangi biri başlamadan önce hangi kısayolun uygun olduğunu kontrol et:
| Elinde zaten var | Araç |
|---|---|
| Segmentasyon içeren COCO JSON | convert_coco(labels_dir, use_segments=True), ultralytics.data.converter içinden |
| PNG maskeleri (piksel değeri = sınıf indeksi + 1, 0 = arka plan) | convert_segment_masks_to_yolo_seg(masks_dir, output_dir, classes) — aynı sınıftaki bitişik nesneler tek poligon olarak çıkar; incelemede bunları ayır |
| Yalnızca kutu etiketleri | yolo_bbox2segment(im_dir) — her kutuyu SAM için istem olarak kullanıp poligon oluşturur |
| Henüz hiçbir şey yok | Akıllı Açıklama ve Toplu Etiketleme — bir kez tıkla, poligonu incele |
Ultralytics Platform'da Akıllı mod, SAM'i çalıştırır: nesnenin üzerine olumlu bir tıklama, hariç tutulması gereken yere olumsuz bir tıklamayla birlikte daha sonra inceleyeceğin bir maske oluşturur.

Arka plana taşan bir maske, modeli de aynı şeyi yapması için eğitir. Makine tarafından oluşturulan çokgenleri Kutular ve Maskeler bölümündeki kalite ölçütlerine göre incele, ardından yukarıdaki etiket denetimini yeniden çalıştır.
COCO8-seg ile eğit#

Eğitim, -seg modeli ve bir segmentasyon veri kümesiyle yürütülen algılama iş akışıdır. Dizüstü bilgisayarın CPU'sunda imgsz=320 için bir dönem birkaç saniyede tamamlanır; bu, işlem hattının baştan sona çalıştığını doğrulamaya yeter:
from ultralytics import YOLO
model = YOLO("yolo26n-seg.pt")
model.train(data="coco8-seg.yaml", epochs=1, imgsz=320, device="cpu")
metrics = model.val()
print(f"box mAP50-95: {metrics.box.map:.3f}")
print(f"mask mAP50-95: {metrics.seg.map:.3f}") Class Images Instances Box(P R mAP50 mAP50-95) Mask(P R mAP50 mAP50-95)
all 4 17 0.909 0.449 0.661 0.482 0.685 0.409 0.557 0.377
horse 1 2 1 0.993 0.995 0.564 0.619 0.857 0.663 0.199
box mAP50-95: 0.482
mask mAP50-95: 0.377Dört doğrulama görüntüsü bu sayıları güvenilmez kılar; önemli olan çalışmanın tamamlanması ve weights/best.pt dosyasının runs/segment/ konumuna yazılmasıdır. Gerçek veriler için Segment görevi kılavuzunu izle ve tam eğitim planını GPU'da çalıştır.
Kutu ve maske metriklerini yan yana oku#
Doğrulama tablosunda iki bölüm vardır. Kutu, tahmin edilen her kutuyu etiketin ima ettiği kutuya göre puanlar; Maske, tahmin edilen pikselleri etiketli poligona göre puanlar. İkisi de aynı mAP mekanizmasını kullanır; yalnızca IoU değişir.
Maske mAP50-95 neredeyse her zaman iki değerden düşüktür; çünkü piksel IoU'su daha katıdır: birkaç piksel kaymış bir kutu yine de iyi örtüşürken kolu kaçıran veya yola taşan bir maske, 0,75–0,95 eşiklerinde IoU'yu hızla düşürür. horse satırı, bu durumu en uç hâliyle gösterir — kutu mAP50-95 0,564, maske 0,199. Model iki atı da bulup iyi kutuladı; bacakları ve kuyrukları düzgün biçimde çevreleyemedi. Neyi düzelteceğine karar vermek için aradaki farkı kullan:
- İkisi de düşük: sorun kontur çizmek değil, nesneleri bulmaktır. Önce kaçırılan koşullara yönelik veri ekle.
- Kutu iyi, maske çok daha düşük: model nesneleri buluyor ama konturlarını kötü çiziyor. Etiket denetimini çalıştır, daha büyük bir model dene veya daha yüksek
imgszdeğerinde eğitip doğrula. - Kutu yerinde sayarken maske iyileşiyor: sorun değil — bir segmentasyon ürünü için sürüm eşiği maske mAP50-95'tir.
overlap_mask=True, eğitim sırasında örnek maskelerini tek bir görüntüde birleştirir; mask_ratio=4 ise eğitim maskelerini küçültür. İkisi de tahmin edilen maskelerin çözünürlüğünü değiştirmez — bunu bir sonraki derste ele alınan retina_masks belirler. Değiştirmek için ölçüme dayalı bir nedenin yoksa her ikisini de varsayılan değerlerinde bırak.
Çözümü göster
Her bölümü kontrol etmek için döngüdeki klasörü Path(data["path"], "labels").rglob("*.txt") ile değiştir. Ardından eğit:
from ultralytics import YOLO
model = YOLO("yolo26n-seg.pt")
model.train(data="coco8-seg.yaml", epochs=1, imgsz=320, device="cpu")
metrics = model.val()
print(f"box mAP50-95: {metrics.box.map:.3f}") # 0.482 in our run
print(f"mask mAP50-95: {metrics.seg.map:.3f}") # 0.377 in our run0,1'lik fark beklenen bir durumdur: maske IoU'su her sınır pikselini, kutu IoU'su ise yalnızca dört kenarı cezalandırır. Çalışmamızda en büyük fark horse sınıfındadır (kutu 0,564, maske 0,199). Kutu mAP'si iyi, maske değeri ise çok daha düşük; dolayısıyla şema kontur kalitesini işaret ediyor: önce bu poligonları kontrol et, ardından daha büyük bir model veya daha yüksek bir imgsz değeri dene.