Przeglądaj źródła

Fix `LoadStreams()` dataloader frame skip issue (#3833)

* Update datasets.py to read every 4th frame of streams

* Update datasets.py

Co-authored-by: Glenn Jocher <glenn.jocher@ultralytics.com>
modifyDataloader
Feras Oughali GitHub 3 lat temu
rodzic
commit
7d6af69638
Nie znaleziono w bazie danych klucza dla tego podpisu ID klucza GPG: 4AEE18F83AFDEB23
1 zmienionych plików z 7 dodań i 24 usunięć
  1. +7
    -24
      utils/datasets.py

+ 7
- 24
utils/datasets.py Wyświetl plik

@@ -4,7 +4,6 @@ import glob
import hashlib
import json
import logging
import math
import os
import random
import shutil
@@ -15,6 +14,7 @@ from pathlib import Path
from threading import Thread

import cv2
import math
import numpy as np
import torch
import torch.nn.functional as F
@@ -210,15 +210,8 @@ class LoadWebcam: # for inference
def __init__(self, pipe='0', img_size=640, stride=32):
self.img_size = img_size
self.stride = stride

if pipe.isnumeric():
pipe = eval(pipe) # local camera
# pipe = 'rtsp://192.168.1.64/1' # IP camera
# pipe = 'rtsp://username:password@192.168.1.64/1' # IP camera with login
# pipe = 'http://wmccpinetop.axiscam.net/mjpg/video.mjpg' # IP golf camera

self.pipe = pipe
self.cap = cv2.VideoCapture(pipe) # video capture object
self.pipe = eval(pipe) if pipe.isnumeric() else pipe
self.cap = cv2.VideoCapture(self.pipe) # video capture object
self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 3) # set buffer size

def __iter__(self):
@@ -233,18 +226,8 @@ class LoadWebcam: # for inference
raise StopIteration

# Read frame
if self.pipe == 0: # local camera
ret_val, img0 = self.cap.read()
img0 = cv2.flip(img0, 1) # flip left-right
else: # IP camera
n = 0
while True:
n += 1
self.cap.grab()
if n % 30 == 0: # skip frames
ret_val, img0 = self.cap.retrieve()
if ret_val:
break
ret_val, img0 = self.cap.read()
img0 = cv2.flip(img0, 1) # flip left-right

# Print
assert ret_val, f'Camera Error {self.pipe}'
@@ -308,12 +291,12 @@ class LoadStreams: # multiple IP or RTSP cameras

def update(self, i, cap):
# Read stream `i` frames in daemon thread
n, f = 0, self.frames[i]
n, f, read = 0, self.frames[i], 1 # frame number, frame array, inference every 'read' frame
while cap.isOpened() and n < f:
n += 1
# _, self.imgs[index] = cap.read()
cap.grab()
if n % 4: # read every 4th frame
if n % read == 0:
success, im = cap.retrieve()
self.imgs[i] = im if success else self.imgs[i] * 0
time.sleep(1 / self.fps[i]) # wait time

Ładowanie…
Anuluj
Zapisz