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 @ 2022-12-09 15:29  cold_moon  阅读(837)  评论(0编辑  收藏  举报