@@ -187,7 +187,7 @@ def __iter__(self):
187
187
188
188
class LoadImages :
189
189
# YOLOv5 image/video dataloader, i.e. `python detect.py --source image.jpg/vid.mp4`
190
- def __init__ (self , path , img_size = 640 , stride = 32 , auto = True , transforms = None ):
190
+ def __init__ (self , path , img_size = 640 , stride = 32 , auto = True , transforms = None , vid_stride = 1 ):
191
191
files = []
192
192
for p in sorted (path ) if isinstance (path , (list , tuple )) else [path ]:
193
193
p = str (Path (p ).resolve ())
@@ -212,6 +212,7 @@ def __init__(self, path, img_size=640, stride=32, auto=True, transforms=None):
212
212
self .mode = 'image'
213
213
self .auto = auto
214
214
self .transforms = transforms # optional
215
+ self .vid_stride = vid_stride # video frame-rate stride
215
216
if any (videos ):
216
217
self ._new_video (videos [0 ]) # new video
217
218
else :
@@ -232,6 +233,7 @@ def __next__(self):
232
233
# Read video
233
234
self .mode = 'video'
234
235
ret_val , im0 = self .cap .read ()
236
+ self .cap .set (cv2 .CAP_PROP_POS_FRAMES , self .vid_stride * (self .frame + 1 )) # read at vid_stride
235
237
while not ret_val :
236
238
self .count += 1
237
239
self .cap .release ()
@@ -242,7 +244,7 @@ def __next__(self):
242
244
ret_val , im0 = self .cap .read ()
243
245
244
246
self .frame += 1
245
- # im0 = self._cv2_rotate(im0) # for use if cv2 auto rotation is False
247
+ # im0 = self._cv2_rotate(im0) # for use if cv2 autorotation is False
246
248
s = f'video { self .count + 1 } /{ self .nf } ({ self .frame } /{ self .frames } ) { path } : '
247
249
248
250
else :
@@ -265,7 +267,7 @@ def _new_video(self, path):
265
267
# Create a new video capture object
266
268
self .frame = 0
267
269
self .cap = cv2 .VideoCapture (path )
268
- self .frames = int (self .cap .get (cv2 .CAP_PROP_FRAME_COUNT ))
270
+ self .frames = int (self .cap .get (cv2 .CAP_PROP_FRAME_COUNT ) / self . vid_stride )
269
271
self .orientation = int (self .cap .get (cv2 .CAP_PROP_ORIENTATION_META )) # rotation degrees
270
272
# self.cap.set(cv2.CAP_PROP_ORIENTATION_AUTO, 0) # disable https://github.com/ultralytics/yolov5/issues/8493
271
273
@@ -285,11 +287,12 @@ def __len__(self):
285
287
286
288
class LoadStreams :
287
289
# YOLOv5 streamloader, i.e. `python detect.py --source 'rtsp://example.com/media.mp4' # RTSP, RTMP, HTTP streams`
288
- def __init__ (self , sources = 'streams.txt' , img_size = 640 , stride = 32 , auto = True , transforms = None ):
290
+ def __init__ (self , sources = 'streams.txt' , img_size = 640 , stride = 32 , auto = True , transforms = None , vid_stride = 1 ):
289
291
torch .backends .cudnn .benchmark = True # faster for fixed-size inference
290
292
self .mode = 'stream'
291
293
self .img_size = img_size
292
294
self .stride = stride
295
+ self .vid_stride = vid_stride # video frame-rate stride
293
296
sources = Path (sources ).read_text ().rsplit () if Path (sources ).is_file () else [sources ]
294
297
n = len (sources )
295
298
self .sources = [clean_str (x ) for x in sources ] # clean source names for later
@@ -329,11 +332,11 @@ def __init__(self, sources='streams.txt', img_size=640, stride=32, auto=True, tr
329
332
330
333
def update (self , i , cap , stream ):
331
334
# Read stream `i` frames in daemon thread
332
- n , f , read = 0 , self .frames [i ], 1 # frame number, frame array, inference every 'read' frame
335
+ n , f = 0 , self .frames [i ] # frame number, frame array
333
336
while cap .isOpened () and n < f :
334
337
n += 1
335
338
cap .grab () # .read() = .grab() followed by .retrieve()
336
- if n % read == 0 :
339
+ if n % self . vid_stride == 0 :
337
340
success , im = cap .retrieve ()
338
341
if success :
339
342
self .imgs [i ] = im
0 commit comments