YOLOv5 推理脚本 参数解析和 预测时间计算

1. 推理脚本参数解析

脚本位置:https://github.com/ultralytics/yolov5/blob/master/detect.py

本文目的:通过学习该脚本,让我们可以自己编写别的项目的推理脚本。

主函数:

if __name__ == "__main__":
# 定义一个命令行参数的函数
opt = parse_opt()
main(opt)
import argparse
def parse_opt():
parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path or triton URL')
...
opt = parser.parse_args()
opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1 # expand
print_args(vars(opt))
return opt

argparse 模块是 Python 标准库中推荐的命令行解析模块。

啥叫命令行解析?意思就是你在 命令行(如 windows 中的 cmd,ubuntu 中的 终端等) 中运行一个程序,可以传一些参数过来,该模块就是来解析这些参数的。比如,命令 ls -l-l 就是命令行参数,改变 ls 的行为

一般, argparse 的使用为下面四个步骤:

# 导入该模块
import argparse
# 创建一个解析对象
parser = argparse.ArgumentParser()
# add_argument() 方法用于指定程序能够接受哪些命令行选项
parser.add_argument()
# 调用parse_args()方法进行解析
parser.parse_args()

参数说明:

位置参数

parser.add_argument("echo", help="echo the string you use here")

echo 是一个位置参数, 该参数在运行时候必须提供,否则报错。

可选参数

parser.add_argument("--verbosity", help="increase output verbosity")

--verbosity可选参数,运行程序可以不提供。注意,如果一个可选参数没有在命令行中被使用时,相关变量被赋值为 None

parser.add_argument('--view-img', action='store_true', help='show results')

action 是一个标志,而非需要接受一个值。当这一选项存在时,为 args.view-img 赋值为 True。没有指定时则隐含地赋值为 False

parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")

-v--verbose 的短版本,也就是 二者一样。

我们再看几个参数。

nargs: 表示设置参数个数

  • nargs='*': 表示参数可设置零个或多个
  • nargs='+':表示参数可设置一个或多个
  • nargs='?': 表示参数可设置零个或一个

type: 表示该参数的类型,比如 str、int、float 等。

default: 表示该参数的默认值。我经常会在调试代码中给定我想要的值,然后直接点调试按钮

help: 该参数的帮助说明,用来说明该参数的用途,方便人来看它的意思。

detect.py 脚本中权重文件使用的是这个参数:nargs='+'。这是用于模型集成时候的,也就是可以传递多个权重。

parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path or triton URL')

比如:

python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images

参考:https://github.com/ultralytics/yolov5/issues/318

parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')

显然上面的 '--imgsz', '--img', '--img-size' 是一些简写,都是等价的。 而使用 nargs='+' 目的是可以传递一个 list。

参考:https://zhuanlan.zhihu.com/p/258446208

parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3')

YOLOv5 还可以过滤一些类别。

*args, **kwargs, **vars(args) 区别参考:

https://blog.csdn.net/weixin_46841421/article/details/110871251

vars() 函数 是内置函数:https://www.runoob.com/python/python-func-vars.html

2. 预测推理时间计算

resnet18 为例:

cpu:

python classify/predict.py --weights resnet18.pt --imgsz 64 --nosave --source xx.mp4 --device=cpu

gpu:

python classify/predict.py --weights resnet18.pt --imgsz 64 --nosave --source xx.mp4

resnet18 速度统计:

输入大小 cpu(ms) v100(ms)
64 4.5 3.4
128 8.1 3.5
224 17 3.5
posted @   Zenith_Hugh  阅读(1069)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

微信打赏