Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用detect.py 和 hub 推理。 #15

Open
hshs0123 opened this issue Sep 30, 2021 · 6 comments
Open

使用detect.py 和 hub 推理。 #15

hshs0123 opened this issue Sep 30, 2021 · 6 comments
Labels
question Further information is requested

Comments

@hshs0123
Copy link

E:\anaconda3\envs\pytorch\python.exe C:/yolov5-master/detect.py
detect: weights=C:/Users/10980/PycharmProjects/best.pt, source=runs/detect/exp25/zidane.jpg, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=0, view_img=True, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs/detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False
YOLOv5 2021-9-21 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers...
Model Summary: 224 layers, 7056607 parameters, 0 gradients, 16.3 GFLOPs
image 1/1 C:\yolov5-master\runs\detect\exp25\zidane.jpg: 384x640 2 person_heads, 2 person_vboxs, Done. (0.016s)
Speed: 0.0ms pre-process, 15.6ms inference, 0.0ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs\detect\exp26
#############################################

E:\anaconda3\envs\pytorch\python.exe C:/Users/10980/PycharmProjects/msstestcapture.py
Using cache found in C:\Users\10980/.cache\torch\hub\ultralytics_yolov5_master
YOLOv5 2021-9-24 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers...
Model Summary: 224 layers, 7266973 parameters, 0 gradients
Adding AutoShape...
image 1/1: 720x1280 2 persons, 2 ties
Speed: 15.6ms pre-process, 15.6ms inference, 0.0ms NMS per image at shape (1, 3, 384, 640)

Process finished with exit code 0

Run detect.py 为什么速度更快?同一张图片。看时间是跳过了pre-process.
Speed: 0.0ms pre-process, 15.6ms inference, 0.0ms NMS per image at shape (1, 3, 640, 640)
但是为什么hub 不是这样呢? 或者怎么提升这个速度呢?
谢谢!

# Model
# model = torch.hub.load('ultralytics/yolov5', 'yolov5s')  # or yolov5m, yolov5l, yolov5x, custom

# Images
img = 'C:/yolov5-master/GettyImages-688402807_header-1024x575.jpg'  # or file, Path, PIL, OpenCV, numpy, list

# Inference
results = model(img)
# results.save()
# Results
results.print()  # or .show(), .save(), .crop(), .pandas(), etc.

E:\anaconda3\envs\pytorch\python.exe C:/Users/10980/PycharmProjects/msstestcapture.py
Using cache found in C:\Users\10980/.cache\torch\hub\ultralytics_yolov5_master
YOLOv5 2021-9-24 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers...
Model Summary: 224 layers, 7266973 parameters, 0 gradients
Adding AutoShape...
image 1/1: 720x1280 2 persons, 2 ties
Speed: 15.6ms pre-process, 15.6ms inference, 0.0ms NMS per image at shape (1, 3, 384, 640)

@hshs0123 hshs0123 added the question Further information is requested label Sep 30, 2021
@github-actions
Copy link

👋 你好 @hshs0123, 如有任何问题,请首先检查你的运行指令有没有问题,如果指令没有问题,请尝试更新作者仓库的最新代码:

  # 如果没下载官方代码
  $ git clone https://github.com/ultralytics/yolov5.git
  $ cd yolov5
  $ pip install -r requirements.txt
  # 如果已下载官方代码
  $ cd yolov5
  $ git reset --hard
  $ git pull
  $ pip install -r requirements.txt

更多请参考⭐️英文官方教程

依赖

Python版本3.6或更高,python依赖库都在requirements.txt 里面,直接pip install -r requirements.txt即可。
如果你使用Windows的话,尽量使用CUDA10.2和对应版本的pytorch,CUDA11+会有些许问题。

环境

下面是已经配置好环境的免费GPU训练环境:

@wudashuo
Copy link
Owner

python上我还没见过0ms的前后处理,只在C++上见过,你应该改过detect.py吧?看看你统计时间的代码是不是动过?而且还改错了,git pull一下最新的代码吧。
还有你15.6ms的pre-process有点离谱,而且跟检测时间一模一样,是不是这块代码弄错了

@hshs0123
Copy link
Author

python上我还没见过0ms的前后处理,只在C++上见过,你应该改过detect.py吧?看看你统计时间的代码是不是动过?而且还改错了,git pull一下最新的代码吧。 还有你15.6ms的pre-process有点离谱,而且跟检测时间一模一样,是不是这块代码弄错了

重新下载了一下。 但结果似乎还是一样。肯定是最新的了。

E:\anaconda3\envs\pytorch\python.exe C:/Users/10980/yolov5-master/loadformhub.py
Using cache found in C:\Users\10980/.cache\torch\hub\ultralytics_yolov5_master
YOLOv5  2021-9-30 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers... 
Model Summary: 224 layers, 7266973 parameters, 0 gradients
Adding AutoShape... 
100%|██████████| 165k/165k [00:00<00:00, 3.30MB/s]
100%|██████████| 476k/476k [00:00<00:00, 5.12MB/s]
image 1/2: 720x1280 2 persons, 2 ties
image 2/2: 1080x810 4 persons, 1 bus
Speed: 9.0ms pre-process, 9.0ms inference, 2.5ms NMS per image at shape (2, 3, 640, 640)
Saved 2 images to runs\detect\exp12

Process finished with exit code 0

上面全是直接照搬sample的。

##############################

E:\anaconda3\envs\pytorch\python.exe C:/Users/10980/yolov5-master/detect.py
detect: weights=yolov5s.pt, source=data\images, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs\detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False
YOLOv5  2021-9-30 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers... 
Model Summary: 224 layers, 7266973 parameters, 0 gradients
image 1/2 C:\Users\10980\yolov5-master\data\images\bus.jpg: 640x480 4 persons, 1 bus, 1 fire hydrant, Done. (0.016s)
image 2/2 C:\Users\10980\yolov5-master\data\images\zidane.jpg: 384x640 2 persons, 2 ties, Done. (0.016s)
Speed: 0.0ms pre-process, 16.0ms inference, 2.0ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs\detect\exp13

Process finished with exit code 0

@hshs0123
Copy link
Author

python上我还没见过0ms的前后处理,只在C++上见过,你应该改过detect.py吧?看看你统计时间的代码是不是动过?而且还改错了,git pull一下最新的代码吧。 还有你15.6ms的pre-process有点离谱,而且跟检测时间一模一样,是不是这块代码弄错了

重新下载了一下。 但结果似乎还是一样。肯定是最新的了。

E:\anaconda3\envs\pytorch\python.exe C:/Users/10980/yolov5-master/loadformhub.py
Using cache found in C:\Users\10980/.cache\torch\hub\ultralytics_yolov5_master
YOLOv5  2021-9-30 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers... 
Model Summary: 224 layers, 7266973 parameters, 0 gradients
Adding AutoShape... 
100%|██████████| 165k/165k [00:00<00:00, 3.30MB/s]
100%|██████████| 476k/476k [00:00<00:00, 5.12MB/s]
image 1/2: 720x1280 2 persons, 2 ties
image 2/2: 1080x810 4 persons, 1 bus
Speed: 9.0ms pre-process, 9.0ms inference, 2.5ms NMS per image at shape (2, 3, 640, 640)
Saved 2 images to runs\detect\exp12

Process finished with exit code 0

上面全是直接照搬sample的。

##############################

E:\anaconda3\envs\pytorch\python.exe C:/Users/10980/yolov5-master/detect.py
detect: weights=yolov5s.pt, source=data\images, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs\detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False
YOLOv5  2021-9-30 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers... 
Model Summary: 224 layers, 7266973 parameters, 0 gradients
image 1/2 C:\Users\10980\yolov5-master\data\images\bus.jpg: 640x480 4 persons, 1 bus, 1 fire hydrant, Done. (0.016s)
image 2/2 C:\Users\10980\yolov5-master\data\images\zidane.jpg: 384x640 2 persons, 2 ties, Done. (0.016s)
Speed: 0.0ms pre-process, 16.0ms inference, 2.0ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs\detect\exp13

Process finished with exit code 0

###################
这就分析了一张图片

E:\anaconda3\envs\pytorch\python.exe C:/Users/10980/yolov5-master/loadformhub.py
Using cache found in C:\Users\10980/.cache\torch\hub\ultralytics_yolov5_master
YOLOv5  2021-9-30 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers... 
Model Summary: 224 layers, 7266973 parameters, 0 gradients
Adding AutoShape... 
image 1/1: 1080x810 4 persons, 1 bus, 1 fire hydrant
Speed: 19.0ms pre-process, 17.0ms inference, 5.0ms NMS per image at shape (1, 3, 640, 480)
Saved 1 image to runs\detect\exp16

Process finished with exit code 0

@hshs0123
Copy link
Author

python上我还没见过0ms的前后处理,只在C++上见过,你应该改过detect.py吧?看看你统计时间的代码是不是动过?而且还改错了,git pull一下最新的代码吧。 还有你15.6ms的pre-process有点离谱,而且跟检测时间一模一样,是不是这块代码弄错了

重新下载了一下。 但结果似乎还是一样。肯定是最新的了。

E:\anaconda3\envs\pytorch\python.exe C:/Users/10980/yolov5-master/loadformhub.py
Using cache found in C:\Users\10980/.cache\torch\hub\ultralytics_yolov5_master
YOLOv5  2021-9-30 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers... 
Model Summary: 224 layers, 7266973 parameters, 0 gradients
Adding AutoShape... 
100%|██████████| 165k/165k [00:00<00:00, 3.30MB/s]
100%|██████████| 476k/476k [00:00<00:00, 5.12MB/s]
image 1/2: 720x1280 2 persons, 2 ties
image 2/2: 1080x810 4 persons, 1 bus
Speed: 9.0ms pre-process, 9.0ms inference, 2.5ms NMS per image at shape (2, 3, 640, 640)
Saved 2 images to runs\detect\exp12

Process finished with exit code 0

上面全是直接照搬sample的。
##############################

E:\anaconda3\envs\pytorch\python.exe C:/Users/10980/yolov5-master/detect.py
detect: weights=yolov5s.pt, source=data\images, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs\detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False
YOLOv5  2021-9-30 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers... 
Model Summary: 224 layers, 7266973 parameters, 0 gradients
image 1/2 C:\Users\10980\yolov5-master\data\images\bus.jpg: 640x480 4 persons, 1 bus, 1 fire hydrant, Done. (0.016s)
image 2/2 C:\Users\10980\yolov5-master\data\images\zidane.jpg: 384x640 2 persons, 2 ties, Done. (0.016s)
Speed: 0.0ms pre-process, 16.0ms inference, 2.0ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs\detect\exp13

Process finished with exit code 0

################### 这就分析了一张图片

E:\anaconda3\envs\pytorch\python.exe C:/Users/10980/yolov5-master/loadformhub.py
Using cache found in C:\Users\10980/.cache\torch\hub\ultralytics_yolov5_master
YOLOv5  2021-9-30 torch 1.9.1 CUDA:0 (NVIDIA GeForce RTX 2080 Ti, 11264.0MB)

Fusing layers... 
Model Summary: 224 layers, 7266973 parameters, 0 gradients
Adding AutoShape... 
image 1/1: 1080x810 4 persons, 1 bus, 1 fire hydrant
Speed: 19.0ms pre-process, 17.0ms inference, 5.0ms NMS per image at shape (1, 3, 640, 480)
Saved 1 image to runs\detect\exp16

Process finished with exit code 0
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
"""
Run inference on images, videos, directories, streams, etc.

Usage:
    $ python path/to/detect.py --source path/to/img.jpg --weights yolov5s.pt --img 640
"""

import argparse
import sys
from pathlib import Path

import cv2
import numpy as np
import torch
import torch.backends.cudnn as cudnn

FILE = Path(__file__).resolve()
ROOT = FILE.parents[0]  # YOLOv5 root directory
if str(ROOT) not in sys.path:
    sys.path.append(str(ROOT))  # add ROOT to PATH
ROOT = ROOT.relative_to(Path.cwd())  # relative

from models.experimental import attempt_load
from utils.datasets import LoadImages, LoadStreams
from utils.general import apply_classifier, check_img_size, check_imshow, check_requirements, check_suffix, colorstr, \
    increment_path, non_max_suppression, print_args, save_one_box, scale_coords, set_logging, \
    strip_optimizer, xyxy2xywh
from utils.plots import Annotator, colors
from utils.torch_utils import load_classifier, select_device, time_sync


@torch.no_grad()
def run(weights=ROOT / 'yolov5s.pt',  # model.pt path(s)
        source=ROOT / 'data/images',  # file/dir/URL/glob, 0 for webcam
        imgsz=640,  # inference size (pixels)
        conf_thres=0.25,  # confidence threshold
        iou_thres=0.45,  # NMS IOU threshold
        max_det=1000,  # maximum detections per image
        device='',  # cuda device, i.e. 0 or 0,1,2,3 or cpu
        view_img=False,  # show results
        save_txt=False,  # save results to *.txt
        save_conf=False,  # save confidences in --save-txt labels
        save_crop=False,  # save cropped prediction boxes
        nosave=False,  # do not save images/videos
        classes=None,  # filter by class: --class 0, or --class 0 2 3
        agnostic_nms=False,  # class-agnostic NMS
        augment=False,  # augmented inference
        visualize=False,  # visualize features
        update=False,  # update all models
        project=ROOT / 'runs/detect',  # save results to project/name
        name='exp',  # save results to project/name
        exist_ok=False,  # existing project/name ok, do not increment
        line_thickness=3,  # bounding box thickness (pixels)
        hide_labels=False,  # hide labels
        hide_conf=False,  # hide confidences
        half=False,  # use FP16 half-precision inference
        ):
    source = str(source)
    save_img = not nosave and not source.endswith('.txt')  # save inference images
    webcam = source.isnumeric() or source.endswith('.txt') or source.lower().startswith(
        ('rtsp://', 'rtmp://', 'http://', 'https://'))

    # Directories
    save_dir = increment_path(Path(project) / name, exist_ok=exist_ok)  # increment run
    (save_dir / 'labels' if save_txt else save_dir).mkdir(parents=True, exist_ok=True)  # make dir

    # Initialize
    set_logging()
    device = select_device(device)
    half &= device.type != 'cpu'  # half precision only supported on CUDA

    # Load model
    w = weights[0] if isinstance(weights, list) else weights
    classify, suffix, suffixes = False, Path(w).suffix.lower(), ['.pt', '.onnx', '.tflite', '.pb', '']
    check_suffix(w, suffixes)  # check weights have acceptable suffix
    pt, onnx, tflite, pb, saved_model = (suffix == x for x in suffixes)  # backend booleans
    stride, names = 64, [f'class{i}' for i in range(1000)]  # assign defaults
    if pt:
        model = attempt_load(weights, map_location=device)  # load FP32 model
        stride = int(model.stride.max())  # model stride
        names = model.module.names if hasattr(model, 'module') else model.names  # get class names
        if half:
            model.half()  # to FP16
        if classify:  # second-stage classifier
            modelc = load_classifier(name='resnet50', n=2)  # initialize
            modelc.load_state_dict(torch.load('resnet50.pt', map_location=device)['model']).to(device).eval()
    elif onnx:
        check_requirements(('onnx', 'onnxruntime'))
        import onnxruntime
        session = onnxruntime.InferenceSession(w, None)
    else:  # TensorFlow models
        check_requirements(('tensorflow>=2.4.1',))
        import tensorflow as tf
        if pb:  # https://www.tensorflow.org/guide/migrate#a_graphpb_or_graphpbtxt
            def wrap_frozen_graph(gd, inputs, outputs):
                x = tf.compat.v1.wrap_function(lambda: tf.compat.v1.import_graph_def(gd, name=""), [])  # wrapped import
                return x.prune(tf.nest.map_structure(x.graph.as_graph_element, inputs),
                               tf.nest.map_structure(x.graph.as_graph_element, outputs))

            graph_def = tf.Graph().as_graph_def()
            graph_def.ParseFromString(open(w, 'rb').read())
            frozen_func = wrap_frozen_graph(gd=graph_def, inputs="x:0", outputs="Identity:0")
        elif saved_model:
            model = tf.keras.models.load_model(w)
        elif tflite:
            interpreter = tf.lite.Interpreter(model_path=w)  # load TFLite model
            interpreter.allocate_tensors()  # allocate
            input_details = interpreter.get_input_details()  # inputs
            output_details = interpreter.get_output_details()  # outputs
            int8 = input_details[0]['dtype'] == np.uint8  # is TFLite quantized uint8 model
    imgsz = check_img_size(imgsz, s=stride)  # check image size

    # Dataloader
    if webcam:
        view_img = check_imshow()
        cudnn.benchmark = True  # set True to speed up constant image size inference
        dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=pt)
        bs = len(dataset)  # batch_size
    else:
        dataset = LoadImages(source, img_size=imgsz, stride=stride, auto=pt)
        bs = 1  # batch_size
    vid_path, vid_writer = [None] * bs, [None] * bs

    # Run inference
    if pt and device.type != 'cpu':
        model(torch.zeros(1, 3, *imgsz).to(device).type_as(next(model.parameters())))  # run once
    dt, seen = [0.0, 0.0, 0.0], 0
    for path, img, im0s, vid_cap in dataset:
        t1 = time_sync()
        if onnx:
            img = img.astype('float32')
        else:
            img = torch.from_numpy(img).to(device)
            img = img.half() if half else img.float()  # uint8 to fp16/32
        img = img / 255.0  # 0 - 255 to 0.0 - 1.0
        if len(img.shape) == 3:
            img = img[None]  # expand for batch dim
        t2 = time_sync()
        dt[0] += t2 - t1

        # Inference
        if pt:
            visualize = increment_path(save_dir / Path(path).stem, mkdir=True) if visualize else False
            pred = model(img, augment=augment, visualize=visualize)[0]
        elif onnx:
            pred = torch.tensor(session.run([session.get_outputs()[0].name], {session.get_inputs()[0].name: img}))
        else:  # tensorflow model (tflite, pb, saved_model)
            imn = img.permute(0, 2, 3, 1).cpu().numpy()  # image in numpy
            if pb:
                pred = frozen_func(x=tf.constant(imn)).numpy()
            elif saved_model:
                pred = model(imn, training=False).numpy()
            elif tflite:
                if int8:
                    scale, zero_point = input_details[0]['quantization']
                    imn = (imn / scale + zero_point).astype(np.uint8)  # de-scale
                interpreter.set_tensor(input_details[0]['index'], imn)
                interpreter.invoke()
                pred = interpreter.get_tensor(output_details[0]['index'])
                if int8:
                    scale, zero_point = output_details[0]['quantization']
                    pred = (pred.astype(np.float32) - zero_point) * scale  # re-scale
            pred[..., 0] *= imgsz[1]  # x
            pred[..., 1] *= imgsz[0]  # y
            pred[..., 2] *= imgsz[1]  # w
            pred[..., 3] *= imgsz[0]  # h
            pred = torch.tensor(pred)
        t3 = time_sync()
        dt[1] += t3 - t2

        # NMS
        pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)
        dt[2] += time_sync() - t3

        # Second-stage classifier (optional)
        if classify:
            pred = apply_classifier(pred, modelc, img, im0s)

        # Process predictions
        for i, det in enumerate(pred):  # per image
            seen += 1
            if webcam:  # batch_size >= 1
                p, s, im0, frame = path[i], f'{i}: ', im0s[i].copy(), dataset.count
            else:
                p, s, im0, frame = path, '', im0s.copy(), getattr(dataset, 'frame', 0)

            p = Path(p)  # to Path
            save_path = str(save_dir / p.name)  # img.jpg
            txt_path = str(save_dir / 'labels' / p.stem) + ('' if dataset.mode == 'image' else f'_{frame}')  # img.txt
            s += '%gx%g ' % img.shape[2:]  # print string
            gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwh
            imc = im0.copy() if save_crop else im0  # for save_crop
            annotator = Annotator(im0, line_width=line_thickness, example=str(names))
            if len(det):
                # Rescale boxes from img_size to im0 size
                det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()

                # Print results
                for c in det[:, -1].unique():
                    n = (det[:, -1] == c).sum()  # detections per class
                    s += f"{n} {names[int(c)]}{'s' * (n > 1)}, "  # add to string

                # Write results
                for *xyxy, conf, cls in reversed(det):
                    if save_txt:  # Write to file
                        xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywh
                        line = (cls, *xywh, conf) if save_conf else (cls, *xywh)  # label format
                        with open(txt_path + '.txt', 'a') as f:
                            f.write(('%g ' * len(line)).rstrip() % line + '\n')

                    if save_img or save_crop or view_img:  # Add bbox to image
                        c = int(cls)  # integer class
                        label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}')
                        annotator.box_label(xyxy, label, color=colors(c, True))
                        if save_crop:
                            save_one_box(xyxy, imc, file=save_dir / 'crops' / names[c] / f'{p.stem}.jpg', BGR=True)

            # Print time (inference-only)
            print(f'{s}Done. ({t3 - t2:.3f}s)')

            # Stream results
            im0 = annotator.result()
            if view_img:
                cv2.imshow(str(p), im0)
                cv2.waitKey(1)  # 1 millisecond

            # Save results (image with detections)
            if save_img:
                if dataset.mode == 'image':
                    cv2.imwrite(save_path, im0)
                else:  # 'video' or 'stream'
                    if vid_path[i] != save_path:  # new video
                        vid_path[i] = save_path
                        if isinstance(vid_writer[i], cv2.VideoWriter):
                            vid_writer[i].release()  # release previous video writer
                        if vid_cap:  # video
                            fps = vid_cap.get(cv2.CAP_PROP_FPS)
                            w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
                            h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
                        else:  # stream
                            fps, w, h = 30, im0.shape[1], im0.shape[0]
                            save_path += '.mp4'
                        vid_writer[i] = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
                    vid_writer[i].write(im0)

    # Print results
    t = tuple(x / seen * 1E3 for x in dt)  # speeds per image
    print(f'Speed: %.1fms pre-process, %.1fms inference, %.1fms NMS per image at shape {(1, 3, *imgsz)}' % t)
    if save_txt or save_img:
        s = f"\n{len(list(save_dir.glob('labels/*.txt')))} labels saved to {save_dir / 'labels'}" if save_txt else ''
        print(f"Results saved to {colorstr('bold', save_dir)}{s}")
    if update:
        strip_optimizer(weights)  # update model (to fix SourceChangeWarning)


def parse_opt():
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path(s)')
    parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob, 0 for webcam')
    parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
    parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold')
    parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold')
    parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image')
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--view-img', action='store_true', help='show results')
    parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
    parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
    parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes')
    parser.add_argument('--nosave', action='store_true', help='do not save images/videos')
    parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3')
    parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
    parser.add_argument('--augment', action='store_true', help='augmented inference')
    parser.add_argument('--visualize', action='store_true', help='visualize features')
    parser.add_argument('--update', action='store_true', help='update all models')
    parser.add_argument('--project', default=ROOT / 'runs/detect', help='save results to project/name')
    parser.add_argument('--name', default='exp', help='save results to project/name')
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    parser.add_argument('--line-thickness', default=3, type=int, help='bounding box thickness (pixels)')
    parser.add_argument('--hide-labels', default=False, action='store_true', help='hide labels')
    parser.add_argument('--hide-conf', default=False, action='store_true', help='hide confidences')
    parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference')
    opt = parser.parse_args()
    opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  # expand
    print_args(FILE.stem, opt)
    return opt


def main(opt):
    check_requirements(exclude=('tensorboard', 'thop'))
    run(**vars(opt))


if __name__ == "__main__":
    opt = parse_opt()
    main(opt)

@wudashuo
Copy link
Owner

wudashuo commented Oct 8, 2021

  1. 既然是官方代码,那应该没问题,0ms的预处理可能就是你硬件好,速度太快了,我这边一般都是零点几毫秒的预处理时间。
  2. 从hub上加载确实是要慢的,因为你的代码要调用./cache目录下的yolov5工程。如果你的图片还是官方样例的img = 'https://ultralytics.com/images/zidane.jpg', 那可能从网络加载图片的时间也会被算进去,时间就更长了。
    还有一些建议:
  3. 不要使用Windows,会遇见各种各样奇怪的问题
  4. 善用git,别再下压缩包了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants