大体上对yolov5模型有了初步了解。模型类似于应用程序模板,程序员拿过来改一改就能弄出自己需求功能的应用程序。上手只需要修改需要的几个参数或位置,即可拿来跑出自己的模型权重。用于后期的部署。以下是使用前基本的了解与熟悉过程记录,非教程。
tips:不管是前期配置pytorch环境,还是之后down yolo本体或pt文件,都最好备着个代理,不然真是会被网速折磨的够呛。
目录
官方例程运行:
yolov5s.pt权重
使用了了官方的yolov5s.pt权重,可以识别80类物品:
‘person’,‘bicycle’,‘car’,‘motorcycle’, ‘airplane’,‘bus’,‘train’, ‘truck’,‘boat’……
运行起来,看着还不错,蛮有意思的。不过整体置信率都不高。
yolov5m.pt权重
换成了更大的yolov5m.pt,卡顿了不少,置信率整体上高了一些。连把书识别成laptop都更自信了。
实时识别效果gif
玩起来确实很有趣,不过要开始干正事了。
项目结构:
一个不错的详解学习文章:
文件结构解释
通过此博客,基本了解yolov5项目结构,知道大体上文件及文件夹作用,知道首先需要注意哪几个文件及文件夹。下图显示了我们初学者主要需要关注的文件或文件夹:
tips:听到某个人说数据集本体最好放在根目录下,不要放在data文件夹下。
文件结构基本清楚了,继续下一步吧。源码阅读的学习也是根据此人的博客。
源码阅读:
由于源码中存在注释,在记录中只分隔标记代码段用处,不再额外引用代码。
Detect.py:
基本配置:
- 首先导入包,不必多提
- 获取文件路径,将当前.py文件所在项目文件夹添加到python环境中,使得其可以调用同一个文件夹下的其他模块。
- 加载自定义模块中的类,由于有第2步,所以这一步可以导入。
执行main函数:
在命令行中中进入对用根目录,输入:>python detect.py --source 0,即可运行detect.py去采集摄像头视频帧进行识别并输出结果。
detect.py最后,
if name == “main”:
opt = parse_opt() # 接收命令行传来的参数到opt中
main(opt) # 用opt参数去执行主函数
if行只有命令行调用时执行,与作为模块调用执行相比,多了个接受命令行参数的步骤。
设置opt参数:
这段代码是一个 Python 脚本中的一个函数,用于解析命令行参数并返回这些参数的值。
- –data:yolov5官方模板指向data/coco128.yaml文件。此yaml文件包括coco128数据集路径;该路径下的train、val以及test集的划分路径。还有coco128数据集的标签总数类别。还有数据集下载url 。有人说可以不用管。
- –weights: 训练的权重路径,可以使用自己训练的权重,也可以使用官网提供的权重。默认官网的权重yolov5s.pt(yolov5n.pt/yolov5s.pt/yolov5m.pt/yolov5l.pt/yolov5x.pt/区别在于网络的宽度和深度以此增加)
- –source: 测试数据,可以是图片/视频路径,也可以是’0’(电脑自带摄像头),也可以是rtsp等视频流, 默认data/images
- –imgsz: 预测时网络输入图片的尺寸,默认值为 [640]
- –conf-thres: 置信度阈值,默认为 0.50
- ……
执行run函数:
- 载入参数。
- 初始化配置。这段代码主要用于处理输入来源。定义了一些布尔值区分输入是图片、视频、网络流还是摄像头。
- 保存结果。这段代码主要是用于创建保存输出结果的目录。创建一个新的文件夹exp(在runs文件夹下)来保存运行的结果。
- 加载模型。这段代码主要是用于选择设备、初始化模型和检查图像大小。
- 加载数据。这段代码是根据输入的 source 参数来判断是否是通过 webcam 摄像头捕捉视频流。
- 推理部分
热身部分,对每张图片/视频进行前向推理,NMS除去多余的框(这段代码是执行非最大值抑制(NMS)的步骤,用于筛选预测结果,预测过程(这段代码使用了一个循环来遍历检测结果列表中的每个物体,并对每个物体进行处理),打印目标检测结果,在窗口中实时查看检测结果,设置保存结果 - 在终端里打印出运行的结果
Train.py:
导包和基本配置,分布式训练初始化(如果具有多GPU)。大体同detect.py。
undefined 执行main()函数:
检查分布式训练环境。
判断是否断点续训。
判断是否分布式训练。
判断是否进化训练。
设置opt参数。
执行train()函数:
加载参数和初始化配置信息。
加载网络模型。
加载数据集。
训练过程。
打印消息释放缓存。
执行run()函数。
类似于命令行支持函数,可以使得别的模块导入train.py后,通过run调用执行训练过程。
有一说一,train.py的阅读过程极其艰难与痛苦,大部分的原因还是积累缺失导致的各类专有名词与python基础代码实现的不认识/不熟练,以至于能不能说读完了读完源码都得打个大大的问号。不过,基本的功能对应的代码位置确定了,至于别的更细的,说到底是个水磨工夫,慢慢来吧。
总结:
到目前为止,yolov5的初步使用所需的应该具备了,准备开始尝试训练自己的小玩意吧。