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.
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.mp4video 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/predictframe 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 frameAynı 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 trackedis_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.

| Takip algoritması | Hız | Dayanıklılık |
|---|---|---|
bytetrack.yaml | Daha hızlı, daha basit | Nesneler kısa süreliğine kaybolduğunda kimlikleri daha sık kaybeder |
botsort.yaml | Daha 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 67track.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ştirme | Etki |
|---|---|
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 aktarma | En 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#
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.
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.
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.
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.
Çö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