Ultralytics YOLO27: Bekleme listesine katıl.
Get Started
Dersorta düzey

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

Sonuç

Hatalı satırları bulmak için bir poligon etiket kümesini kontrol et, yolo26n-seg.pt modelini coco8-seg.yaml üzerinde eğit ve kutu ile maske mAP50-95 arasındaki farktan neyi düzeltmen gerektiğine karar ver.

Hızlı Başlangıç
Nasıl ilerleyeceğini zaten biliyorsan, işte kısa sürüm.
  1. Her nesne için bir satır yaz: sınıf indeksi, ardından normalize edilmiş x y köşe çiftleri; en az üç köşe.

  2. Tek sayıda değer, aralık dışı koordinatlar ve şüpheli derecede düşük poligon doluluk oranı için etiket denetimi çalıştır.

  3. yolo segment train data=coco8-seg.yaml model=yolo26n-seg.pt epochs=1 imgsz=320.

  4. Maske mAP50-95 (metrics.seg.map) değerini ölçüt al ve tanılama için bu değerle kutu mAP50-95 (metrics.box.map) arasındaki farkı kullan.

Uygulamalı

Poligon etiket satırı#

Her araba, otobüs ve yaya için ayrı bir maskeyle gösterilen, şehirdeki yaya geçidinin Ultralytics YOLO örnek segmentasyonu

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 ...
KonumAlgılama satırıSegmentasyon satırı
1sınıf indeksi (45, bowl)sınıf indeksi
2–5x_center y_center width heightilk iki köşe, x1 y1 x2 y2
6+—daha fazla köşe; kontur için gerektiği kadar
Birimlernormalize edilmiş 0–1normalize 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.

Çokgen etiketler kutuları ve sınıf haritalarını da eğitir

Ç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.38

Alanlar 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.
Karar kuralı

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 varAraç
Segmentasyon içeren COCO JSONconvert_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 etiketleriyolo_bbox2segment(im_dir) — her kutuyu SAM için istem olarak kullanıp poligon oluşturur
Henüz hiçbir şey yokAkı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.

SAM 2.1 Tiny seçili Ultralytics Platform Akıllı modu: bir depo robotunun üzerinde olumlu ve olumsuz tıklamayla maske oluşturulması

Makine tarafından oluşturulan her çokgeni incele

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#

COCO8-seg eğitim mozaiği: zebralar, bir zürafa, brokoli ve portakallı yemek kutuları ve bir vazo çiçek; her nesnenin kendine ait renkli maskesi ve sınıf indeksi var

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

Dö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 imgsz değ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.
Maske çözünürlüğünü değiştirmeyen iki ayar

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.

Dene

check_seg_labels.py kodunu COCO8-seg'in tamamında (train ve val) çalıştır ve doluluk oranı en düşük üç satırı listele. Ardından yolo26n-seg.pt modelini coco8-seg.yaml üzerinde imgsz=320 değerinde bir dönem eğit; kutu mAP50-95'i, maske mAP50-95'i ve aradaki farkın en büyük olduğu sınıfı kaydet; doğrulama klasöründe val_batch0_pred.jpg dosyasını açıp maskesi kutusundan görünür biçimde daha kötü olan bir nesne bul.

Tamamlanma ölçütü
Aşağıdakilerin tümü doğru olduğunda dersi tamamlamış olursun.
  • Etiket denetimin BAD satır sayısını sıfır olarak raporluyor ve doluluk oranı en düşük üç satır için her birine sakla ya da düzelt kararı verdin.

  • Eğitim tamamlandı, best.pt dosyası runs/segment/ konumunda mevcut ve her iki mAP50-95 değerini de kaydettin.

  • Kutu ile maske arasındaki farkın en büyük olduğu sınıfı ve karar şemasının önerdiği sonraki adımı belirttin.

Çö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 run

0,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.

Sırada ne var

Sonraki adımda tahmin edilen maskeleri sayılara dönüştüreceğiz: alanlar, konturlar, örtüşmeler ve şeffaf kesitler.

İlerlemeni kaydetmek için giriş yap