学习笔记-YOLOV5目标检测初步了解记录
吐槽:无奈,好好的 markdown文本一到b站,啥排版都没了,只能手动再调整。也不知道以后会不会支持md格式。似乎有人开发了转换插件,也不知好不好用。到底还是对口的网站更对口些。
大体上对yolov5模型有了初步了解。模型是类似于应用程序的模板,程序员拿过来改一改就能弄出自己需求功能应用。上手只需要修改需要的几个参数或位置,即可拿来跑出自己的模型权重,来用于后期的部署。以下是使用yolov5前基本的了解与熟悉过程的记录,非教程。
tips:不管是前期配置pytorch环境,还是之后git yolo本体或pt文件,都最好备着个代理,不然真是会被网速折磨的够呛。
官方例程运行:
detect.py使用yolov5s.pt权重:
使用了了官方的yolov5s.pt权重,可以识别80类物品:
'person','bicycle','car','motorcycle', 'airplane','bus','train', 'truck','boat', 'traffic light'……
运行起来,看着还不错,蛮有意思的。不过整体置信率都不高。


yolov5m.pt权重:
换成了更大的yolov5m.pt,卡顿了不少,置信率整体上高了一些。连把书识别成laptop都更自信了。


实时识别效果:

train.py使用yolov5s.pt训练

数据集为coco128,虽然只有128张图,但也只浅浅地跑了5轮。毕竟我的小笔记本只是1660ti,还是不要为难它了。得到了best.pt。
使用best.pt效果

乍一看其实也还可以,就是为我们的实验室新添了个TV。
好了,玩了好一阵,确实很有趣,不过接下来要开始干正事了。

项目结构:基本完成
要学习一个项目,项目结构是必须先了解的。一个不错的详解学习文章:
https://blog.csdn.net/weixin_43334693/article/details/129356033
通过此博客,基本了解yolov5项目结构,知道大体上文件及文件夹作用,知道首先需要注意哪几个文件及文件夹。下图显示了我们初学者主要需要关注的文件或文件夹:

tips:听到某个人说数据集本体最好放在根目录下,不要放在data文件夹下。
文件结构基本清楚了,继续下一步吧。读源码,也是根据此人的博客。

源码阅读:
由于源码中存在注释,在记录中只标记代码段功能,不再额外引用代码。有一说一,看代码确实是个令人头秃的活计。
detect.py:基本完成
https://blog.csdn.net/weixin_43334693/article/details/129349094
基本配置:
首先导入包,不必多提
获取文件路径,将当前.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:存疑/未完成
https://blog.csdn.net/weixin_43334693/article/details/129460666
导包和基本配置,分布式训练初始化(如果具有多GPU)。大体同detect.py。
执行main()函数:
检查分布式训练环境。
判断是否断点续训。
判断是否分布式训练。
判断是否进化训练。设置opt参数。
执行train()函数:
加载参数和初始化配置信息。
加载网络模型。
加载数据集。
训练过程。
打印消息释放缓存。执行run()函数。类似于命令行支持函数,可以使得别的模块导入train.py后,通过run调用执行训练过程。
有一说一,train.py的阅读过程极其艰难与痛苦,大部分的原因还是长期积累缺失导致的各类专有名词与python基础代码实现的不认识/不熟练,以至于能不能说读完了读完源码都得打个大大的问号。不过,基本的功能对应的代码位置确定了,至于别的更细的,说到底是个水磨工夫,慢慢来吧。

总结:
到目前为止,yolov5的初步使用所需的应该具备了,准备开始尝试训练自己的小玩意吧。