yolov5 模型各个参数详解及__name__ == ‘__main__的理解

学习一个模型的使用,往往是从参数开始的,弄懂了各个参数的作用,才能更好的进行应用,本文就对yolov5 模型各个参数进行详细的说明,并且提到了对__name__ == '__main__'的理解。


一、detect文件

 yolov5 模型的环境配置问题,之前已经讲过了。

环境配置好后,就可以运行detect 对yolov5进行测试,

这个detect中就包含了yolov5 模型的所有参数。

下面,我们来一个一个的看看。

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', nargs='+', type=str, default='yolov5m.pt', help='model.pt path(s)')
    parser.add_argument('--source', type=str, default='data/images', help='source')  # file/folder, 0 for webcam
    parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
    parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')
    parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')
    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='display 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('--nosave', action='store_true', help='do not save images/videos')
    parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 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('--update', action='store_true', help='update all models')
    parser.add_argument('--project', default='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')
    opt = parser.parse_args()
    print(opt)
    check_requirements(exclude=('pycocotools', 'thop'))

二、对于if __name__ == '__main__'  的理解

其实不管是Java、C还是C++, 每次开启一个程序,都必须写一个主函数作为程序的入口,也就是我们常说的main函数。

与Java、C、C++等几种语言不同的是,Python是一种解释型脚本语言,在执行之前不同,要将所有代码先编译成中间代码,
Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,
所以Python中并不需要一个统一的main()作为程序的入口。

既然Python中并不需要一个统一的main()作为程序的入口,那if __name__ == '__main__' 又有什么用呢?

我们知道,当我们把模块A中的代码导入 模块B中,对于import A,只要B模块代码运行到该import语句,模块A的代码会被执行。
但是我们写代码的时候经常写完一个模型,我们会在在底下进行测试。关于测试我们是不想它运行的,那么这时后我们就可以写

if __name__ == '__main__'

__name__ == '__main__' 表示在当前文件中,如果在if __name__ == '__main__': 条件下 写入测试代码,如此可以避免测试代码在模块被导入后执行。

因为“__name__”是Python的内置变量,用于指代当前模块。我们使用if 语句,

可以这样理解: 在当前模块,“__name__”的值就是“__main__”,当被导入另一模块时,“__name__”的值就是模块的真实名称。

所以我们调用 if __name__ == '__main__' , 导入的另一模块__name__ 不等于 '__main__' ,所以if __name__ == '__main__'底下的代码就不会被执行。

解释的有些繁琐,如果还不懂,可以看看底下博主写的文章。
 

三  对于parser = argparse.ArgumentParser()  的理解

argparse是python用于解析命令行参数和选项的标准模块,它的作用是用于解析命令行参数,输入训练的参数和选项。

我们常常可以把argparse的使用简化成下面四个步骤

import argparse            首先导入该模块;

parser = argparse.ArgumentParser()           然后创建一个解析对象;

parser.add_argument()

然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;

parser.parse_args()
最后调用parse_args()方法进行解析;解析成功之后即可使用。
 

四 参数详解

1 weights

parser.add_argument('--weights', nargs='+', type=str, default='yolov5m.pt', help='model.pt path(s)')

参数名:'--weights'
类型:type=str
default='yolov5m.pt' 就是通过default获得的一个值,再赋给参数'--weights'
它的目的就是指定一个网络模型

这种模型有八种
分别是yolov5s.pt, yolov5m.pt, yolov5l.pt, yolov5x.pt   这四种对应的是img = 640
还有 yolov5s6.pt, yolov5m6.pt, yolov5l6.pt, yolov5x6.pt   这四种对应的是img = 1280


2 source

 parser.add_argument('--source', type=str, default='data/images', help='source')  # file/folder, 0 for webcam

参数source, 就是给我们网络指定一个输入

default='data/images' 当它输入的是文件夹的时候,它就会将文件夹内的所有图片都进行一个检测,并把结果保存起来

如果要检测一张图片,default='图片的相对位置' ,点击运行程序即可

如果要检测一个视频, 将视频下载好,然后default='视频的相对位置' ,点击运行程序即可

3  img-size

parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')

img-size 照片的尺寸,它在网络运行过程中,会将输入图片/视频的大小进行一个resize, 再送到我们的神经网络中,
输入和输出的大小可能不变,但是在运算的过程中会改变

default=640,就是我们前面说的,对应的是img = 640,也就是说,weights使用的是yolov5s.pt, yolov5m.pt, yolov5l.pt, yolov5x.pt 这四个模型中的一个 

4   conf-thres

parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')

conf-thres 置信度,只有当某一检测区的置信度大于0.25时,才输出它是一个检测目标,它的默认值是default=0.25,可以自己修改。

5   iou-thres 

parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')

iou-thres 置信度,

NMS(non maximu suppression)就是识别东西的时,如果三个框都显示一个人,那么就使用IOU(intersection over union) threshold来计算哪个框包含人的部分最多,就确定为哪个框。

IOU的计算公式就是将两个框的重合区面积除以框的总面积,如果两个框完全重合,那值就是1

6  device

parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')

decice 指设备,就是程序在哪运行

7    view-img

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

view-img 这个参数里没有default了,有一个action='store_true',意思时我们调用时它就会返回true,
效果就是:如果时图像,图像的运行结果会在程序运行结束展现出来,如果是视频,你视频的每一帧运行结果都会展现,也就是一边运行程序,一边展现成果。

然后如何使用这个参数呢,

可以在命令行打开,在命令行输入python detect.py就是运行detect这个文件,

输入python detect.py --viem-img 就可以运行detect里面的--view-img这个参数

除此之外也可以在pun/debug configurations 里面的parameters 写上--view-img这个参数,点击ok,运行程序,效果也是一样。

8  save-txt

parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')

   --save-txt ,就是保存文本的意思,设置为action='store_true', 运行后,会产生一个label文件,里面有图片的一些信息

9  增强识别效果的参数

     parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt         labels')
     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('--nosave', action='store_true', help='do not save images/videos')


这几个参数的作用都是差不多的,都是增强识别效果的,也就是加强分类的准确度,提升结果的方式

10  classes', nargs

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

--classes,这个参数就表示类数,像0,1,2,3等分别代表不同的类,默认会分很多类,我们也可以自己设置,、
如果我们写--classes 0,  则在图片输出的结果中只有0这一个类别

11    update

parser.add_argument('--update', action='store_true', help='update all models')

--update,如果设置了这个参数的话, action='store_true',它就会将模型中的一些部分,像优化器什么的去掉,只保留预测需要用到的部分

12    project

parser.add_argument('--project', default='runs/detect', help='save results to project/name')

--project, 把我们运行的结果保存到什么位置,它默认的是default='runs/detect',我们可以修改

13    name

parser.add_argument('--name', default='exp', help='save results to project/name')

--name, 就是运行结果保存的名字

14    exist-ok

parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')

--exist-ok,这个参数如果设置为 action='store_true' , 那么运行的结果就不行新创建文件夹,如果不对它进行设置,程序每运行一次,结果都i会保存到一个新的文件夹

如果感觉自己对于if __name__ == '__main__'  的理解还是不太懂的,可以看看知乎上的解答:

(3 封私信 / 10 条消息) if __name__ == '__main__' 如何正确理解? - 知乎 (zhihu.com)


总结

每个参数都有不同的用法,debug可以查看每个参数的默认值,根据需要为我们可以做出相应的修改。

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓亮.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值