|
|
|
"""Perform MMYOLO inference on a video as: |
|
|
|
```shell |
|
wget -P checkpoint https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth # noqa: E501, E261. |
|
|
|
python demo/video_demo.py \ |
|
demo/video_demo.mp4 \ |
|
configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ |
|
checkpoint/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth \ |
|
--out demo_result.mp4 |
|
``` |
|
""" |
|
import argparse |
|
|
|
import cv2 |
|
import mmcv |
|
from mmcv.transforms import Compose |
|
from mmdet.apis import inference_detector, init_detector |
|
from mmengine.utils import track_iter_progress |
|
|
|
from mmyolo.registry import VISUALIZERS |
|
|
|
|
|
def parse_args(): |
|
parser = argparse.ArgumentParser(description='MMYOLO video demo') |
|
parser.add_argument('video', help='Video file') |
|
parser.add_argument('config', help='Config file') |
|
parser.add_argument('checkpoint', help='Checkpoint file') |
|
parser.add_argument( |
|
'--device', default='cuda:0', help='Device used for inference') |
|
parser.add_argument( |
|
'--score-thr', type=float, default=0.3, help='Bbox score threshold') |
|
parser.add_argument('--out', type=str, help='Output video file') |
|
parser.add_argument('--show', action='store_true', help='Show video') |
|
parser.add_argument( |
|
'--wait-time', |
|
type=float, |
|
default=1, |
|
help='The interval of show (s), 0 is block') |
|
args = parser.parse_args() |
|
return args |
|
|
|
|
|
def main(): |
|
args = parse_args() |
|
assert args.out or args.show, \ |
|
('Please specify at least one operation (save/show the ' |
|
'video) with the argument "--out" or "--show"') |
|
|
|
|
|
model = init_detector(args.config, args.checkpoint, device=args.device) |
|
|
|
|
|
model.cfg.test_dataloader.dataset.pipeline[ |
|
0].type = 'mmdet.LoadImageFromNDArray' |
|
test_pipeline = Compose(model.cfg.test_dataloader.dataset.pipeline) |
|
|
|
|
|
visualizer = VISUALIZERS.build(model.cfg.visualizer) |
|
|
|
|
|
visualizer.dataset_meta = model.dataset_meta |
|
|
|
video_reader = mmcv.VideoReader(args.video) |
|
video_writer = None |
|
if args.out: |
|
fourcc = cv2.VideoWriter_fourcc(*'mp4v') |
|
video_writer = cv2.VideoWriter( |
|
args.out, fourcc, video_reader.fps, |
|
(video_reader.width, video_reader.height)) |
|
|
|
for frame in track_iter_progress(video_reader): |
|
result = inference_detector(model, frame, test_pipeline=test_pipeline) |
|
visualizer.add_datasample( |
|
name='video', |
|
image=frame, |
|
data_sample=result, |
|
draw_gt=False, |
|
show=False, |
|
pred_score_thr=args.score_thr) |
|
frame = visualizer.get_image() |
|
|
|
if args.show: |
|
cv2.namedWindow('video', 0) |
|
mmcv.imshow(frame, 'video', args.wait_time) |
|
if args.out: |
|
video_writer.write(frame) |
|
|
|
if video_writer: |
|
video_writer.release() |
|
cv2.destroyAllWindows() |
|
|
|
|
|
if __name__ == '__main__': |
|
main() |
|
|