Ultralytics YOLO27: Bekleme listesine katıl.
Get Started
İlk YOLO modelini eğit·Dağıt·Ders 9/10
Dersbaşlangıç düzeyi

Videoda çıkarım yap

YOLO26'yı video dosyalarında ve canlı kameralarda sınırlı bellek kullanarak çalıştır, her nesneyi yalnızca bir kez saymak için nesneleri izle ve modelin kare hızına yetişip yetişmediğini kontrol et.

Dağıtılan görsel sistemlerin çoğu video izler: konveyörlerin, kapıların ve yolların üzerindeki kameralar. Video, tekil görüntülerde olmayan iki sorun getirir. Bellek: uzun bir kayıt RAM'de tutulamaz. Kimlik: bir algılayıcı aynı kişiyi 60 karede görüp 60 kişi olarak raporlar.

Bu derste videoyu Predict mode ile kare kare işleyecek, her kişiyi bir kez saymak için object tracking ekleyecek, kendi kamera döngünü yazacak ve modelinin hıza yetişip yetişmediğini ölçeceksin.

Sonuç

YOLO26 ile sınırlı bellek kullanarak video veya kamera akışı işleyebilir, takip ile benzersiz nesneleri sayabilir ve kare başına ölçülen ms değerine göre kaynak akışa yetişip yetişmediğine karar verebilirsin.

Hızlı Başlangıç
Nasıl ilerleyeceğini zaten biliyorsan, işte kısa sürüm.
  1. model(video, stream=True), sınırlı bellek kullanarak her kare için bir Results üretir.

  2. model.track(video, stream=True, persist=True, tracker='bytetrack.yaml'), boxes.id ekler.

  3. Benzersiz nesneleri en yüksek kimliğe göre değil, kimlik kümeleriyle say.

  4. Bütçe = 1000 ÷ kaynak FPS; bunu result.speed['inference'] ile karşılaştır.

Uygulamalı

Uygulamalı Örnek: Video Dosyasında Predict#

Videolar, görüntülerle aynı Predict mode üzerinden işlenir. Bu 62 karelik klipte bir atriyumdan geçen insanlar görülüyor:

yolo predict model=yolo26n.pt source=https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4
video 1/1 (frame 1/62) solutions_ci_demo.mp4: 384x640 22 persons, 27.3ms
...
video 1/1 (frame 62/62) solutions_ci_demo.mp4: 384x640 22 persons, 54.8ms
Results saved to runs/detect/predict
  • frame 1/62: Ultralytics videoyu çözer ve her kareyi bir görüntü gibi işler.
  • 22 persons: o karedeki algılamalar. Aynı yayalar her karede yeniden sayılır.
  • 27.3ms ... 54.8ms: kare başına süre, makinenin başka ne yaptığına bağlı olarak değişir.

İşaretlenmiş video runs/detect/predict/solutions_ci_demo.mp4 konumundadır. Kendi modelin de aynı şekilde çalışır: yolo26n.pt yerine runs/detect/pills_v1/weights/best.pt kullan.

Uzun ve Canlı Kaynakları Akış Olarak İşle#

Algılamalar üzerinde işlem yapan kod için akış üzerinde döngü kur. Her yineleme bir karenin Results değerini üretir, ardından onu bellekten çıkarır:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
source = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"

frames, people = 0, 0
for result in model(source, stream=True, classes=[0], verbose=False):  # one Results object per frame
    frames += 1
    people += len(result.boxes)
print(f"{frames} frames, {people / frames:.1f} people per frame")
62 frames, 22.2 people per frame

Aynı döngü bir web kamerası dizinini (source=0) veya rtsp://camera.local/stream gibi bir kamera URL'sini kabul eder ve akış bitene ya da sen durdurana kadar çalışır. Her iki kareden birini işlemek için vid_stride=2 ekle. Bu döngünün etrafında tarayıcı arayüzü oluşturmak için Streamlit canlı çıkarım kılavuzu döngüyü bir uygulamanın içine alır.

Uygulamalı Örnek: Her Kişiyi Bir Kez Say#

"Kare başına 22 kişi" kimsenin istediği sayı değil; istenen "kaç kişi geçti" bilgisidir. Çoklu nesne takibi kutuları kareler arasında eşleştirir ve Track mode, her nesneye boxes.id içinde bir kimlik verir:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
source = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"

seen = set()
for result in model.track(source, stream=True, persist=True, classes=[0], tracker="bytetrack.yaml", verbose=False):
    if result.boxes.is_track:
        seen.update(result.boxes.id.int().tolist())
print(f"{len(seen)} unique people tracked")
32 unique people tracked

is_track, henüz hiçbir iz doğrulanmamış karelerde False değeridir; bu sırada boxes.id, None değerindedir. Kimlikleri sayım, yörünge veya "bu nesne 3 saniyedir burada" mantığı için kullan.

Otoyolda Ultralytics YOLO takibi: her otomobil, otobüs ve kamyon kalıcı bir kimlik etiketi ve hareket izi taşır

Takip algoritmasıHızDayanıklılık
bytetrack.yamlDaha hızlı, daha basitNesneler kısa süreliğine kaybolduğunda kimlikleri daha sık kaybeder
botsort.yamlDaha yavaşKamera hareket ederken kimlikleri korumada daha iyi (hareket telafisi; görünüşe dayalı ReID, with_reid ile isteğe bağlıdır)

tracker parametresini belirtmezsen Ultralytics mevcut varsayılan olan tracktrack.yaml değerini kullanır; Track mode ayrıca ocsort.yaml, deepocsort.yaml ve fasttrack.yaml seçeneklerini de sunar. Takip algoritmalarını seçme ve ayarlama, ayrıca bunların üzerine nesne sayımı, ısı haritaları ve hız tahmini oluşturma konuları ByteTrack, BoT-SORT ve TrackTrack ile Nesneleri İzleme başlıklı kılavuzda ele alınır.

Uygulamalı Örnek: Kendi Kamera Döngün#

Gerçek uygulamalar genellikle kareleri kendileri okur — yeniden boyutlandırmak, kırpmak, zaman damgası eklemek veya kamerayı başka kodlarla paylaşmak için — ve her kareyi modele iletir. Bu durumda persist=True, çağrılar arasında takip algoritmasını etkin tutar:

import cv2

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
cap = cv2.VideoCapture("solutions_ci_demo.mp4")  # saved locally by the commands above; or 0, or an rtsp:// URL

seen = set()
while cap.isOpened():
    ok, frame = cap.read()
    if not ok:
        break
    result = model.track(frame, persist=True, classes=[0], tracker="bytetrack.yaml", verbose=False)[0]
    if result.boxes.is_track:
        seen.update(result.boxes.id.int().tolist())
cap.release()
print(f"{len(seen)} unique people, highest ID {max(seen)}")
32 unique people, highest ID 67

track.py ile aynı 32 kişi. En yüksek kimliğin 32 değil 67 olduğuna dikkat et: takip algoritması, hiçbir zaman doğrulanmayan geçici izlere de kimlik atadığından kimliklerde boşluklar olur.

Kaynak Akışın Hızına Yetiş#

30 FPS'lik bir kamera her 33 ms'de bir kare iletir; etkin hızın en yavaşı olan çözme, çıkarım ve yazma hızlarına bağlıdır. Dizüstü bilgisayarımızın CPU'sunda yolo26n, diğer işlemlerin yüküne bağlı olarak farklı çalıştırmalarda 384×640 kare başına 26–46 ms sürdü: bütçe sınırında veya üzerinde, hiçbir ek pay yok. Seninki yetişemiyorsa şu adımları sırayla dene:

İyileştirmeEtki
Daha küçük model (s yerine n)Genellikle 2–3 kat daha hızlı
imgsz değerini düşür (640 yerine 480)Daha az piksel, daha az hesaplama; küçük nesneler ilk önce etkilenir
vid_stride=2İş yükünü yarıya indirir; yavaş hareket eden sahneler için uygundur
GPU veya optimize edilmiş bir dışa aktarmaEn büyük kazanımlar — NVIDIA üzerinde bir TensorRT motoru veya INT8; sonraki derse bak

Birden fazla kameranın aynı anda kullanımı ve bunun için gereken iş parçacığı yönetimi Çoklu Akışta Çıkarım kılavuzunda ele alınır.

Bu Hatalardan Kaçın#

stream=True değerini unutmak

Belirti: Uzun bir kayıtta bellek, süreç çökene kadar artıyor veya canlı kamera çağrısı hiç dönmüyor. Neden: Bu parametre olmadan Python çağrısı, dönmeden önce her kare için bir Results nesnesi toplar. Çözüm: stream=True parametresini geçir ve üreteç üzerinde döngü kur — üreteç, üzerinde yineleme yapana kadar hiçbir işlem yapmaz.

Kendi döngünde persist=True değerini unutmak

Belirti: persist=True olmadan cv2_loop.py içinde sayaç 27'ye düştü ve en yüksek kimlik de 27'ydi: kimlikler her karede yeniden başladığından "benzersiz" sayı yalnızca en yoğun kareyi gösteriyordu. Çözüm: Kare başına bir kez track çağırdığında persist=True parametresini geçir.

En yüksek kimliğe göre saymak

32 kişi için 67 sayısı. Neden: Onaylanmamış izler nedeniyle kimliklerde boşluklar bulunur. Çözüm: track.py örneğindeki gibi, kimlik kümesinin boyutunu say.

İzleyiciyi açıkça belirt

Varsayılan izleyici sürümler arasında değişebilir. Sayıların sürümler arasında karşılaştırılabilir kalması için tracker="bytetrack.yaml" değerini (veya seçtiğin başka bir değeri) geçir.

Dene

Çözümdeki track_any.py öğesini önce demo klipte, sonra da kendi kısa videonda çalıştır. Üç satırlık bir rapor sun: benzersiz nesne sayısı, kare başına ortalama çıkarım süresi (ms) ve bunun kaynak akışının kare süresine uyup uymadığı; uymuyorsa ilk deneyeceğin iyileştirme. yolo track ... save=True ile işaretlenmiş bir çıktı kaydet ve örtülmeler sırasında kimliklerin sabit kalıp kalmadığını not et; titriyorlarsa tracker=botsort.yaml seçeneğini dene.

Tamamlanma ölçütü
Aşağıdakilerin tümü doğru olduğunda dersi tamamlamış olursun.
  • yolo predict veya yolo track kullanarak işaretlenmiş bir video kaydettin.

  • Akış betiğin, boxes.id değerlerinden oluşan bir küme kullanarak benzersiz nesne sayısını yazdırıyor.

  • Kare başına ölçülen ms değerini kaynak akışının kare süresiyle karşılaştırdın ve ilk hız iyileştirme adımını belirttin.

Çözümü göster
import sys

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
seen, times = set(), []
for result in model.track(sys.argv[1], stream=True, persist=True, tracker="bytetrack.yaml", verbose=False):
    times.append(result.speed["inference"])
    if result.boxes.is_track:
        seen.update(result.boxes.id.int().tolist())
print(f"{len(seen)} unique objects, {sum(times) / len(times):.1f} ms inference per frame")

python track_any.py your_video.mp4 ile çalıştır.

32 unique objects, 30.5 ms inference per frame (26-46 ms across runs on a laptop CPU)
Source is 30 FPS -> 33 ms budget: fits only on a quiet machine, with no headroom
First lever: export to OpenVINO or ONNX for this CPU, then vid_stride=2 if still short
Sırada ne var

Modelin Python'da görüntüler ve videolar üzerinde çalışıyor. Son adım: modeli üretim ortamındaki bir çalışma zamanının yükleyebileceği biçime aktar.

İlerlemeni kaydetmek için giriş yap