yolov5官网教程&kaggle海星目标检测赛&paddle钢铁缺陷检测赛(V

  最近用了paddledetection和yolov5,感觉差的不是一星半点。还是PyTorch框架好用,暂时不想再碰paddle了。钢铁缺陷检测赛,没注意数据格式问题,最后提交结果折腾了快一天,坑。我这两天用yolov3_spp训练过VOC2012数据集的,本来想直接拿过来用yolov5训练,但是colab挂载device太慢了。复制过来后(在colab主界面直接拖动文件夹,而不是在本ipynb脚本里用cp命令复制,否则复制都很久)yolov5运行时要scan数据集,scan train文件夹要一个小时,太慢了(之前yolov3_spp 在voc数据集用trans_voc2yolo.py转换为coco数据集也是用了两个小时)。实在忍不了,看csdn帖子也抱怨这个,准备tar打包复制到drive外面,但是打包还是慢啊,干脆再下载数据集自己转化一次好了yolov5-github地址在yolov5的《Train Custom Data》教程里,有完整的示例代码,这里简单介绍下。

  detect.py 可以在各种数据集上运行YOLOv5来做推理, 从最新的 YOLOv5 版本 自动下载模型,并将结果保存到 runs/detect,示例如下:

  在这里插入图片描述

  在 COCO val或test-dev 数据集上验证模型的准确性。 模型会从最新的YOLOv5版本自动下载。要按class显示结果,请使用 --verbose 标志。

  Download COCO val 2017 dataset (1GB - 5000 images), and test model accuracy.下载COCO test2017数据集 (7GB - 40,000张图片), 在test-dev上测试模型精度(20,000张图片,无标签). 结果保存为一个*.json文件,这个文件会压缩并提交到https://competitions.codalab.org/competitions/20794 上的评估器。

  在COCO128数据集上用 训练一个yolov5模型, 来使用预训练权重, 或者用来随机初始化权重(不推荐)。

  预训练Models 从最新版本YOLOv5自动下载可自动下载的Datasets 包括: COCO, COCO128, VOC, Argoverse, VisDrone, GlobalWheat, xView, Objects365, SKU-110K.训练结果 保存到,例如, 等。下面会启动tensorboard和ClearML跟踪训练。ClearML安装运行后会连接到一个ClearML服务器,此时会弹出一个窗口,需要用户凭证。点击你自己的开源服务器,按Create new credentials新建项目,然后弹出窗口点击复制信息,复制到刚才弹出的窗口就行。后面还会弹出三个窗口,全部回车确认就行,这样ClearML就启动成功了。ClearML不启动训练会报错,估计可以改配置取消,还没有仔细看。运行显示如下:

  ClearML 完全集成到 YOLOv5 中,以跟踪您的实验、管理数据集版本,甚至远程执行训练运行。启用ClearML运行(使用你自己的开源服务器,或者我们免费托管的服务器):

  您可以使用 ClearML Data 对数据集进行版本控制,然后只需使用其唯一 ID 将其传递给 YOLOv5。这将帮助您跟踪数据,而不会增加额外的麻烦。查看ClearML Tutorial获取详细信息。

  Weights & Biases (W&B) 与 YOLOv5 集成,用于训练运行的实时可视化和云记录。这样可以更好的运行比较和自省,以及提高团队的可见性和协作。 pip install wandb来启用W&B,然后正常训练(首次使用时将指导您进行设置)。

  训练期间可以在https://wandb.ai/home看到实时更新。 并且您可以创建和分享您的详细 Result Reports。更多详情请查看YOLOv5 Weights & Biases Tutorial。

  在这里插入图片描述

  训练结果使用Tensorboard 和CSV 记录器自动记录到, 为每一次新的训练创建一个新的目录,如,等。

  这个目录包括训练和验证统计,mosaics,labels,predictions and mosaics数据增强,以及包括precision-recall (PR)曲线和混淆矩阵这些指标和图表。

  在这里插入图片描述结果文件results.csv在每个epoch后更新,然后results.png在训练完成后绘制为(下图)。您还可以results.csv手动绘制任何文件:

  在这里插入图片描述

  Roboflow 能使你在自己的数据集上轻松地组织,标记,和预处理一个高质量的数据集. Roboflow也能够轻松地建立一个active learning pipeline, 与您的团队协作改进数据集,并使用roboflow pip包直接集成到您的模型构建工作流程中。

  自定义训练示例: How to Train YOLOv5 On a Custom Dataset自定义训练Notebook: Open In Colab

  在这里插入图片描述

  参考我另一篇帖子神洛:Kaggle——海星目标检测比赛参考《飞桨新人赛:钢铁缺陷检测挑战赛-第2名方案》、《『浙大软院夏令营』-钢铁缺陷检测》、《飞桨新人赛:钢铁缺陷检测挑战赛-第3名方案》。比赛地址:https://aistudio.baidu.com/aistudio/competition/detail/114/0/introduction赛题介绍:本次比赛为图像目标识别比赛,要求参赛选手识别出钢铁表面出现缺陷的位置,并给出锚点框的坐标,同时对不同的缺陷进行分类。数据简介:本数据集来自NEU表面缺陷检测数据集,收集了6种典型的热轧带钢表面缺陷,即氧化铁皮压入(RS)、斑块(Pa)、开裂(Cr)、点蚀(PS)、夹杂(In)和划痕(Sc)。下图为六种典型表面缺陷的示例,每幅图像的分辨率为200 * 200像素。训练集图片1400张,测试集图片400张在这里插入图片描述

  提交内容及格式:

  结果文件命名:submission.csv(否则无法成功提交)结果文件格式:.csv(否则无法成功提交)结果文件内容:submission.csv结果文件需包含多行记录,每行包括4个字段,内容示例如下:各字段含义如下:

  image_id(int): 图片idbbox(list[float]): 检测框坐标(XMin, YMin, XMax, YMax)category_id: 缺陷所属类别(int),类别对应字典为:{‘ crazing’:0,’inclusion’:1, ’pitted_surface’:2, ,’scratches’:3,’patches’:4,’rolled-in_scale’:5}confidence(float): 置信度备注: 每一行记录1个检测框,并给出对应的category_id;同张图片中检测到的多个检测框,需分别记录在不同的行内。此时路径为输出文件夹根目录,即新建dataset文件夹,将原训练集图片移动到dataset下,重命名为images原xml标注文件移动到dataset下,重命名为Annotations测试集移动到dataset写入label_list.txt文件,echo -e表示碰到转义符('\n'等)按对应特殊字符处理。(这个是以前VOC数据集用的,可忽略)

  rootpath是Annotations的上一个目录main函数中的list可以从目录读取,也可以从df读取list=df.xml.valueslist=os.listdir(xmlpath)

  voc格式数据集标注框是以表示最终在dataset/labels文件夹下,生成的txt标注文件格式是:,且是归一化之后的结果。(将x_center和标注框宽度w除以图像宽度,将y_center与标注框高度h除以图像高度。这样xywh的值域都是)以下转换代码来自github上的objectDetectionDatasets项目:

  安装完之后路径是working/yolov5

  生成train.txt和val.txt内容为:yaml:names:- crazing- inclusion- pitted_surface- scratches- patches- rolled-in_scalenc: 6path: /kaggle/working/ # dataset的上一级目录,绝对路径train: /kaggle/working/train.txt # train.txt绝对路径,好像也可以用相对路径val: /kaggle/working/val.txttrain.txt是划分好的训练集图片的相对地址(相对于path的地址)生成gbr.yaml,用于训练时指定数据读取输出结果:

  可使用github账号注册wandb,点击右上角自己的头像,下拉菜单中选择settings,在设置页下面可以看到API keys可直接启动wandb,也可以将API keys添加到kaggle的notebook中,这样每次启动wandb时就不用复制API keys了。方法如下:在notebook上方菜单栏Add-ons添加Secrets:(label写WANDB,value就是你的API keys)在这里插入图片描述

  输入以下代码启动wandb:(因为API keys加了入环境里面,所以提示你不要分享代码)

  (实验发现img=256比默认640效果更好)

  这些训练结果都代表啥,可以查看《yolov5 训练结果解析》查看训练结果打开wandb网站,查看试验跟踪结果:点击wandb主页面,选择project下面自己的项目在这里插入图片描述点进去就可以看到下面这张图:(loss result)

  在这里插入图片描述如果在主页点进去某一个runs

  在这里插入图片描述就无法显示上面的图片,只有这个runs的结果,比如metirc:

  在这里插入图片描述

  设定wandb输出文件夹,用于可视化展示查看类别分布:

  在这里插入图片描述

  查看3个bacth的图片:

  在这里插入图片描述

  在这里插入图片描述

  在这里插入图片描述

  真实框和预测框对比:

  在这里插入图片描述可以看到,还是有很多没预测出来,也有一些预测框有偏差的。

  观察发现,数据集明暗程度相差很多,利用直方图均衡化,平衡图像的明暗度。

  移动完后,需要重新写一下gbr.yaml文件

  结果并不好:

  表示20个epoch内模型都没有优化就会停止训练。表示图片会先加载到内存再训练,可以加快训练速度。训练花了一小时,第98个epoch效果最好,提升了一点。

  直接推理提交,结果是score=36(没有用augment)加入验证集,lr=0.1*lr,训练20epoch,每个epoch都保存模型(gbr_all.yaml就是把train.txt换成trainval.txt)第19个epoch效果最好,进行推理,提交后分数37.74。

  修改错误标签标注图片剪裁之后查看,发现有些标签应该是标注错误,在对应的txt文件里修改后训练,效果更差。(不明白为啥还变差了)

  在这里插入图片描述可以明显看到有些标签是错的。

  多尺度训练(设置),结果变差了多尺度训练是指设置几种不同的图片输入尺度,训练时每隔一定iterations随机选取一种尺度训练,能够在一定程度上提高检测模型对物体大小的鲁棒性。启用加权图像策略(),结果也变差了。主要是为了解决样本不平衡问题。开启后会对于上一轮训练效果不好的图片,在下一轮中增加一些权重在100epoch基础上,只训练0和5这两类物体。0和5这两类错误率太高,重新读取标注的txt文件,只选取有0或者5这两类的图片进行训练,且标注的txt文件,去掉它标注框。结果训练不理想,感觉是哪里写错了。《yolov5 --save-txt 生成的txt怎么设置为覆盖而不是追加到txt中》:表示预测结果保存为txt,且保存置信度分数查看推理图片: 最终结果保存在下,每跑一次模型生成一个exp文件夹。我跑了三次,所以结果在,txt文件在

  在这里插入图片描述2. 查看推理结果(txt文件)

  yolo中txt文件的说明:YOLO模型,会直接把每张图片标注的标签信息保存到一个txt文件中。txt信息说明:每个txt是一张图片的预测结果,txt文件中每一行是一个标注框默认只有class(以索引表示)和bbox坐标。bbox坐标格式是yolo格式,即,且被归一化((将x_center和w除以图像宽度,将y_center与h除以图像高度。这样xywh的值域都是))如果设置会在bbox后面保存置信度结果

  需要按照题目要求的格式处理预测结果。

  遍历txt文件,按格式读取到pandas一开始没有注意数据格式问题,怎么保存csv bbox的逗号都没了,折腾了一天填补缺失值,有些图片没检测到,直接用前/后一个数据进行填充转换数据格式定义yolo2voc函数,用于将YOLO格式预测框转为比赛要的VOC格式

  代码来自github上的bbox包,用法可参考《kaggle——海星目标检测比赛》帖子中的3.4章节:生成标注文件将yolov3_spp的数据转换脚本、、都放在my_dataset文件夹下。 (文章最后会直接给出这几个脚本的代码)切换到yolov5项目主路径,运行脚本(注意原脚本里面root路径前面应该加一个点.,即'https://zhuanlan.zhihu.com/p/my_dataset/VOCdevkit')这一步主要是在文件夹下生成yolo格式数据集()以及标签文件注意,这一步需要文件夹下的(label标签对应json文件)生成的my_data_label.names标签文件格式如下:(如果没有该文件,可以自己手动编辑一个txt文档,然后重命名为.names格式即可)使用calculate_dataset.py脚本生成my_train_data.txt文件、my_val_data.txt文件以及my_data.data文件,这里不需要并生成新的my_yolov3.cfg文件,相关代码注释掉就行执行脚本前,需要根据自己的路径修改相关参数生成的文件都在yolov5/my_dataset/my_yolo_dataset下复制data下coco.yaml文件,重命名为myvoc2coco.yaml,打开修改路径和names

  /myvoc2coco.yaml 修改如下:

  将类别数nc=80改为20

  上面两个修改之后,运行时还是会报错。还是说模型中设定的分类类别与你自己在.yaml文件中配置的nc数值不匹配(明明yaml文件已经改了)

  修改train.py,拉到下面

  weights:初始化模型权重文件是yolov5s.ptcfg:配置文件是默认为空,但看其help是help='model.yaml path'说明其是指向模型的.yaml文件的。所以这里改为'models/yolov5s.yaml' data:是指数据的一些路径,类别个数和类别名称等设置,如coco128.yamlhyp:是一些超参数的设置,如果你清楚的话,可以改动。epochs:是训练的轮数,默认是300轮。batch-size:每一批数据的多少,如果你的显存小,就将这个数值设置的小一点。报错 以及

  运行以下代码就行

  下面就可以开始愉快的训练啦。之前yolov3_spp训练3个epoch是30min左右,yolov5这次花了13min,快了一倍。(不知道跟colab有没有关系,官方说colab每次分配的GPU会不一样)

  下面给的都是yolov3_spp原版的转换脚本。要是按我上面用yolov5运行,跟上面说的一样改路径就行。:

  原版脚本:

  原版脚本:

  本文使用 Zhihu On VSCode 创作并发布